어떤 시간 복잡도 분석 표기법을 사용해야하는지 어떻게 알 수 있습니까?


90

대부분의 입문 알고리즘 클래스에는 (Big O) 및 와 같은 표기법 이 도입되며 일반적으로 학생은이 중 하나를 사용하여 시간 복잡성을 찾는 방법을 배웁니다.ΘOΘ

그러나 , 및 와 같은 다른 표기법이 있습니다 . 한 표기법이 다른 표기법보다 선호되는 특정 시나리오가 있습니까?Ω ωoΩω


2
그 순전히 바람직 으로 적용 ...
vzn

답변:


76

Landau 표기법을 참조하고 있습니다. 그것들은 같은 것에 대한 다른 상징은 아니지만 완전히 다른 의미를 가지고 있습니다. 어느 것이 "바람직한 지"는 전적으로 원하는 진술에 달려 있습니다.

것을 의미 f는 같은 최대 빠른 성장 g 일정한 인자에 점근 최대; 그것을 로 생각하십시오. f o ( g ) 는보다 엄격한 형식입니다 (예 : <) .fO(g)fgfo(g)<

대칭 의미를 갖는다 : F는 적어도 빨리 성장 g . ω 는 더 엄격한 사촌입니다. 해당 볼 수 f를 Ω ( g ) 에 상당 g의 ∈의 O ( F ) .fΩ(g)fgωfΩ(g)gO(f)

것을 의미 f는 약 빠른 성장 g ; 공식적 F O ( g ) Ω ( g ) . f g (점근 적 평등)이 더 강한 형태입니다. O 를 사용할 때종종 Θ를 의미합니다.fΘ(g)fgfO(g)Ω(g)fgΘO

와 그 형제가 함수 클래스 인 방법에 주목하십시오 . 그들과 함께 "산술"을 할 때 이것에 대한 정확한 정의 (누가 말하고 있는지에 따라 다를 수 있음)를 잘 알고 있어야합니다.O(g)

사물을 증명할 때는 정확한 정의로 작업하도록주의하십시오. Landau 기호에 대한 많은 정의가 있습니다 (모두 동일한 직관력을 가짐). 일부는 함수의 일부 세트와 동일하지만 다른 함수는 아닙니다.

제안 된 독서 :

Landau 표기법을 엄격하고 건전한 방식으로 사용하려면 Rutanen et al.의 최근 연구에 관심이있을 수 있습니다. [1]. 그것들은 알고리즘에서 사용할 때 점근 적 표기법에 필요한 충분하고 충분한 기준을 공식화하고, 공통 정의가이를 충족시키지 못하고 (실제로) 실행 가능한 정의를 제공함을 보여줍니다.


  1. K. Rutanen 등의 알고리즘 분석위한 O- 표기법의 일반적인 정의 . (2015)

5
나는 처럼 행동 하고 Ω 처럼 행동 하지만 차이가 있음을 지적하고 싶습니다 . 기능 찾는 것은 어렵지 않다 gF가 되도록 F O ( g )F Ω ( g ) . OΩgffO(g)fΩ(g)
Zach Langley

1
함수 클래스에 대해서는 +1입니다. 같은 물건 Ω ( 2 , n은 ) 처음으로 이러한 표기법에 직면 사람들에게 혼동을 줄 수 논문과 책, 곳곳에 나타납니다. o(1)Ω(2n)
Janoma

7
@ZachLangley 당신이 말하는 것은 매우 사실입니다. 여기에 총 주문이 없습니다. 아마 키우는 것은 위험 하지만, 직관을 세우는 데 도움이된다고 생각합니다.
Raphael

42

빅 O : 상한

"Big O"( )가 가장 일반적입니다. 알고리즘의 복잡성을 분석 할 때 대부분 중요한 것은 입력 크기가 커질 때 실행 시간 ¹이 얼마나 빨리 증가하는지에 대한 상한을 갖는 것입니다. 기본적으로 알고리즘을 실행하는 데 "너무 오래 걸리지 않을 것"을 알고 싶습니다. 우리는 이것을 정확한 시간 단위 (초)로 표현할 수 없습니다. 정확한 구현 (프로그램 작성 방법, 컴파일러의 우수성, 머신의 프로세서 속도 등)에 달려 있기 때문입니다. 따라서 우리는 그러한 세부 사항에 의존하지 않는 것을 평가합니다. 이는 더 큰 입력을 공급할 때 알고리즘을 실행하는 데 걸리는 시간입니다. 우리는 주로 프로그램이 끝났음을 확신 할 수 있기 때문에 보통 시간이 걸리는 시간을 알고 싶어합니다.O

이 알고리즘의 실행 시간을 갖는 것은 말할 의 입력에 대한 사이즈 N은 어떤 정수가 존재한다는 것을 의미 K를 알고리즘은 기껏에서 완료되도록 KO(f(n))nK 단계, 즉 알고리즘의 실행 시간은최대 f (최대 스케일링 계수)만큼 빠르게 증가합니다. 주목 T ( N ) 입력 크기에 대한 알고리즘의 실행시 , N을 , O는 ( N ) 비공식적 즉, T ( N ) ≤의 F ( N ) 몇몇 스케일링 팩터로 업.Kf(n)fT(n)nO(n)T(n)f(n)

하한

때로는 상한보다 더 많은 정보를 갖는 것이 유용합니다. O 의 반대입니다 . 함수가 다른 함수만큼 빨리 자라는 것을 나타냅니다. T ( N ) = Ω ( g ( N은 ) ) 을 의미 T ( N ) K ' g ( N ) 일부 상수 K는 ' 또는 비공식적 넣어 T ( N ) ≥의 g ( N를 ) 몇몇 스케일링까지 인자.ΩOT(n)=Ω(g(n))T(N)Kg(n)KT(n)g(n)

알고리즘의 실행 시간을 정확하게 결정할 수있을 때 OΩ을 결합합니다 . 이는 스케일링 계수까지 함수의 성장률이 알려져 있음을 나타냅니다. T ( N ) = Θ는 ( H는 ( N ) ) 즉, K의 H ( N ) T ( N ) K ' H ( N ) 일부 상수 KK가 ' . 비공식적으로 말하면, T (ΘOΩT(n)=Θ(h(n))Kh(n)T(n)Kh(n)KK 까지 일부 스케일링 계수.T(n)h(n)

추가 고려 사항

“작은” ω 는 복잡도 분석에서 훨씬 덜 자주 사용됩니다. 작은 o 는 큰 O 보다 강하다 . 여기서 O 는 더 빠르지 않은 성장을 나타내며 o 는 성장이 엄격히 느리다는 것을 나타냅니다. 반대로, ω 는 엄청나게 빠른 성장을 나타냅니다.oωoOOoω

위의 토론에서 약간 비공식적이었습니다. Wikipedia 에는 형식적인 정의와보다 수학적 접근 방식이 있습니다.

등에서 등호를 사용 하는 것은 잘못된 것입니다. 엄밀히 말하면, O ( F ( N은 ) ) 변수의 함수의 집합이고 , N , 우리가 작성해야하는 T O ( F ) .T(n)=O(f(n))O(f(n))nTO(f)

예 : 일부 정렬 알고리즘

이것은 다소 건조하기 때문에 예를 들어 보겠습니다. 대부분의 정렬 알고리즘은 2 차 최악의 경우 런타임을 갖습니다. 즉 , 크기 의 입력 에 대해 알고리즘의 실행 시간은 O ( n 2 ) 입니다. 예를 들어, 선택 정렬 갖는다 O를 ( N 2 ) 선택 용 런타임 때문에, K 번째 요소 것이 필요 없음 - 케이 총, 비교를 N ( N - 1 ) / 2 비교. 사실, 비교의 수는 항상 정확하게 N ( N -nO(n2)O(n2)knkn(n1)/2 , n 2 로 자랍니다. 따라서 선택 정렬의 시간 복잡도에 대해 더 정확할 수 있습니다. 그것은 Θ ( n 2 ) 입니다.n(n1)/2n2Θ(n2)

이제 병합 정렬을 수행하십시오 . 병합 정렬도 2 차 ( )입니다. 이것은 사실이지만 매우 정확하지는 않습니다. 실제로 병합 정렬의 실행 시간은 O ( n입니다.O(n2) 최악의 경우이다. 선택 정렬과 마찬가지로 병합 정렬의 작업 흐름은 기본적으로 입력 모양과 무관하며 실행 시간은 항상 n입니다.O(nlg(n))상수 곱셈 계수까지 l g ( n ) , 즉 Θ ( nnlg(n) .Θ(nlg(n))

다음으로 quicksort를 고려하십시오 . 퀵 정렬은 더 복잡합니다. 확실히 입니다. 또한, 퀵 정렬의 최악의 경우는 2 차입니다. 최악의 경우Θ ( n 2 ) 입니다. 그러나 퀵 정렬의 가장 좋은 경우 (입력이 이미 정렬 된 경우)는 선형입니다. 퀵 정렬에 대한 하한에 대해 일반적으로 말할 수있는 최선은 Ω ( n ) 입니다. 여기서 증명을 반복하지는 않지만 quicksort 의 평균 복잡도 (입력의 가능한 모든 순열에 대한 평균)는 Θ ( nO(n2)Θ(n2)Ω(n) .Θ(nlg(n))

공통 설정에서 정렬 알고리즘의 복잡성에 대한 일반적인 결과가 있습니다. 정렬 알고리즘이 한 번에 두 요소 만 비교할 수 있으며 결과는 예 또는 아니오 ( 또는 x > y )로 가정합니다. 그러면 알고리즘이 모든 요소를 ​​한 번 이상 비교하여 어느 위치에 적합한 지 알아야하기 때문에 정렬 알고리즘의 실행 시간은 항상 Ω ( n ) (여기서 n 은 정렬 할 요소의 수임 ) 임이 분명합니다 . 예를 들어 입력이 이미 정렬되어 있고 알고리즘이 각 요소를 다음 요소와 비교하고 순서대로 유지하는 경우 (예 : n - 1) 이 하한을 충족 할 수 있습니다.xyx>yΩ(n)nn1비교). 덜 분명한 것은 최대 작동 시간이 반드시 . 알고리즘이 때때로 비교를 적게 할 수도 있지만,입력 크기 n 에 대해 알고리즘이 K n l g ( n ) 이상의 비교를 수행하는 입력이 하나 이상있도록 일정한 K 가 있어야합니다. 증명의 아이디어는 알고리즘의 의사 결정 트리를 작성하는 것입니다. 즉, 각 비교 결과에서 알고리즘이 내린 결정을 따릅니다. 각 비교는 예 또는 아니오 결과를 반환하므로 의사 결정 트리는 이진 트리입니다. n 이 있습니다 !Ω(nlg(n))KnKnlg(n)n!입력의 가능한 순열과 알고리즘은 모두를 구별해야하므로 의사 결정 트리의 크기는 . 트리는 이진 트리이므로 깊이 Θ ( l g ( n ! ) ) = Θ ( nn! 모든 노드에 맞게. 깊이는 알고리즘이 결정하는 최대 결정 수이므로 알고리즘을 실행하는 데는 최소한이 많은 비교가 필요합니다. 최대 실행 시간은 Ω ( nΘ(lg(n!))=Θ(nlg(n)) .Ω(nlg(n))

¹ 또는 메모리 공간과 같은 기타 리소스 소비. 이 답변에서 나는 달리기 시간 만 고려합니다.


1
"그러나 퀵 정렬의 가장 좋은 경우 (입력이 이미 정렬 된 경우)는 선형입니다"이것은 최악의 경우입니다!
user5507

@ user5507 : 실제로 피벗 전략에 따라 다릅니다. 첫 번째 (또는 마지막) 요소가 피벗으로 선택되면 맞습니다. 그러나 중간 요소 또는 첫 번째, 중간, 마지막 중앙값을 선택하면 정렬 된 입력이 가장 좋습니다.
chirlu

"작은 o와 ω는 복잡도 분석에서 훨씬 덜 자주 사용됩니다." 이것은 공간 복잡성 분석에서는 사실이 아닙니다. 시간 복잡도 분석에서는 일반적으로 특정 작업 (비교, 디스크 탐색, 캐시 누락, 가지고있는 것)을 계산할 때 o와 ω를 사용합니다. 그러나 항상 더 빠른 컴퓨터를 기다렸다가 구입할 수 있기 때문에 "벽 시간"은 항상 "일정한 요소"이므로 big-O가 훨씬 일반적입니다. 공간 분석에서 정보 이론으로 인해 종종 하한이 너무 높기 때문에 "f (n) + o (f (n)) 비트"로보고되는 크기를 보는 것이 일반적입니다. 여기서 f (n)은 하한입니다.
가명

내가 생각하는 동안 : f (n)이 일부 데이터 구조의 크기에 대한 이론적 인 하한 인 경우 f (n) + O (1) (일정한 오버 헤드)를 사용하는 것을 "암시 적"이라고합니다. f (n) + O (f (n)) (상대적 상대적 오버 헤드)를 "소형"이라고하고 f (n) + o (f (n)) (상대적 오버 헤드는 결국 중요하지 않음)를 사용하는 것을 "간결"이라고합니다. ". 그 공간에서 일해야하는지 알아야 할 좋은 용어입니다.
가명

17

일반적으로 는 상한 (위에서 추정)을 나타내는 데 사용되는 반면, Ω 은 하한 (아래에서 추정)을 나타내는 데 사용되며 , Θ 는 일치 할 때 사용됩니다.이 경우 대신 Θ 를 사용할 수 있습니다. 그것들은 (보통) 결과를 진술합니다.OΩΘΘ


3
"일반적으로"? 그들은 다른 것을 위해 사용될 수 있습니까?
svick

1
P=DTime(nO(1))f=O(g)f

4
P=DTime(nO(1))P=DTime(nΘ(1))

@ Jeff, 나는 그것을 함수 집합 간의 평등으로 생각하지만, 당신은 맞습니다. 더 일반적인 의미에서 상한으로 생각할 수도 있습니다.
Kaveh

PDTIME(nΘ(1))DTIME(Θ(nlogn))P . DTIME(Θ(nlogn))DTIME(nΘ(1))=
David Richerby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.