시간 복잡도 알고리즘 의 특징은 무엇입니까 ?


19

때로는 알고리즘을 신중하게 검사하면서 시간의 복잡성을 쉽게 식별 할 수 있습니다. 두 개의 중첩 루프가있는 알고리즘 N은 분명히 N2 입니다. 두 값 의 N 그룹의 가능한 모든 조합을 탐색하는 알고리즘 은 분명히 2N 입니다.

그러나 나는 Θ(NlogN) 복잡성을 가진 알고리즘을 "스팟"하는 방법을 모른다 . 예를 들어 재귀 병합 병합 구현은 하나입니다. mergesort 또는 다른 Θ(NlogN) 알고리즘 의 일반적인 특징은 무엇입니까 ?

알고리즘이 Θ(NlogN) 복잡 할 수있는 방법이 두 가지 이상 있다고 확신 하므로 모든 대답을 높이 평가합니다. BTW 엄격한 증거가 아닌 일반적인 특성과 팁을 찾고 있습니다.


6
은 트리를 의미합니다. O(logn)
Pratik Deoghare


2
@PratikDeoghare : 반드시 그런 것은 아닙니다.
Raphael

3
@Raphael 나는 주로 의미했다! :)
Pratik Deoghare

답변:


17

전형적인 는 작업을 선형 시간 으로 나누고 조각으로 반복 하는 분할 및 정복 알고리즘 입니다. 병합 정렬은 다음과 같은 방식으로 작동합니다. 입력을 두 개의 대략 같은 조각으로 나누는 데 O ( n ) 시간을 소비하고, 각 조각을 재귀 적으로 정렬하고 , 두 개의 정렬 된 반쪽을 결합하는 데 Θ ( n ) 시간을 소비 합니다.Θ(nlogn)O(n)Θ(n)

직관적으로, 분할 및 정복 아이디어를 계속하면 분할에 걸리는 시간이 선형이기 때문에 분할 할 조각의 수가 증가하면 조각의 크기가 줄어드는 것과 정확히 일치하기 때문에 각 분할 단계는 총 선형 시간이 걸립니다. 총 실행 시간은 분할 단계의 총 비용에 분할 단계 수를 곱한 값입니다. 조각의 크기가 매번 반으로 줄어들 기 때문에 나누기 단계가 있으므로 총 실행 시간은 n log ( n ) 입니다. (승수 상수까지는 로그의 밑이 중요하지 않습니다.)log2(n)nlog(n)

그것을 방정식 ()에 넣으면, 그러한 알고리즘 의 실행 시간 을 추정하는 한 가지 방법 은 그것을 재귀 적으로 표현하는 것입니다 : T ( n ) = 2 T ( n / 2 ) + Θ ( n ) . 이 알고리즘은 선형 시간보다 많은 시간이 걸리며 n : T ( n ) 로 나눠서 더 많은 것을 볼 수 있습니다 . T(n)T(n)=2T(n/2)+Θ(n)nN배로,T(N)/N일정한 양만큼 증가 :T(N)/N이 증가 대수, 또는 환언하면,T(N)=Θ(N로그N).

()=(/2)/2+Θ(1)
()/T(n)/nT(n)=Θ(nlogn)

이것은보다 일반적인 패턴 인 마스터 정리 입니다. 어떤 재귀 알고리즘이 분할 크기의 입력 으로 크기의 조각 N / B 및 시간 소요 F ( N ) 분할 및 재결합, 실행 시간을 만족 수행 T ( N을 ) = T를 ( N / B ) + f ( n ) . 의 값에 따라 닫힌 형상이 리드 및 B 및 형상nan/bf(n)T(n)=aT(n/b)+f(n)ab . 만약 = B F ( N ) = Θ ( N ) , 그 마스터 정리 상태 T ( N ) = Θ는 ( N 로그 N ) .fa=bf(n)=Θ(n)T(n)=Θ(nlogn)


1
요약하면 : 한 번에 검색 공간의 일정한 비율을 제거하는 알고리즘은 로그 항을 나타냅니다. 다른 요소는 수행을 수행하는 데 걸리는 시간에 따라 다릅니다.
Raphael

1
예 : quicksort 평균 사례 O(nlogn)
vzn

11

시간 이 걸리는 두 가지 다른 범주의 알고리즘 :Θ(nlogn)

각 항목이 차례로 처리되는 알고리즘이며 각 항목을 처리하는 데 로그 시간이 걸립니다 (예 : HeapSort 또는 많은 평면 스윕 계산 기하학 알고리즘).

실행 시간이 분류 전처리 단계에 의해 지배되는 알고리즘. 예를 들어 최소 스패닝 트리에 대한 Kruskal의 알고리즘에서 첫 번째 단계로 가장자리를 무게별로 정렬 할 수 있습니다.


nn

@Raphael 나는 정렬이 이미 주어진 실행 시간 범주와 중복됨을 알고 있습니다. 요점은 정렬은 때때로 "병목 현상"이며 정렬이 필요하기 때문에 처음에는 정렬에 관한 질문이 정렬에 관한 알고리즘이 런타임을 가질 수 있다는 알고리즘입니다.
Joe

9

Θ(nlogn)Θ(nlogn)

이러한 알고리즘의 세부 사항은 종종 분할 및 정복 기법을 사용하지만 반드시 그럴 필요는 없습니다. 런타임은 근본적으로 묻는 질문에서 비롯되므로 별도로 언급 할 가치가 있다고 생각합니다.

이것은 확장 이진 검색 트리를 기반으로하는 데이터 구조에서 발생하며, 각 노드는 해당 노드의 하위 트리에서 리프를 검색하기 위해 선형 크기 데이터 구조를 저장합니다. 이러한 데이터 구조는 종종 기하학적 범위 검색에서 나타나며 종종 분해 체계를 . Agarwal 's Survey를 참조하십시오 .

O(nlogn)O(logn)


예를 들어 체를 사용하여 n 번째 소수를 찾는 것이 있습니다. 왜냐하면 크기의 체가 필요하기 때문입니다. θ(영형).
gnasher729

6

의 복잡성 영형(로그) 입력을 나누는 분할 및 정복 알고리즘에서 발생합니다. 케이 시간이 거의 같은 크기의 조각 영형(),이 조각들을 재귀 적으로 조작 한 다음, 제 시간에 결합 영형(). 일부만 조작하면 실행 시간이 줄어 듭니다.영형().


5

이들은 일반적으로 "분할 및 정복"다양성의 알고리즘이며, 하위 솔루션을 나누고 결합하는 비용이 "너무 크지"않습니다. 한 번 봐 가지고 이 질문을 재발의 종류가이 동작을 야기 할 것을 확인합니다.


3

일반적으로 Divide-and-conquer 알고리즘은 O (N log N) 복잡도를 생성합니다.


-1

(A)의 일반적인 예 루프 ( 하지 알고리즘 자체)에서 실행영형(로그) 다음과 같습니다.

for (i = 0; i < constant; i++){
    for(j = 0; j < n; j++){
        // Do some O(1) stuff on the input
    }
}

// Alternative Variant:
for (i = 0; i < constant; i++){
    for(j = n; j < constant; j++){
        // Do some O(1) stuff on the input
    }
}

(이 중첩 루프는 그렇지 않습니다. 영형(2). 또한 나누고 정복하거나 재귀하지 않습니다.)

이 루프를 사용하는 알고리즘의 구체적인 예를 제시 할 수는 없지만 사용자 정의 알고리즘을 코딩 할 때 자주 발생합니다.


예, 둘 다입니다 영형(로그)그러나 사소한 이유로 바운드가 빡빡하지 않습니다. 첫 번째는Θ() 두 번째는 Θ(1) (또는 Θ(||) 만약 부정적 일 수 있음).
David Richerby

실제로 언급 되기는하지만 "영형(로그)"는 주로 병합 정렬과 같은"분할 및 정복 "예제입니다.
Nicolas Miari

또한 원래 질문은 빅 세타를 요구하지 않았습니다.
Nicolas Miari

1
물론 있지만, 어떤 선형 또는 일정 시간에 실행이라고 알고리즘영형(로그)뿐만 아니라 영형(22)영형(거의 다른 것). 답은 로그와 아무 관련이 없습니다. 질문이 제기되어야 할 점을 밝히고 싶다면Θ(로그) 오히려 영형(로그)그런 다음 그 점을 질문에 대한 주석으로 명시 적으로 만들거나 더 나은 방법으로 질문을 편집하십시오.
David Richerby

실제로 인터넷을 검색 한다는 점을 알고 싶었 습니다.영형(로그) 내 대답에 루프가 있는지 확인하기 위해 실행 해야하는 실제 프로그래밍 문제에 대한 실제 답을 찾아야했습니다. 영형(로그)실제로 영형(로그)또는 아닙니다. 그리고 대부분의 정보는 분할 및 정복 알고리즘을 다루므로 언급 할 가치가 있습니다. 나는 답이 전형적인 것으로 가장하지 않는다영형(로그)연산.
Nicolas Miari
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.