Randomized Quicksort가 O (n log n)의 최악의 런타임 비용을 갖는 이유


18

무작위 빠른 정렬 은 피벗 요소가 임의로 선택되는 빠른 정렬의 확장입니다. 이 알고리즘의 최악의 시간 복잡도는 무엇입니까? 나에 따르면, 임의로 선택된 피벗이 정렬 되거나 역 정렬 된 순서 로 선택되면 최악의 경우가 발생하기 때문에 영형(2) 이어야합니다 . 그러나 일부 텍스트에서 [1] [2] 최악의 시간 복잡도는 O ( n log n ) 로 기록됩니다영형(로그)

맞습니까?


3
이 "일부 텍스트"를 말해야합니다. 거기에 숨겨진 것이 있습니다. 이 "텍스트"를 다시 읽으면 알 수 있습니다
AJed

참고 : 링크 [1]이 종료되었습니다. 링크 [2]는 알고리즘이 랜덤 화되어 있음을 분명히 나타내므로 모든 입력에 대해 "런타임"이 아니라 "예상 런타임"이 있습니다. 그리고 최악의 입력에 대한 예상 런타임은 O (n log n)입니다.
gnasher729

답변:


18

두 소스 모두 의 "최악의 예상 실행 시간"을 나타 냅니다. 나는 이것이 예상되는 시간 요구 사항과 관련이 있다고 생각합니다. 이는 절대 최악의 경우와 다릅니다.O(nlogn).

Quicksort는 일반적으로 절대 최악의 시간 요구 사항이 입니다. 최악의 경우는 모든 단계에서 분할 프로 시저가 n- 길이 배열을 1n - 1 의 배열로 분할 할 때 발생합니다 . 피벗 요소의이 "불운"선택이 필요 O ( N ) A를 선도, 재귀 호출을 O ( N 2 ) 최악의 경우.O(n2)n1n1O(n)영형(2)

정렬하기 전에 피벗을 임의로 또는 무작위로 섞으면 피벗을 선택하면 최악의 경우, 특히 큰 배열의 경우 매우 드물게 렌더링됩니다. 예상 시간 요구 사항이 O ( n log n ) 임을 증명하려면 Wikipedia 를 참조하십시오 . 다른 소식통 에 따르면 "컴퓨터에서 큰 배열을 정렬 할 때 퀵 정렬에서 2 차 비교를 사용할 확률은 컴퓨터가 번개에 맞을 확률보다 훨씬 적습니다."영형(로그)

편집하다:

Bangye의 의견에 따르면 항상 중간 요소를 피벗으로 선택하여 최악의 피벗 선택 순서를 제거 할 수 있습니다. 중간을 찾는 것이 필요하기 때문에 시간이 준다 Θ를 ( N 로그 N ) 최악의 성능을 제공합니다. 그러나 무작위 퀵소트가 최악의 경우 우연히 발견 될 가능성이 거의 없기 때문에 퀵소트의 결정적 중앙값 찾기 변형은 거의 사용되지 않습니다.영형()Θ(로그)


그래서 일반적으로 우리는 최악의 경우 이차적으로 동작한다고 말할 수 있습니다
Atinesh

@Atinesh 아니오, 적어도 를 의미한다면 . Θ
Raphael

무작위 퀵소트의 최악의 성능이 라고 말하는 것이 맞다고 생각합니다 . 영형(2).
James Evans

4
Quicksort는 선형 시간 알고리즘을 사용하여 중앙값을 피벗으로 찾는 경우 최악의 경우 시간 만 소요될 수 있습니다 . 물론, 무작위 퀵 정렬은 일반적으로 더 나은 실제 성능을 가지고 있습니다. Θ(nlogn)
Bangye

6

이 텍스트가 "가장 최악의 런타임"이 아니라 "가장 최악의 예상 런타임 "에 관한 내용이 누락되었습니다 .

그들은 임의의 요소를 포함하는 Quicksort 구현을 논의하고 있습니다. 일반적으로 결정 론적 알고리즘이 있습니다. 즉, 주어진 입력에 대해 항상 동일한 단계를 생성하는 알고리즘입니다. "가장 최악의 런타임"을 결정하기 위해 가능한 모든 입력을 검사하고 최악의 런타임을 생성하는 입력을 선택합니다.

그러나 여기에는 임의의 요소가 있습니다. 입력이 주어지면 알고리즘에 임의의 무작위성이 포함되므로 항상 동일한 단계를 수행하지는 않습니다. 각 고정 입력에 대해 런타임을 갖는 대신 "예상 런타임"이 있습니다. 우리는 가능한 임의의 의사 결정 값과 확률을 확인하며 "예상 런타임"은 임의의 결정의 각 조합에 대한 런타임의 가중 평균입니다 이지만 여전히 고정 입력입니다.

따라서 가능한 각 입력에 대해 "예상 런타임"을 계산하고 "최악의 경우 예상 런타임"을 얻기 위해 예상 런타임이 최악 인 경우 가능한 하나의 입력을 찾습니다. 그리고 그들은 "예상 런타임"에 대한 최악의 경우가 단지 O (n log n)임을 보여 주었다. 무작위로 첫 번째 피벗을 선택하는 것이 최악의 경우 예상 런타임을 o (n ^ 2) (Big O 대신 little o)로 변경하면 n 개의 피벗 중 몇 개만 최악의 경우로 이어지기 때문에 놀라지 않을 것입니다 행동.


2

있다는 것을 참고 두 개의 입력 순열과 피벗 (파티션 당 하나) : 기대 / 평균 이상 걸릴 일이.

Quicksort의 일부 입력 및 구현의 경우 모든 피벗이 잘못되어 ( 동일한 수의 배가 작동하는 경우도 있음) 무작위 화가 도움이되지 않습니다. 이러한 경우 예상 시간 (피벗 선택에 대한 평균)은 최악의 경우 (잘못된 입력) 2 차적 일 수 있습니다. 그럼에도 불구 하고 합리적인 구현을 위해서는 "전체적인"예상 시간 (입력과 피벗 선택에 대한 평균)이 여전히 Θ ( n log n ) 입니다.Θ(로그)

Θ(로그)

결론적으로, 어떤 구현에 대해 어떤 소스를 사용하고 무작위로 간주 할 수량을 확인하십시오. 그들의 분석에 고정.


시험에서 물었던 이 질문 postimg.org/image/fiurc4z87 을 고려하십시오 . 내가 생각하는 적절한 답변은 무엇입니까? (c)
Atinesh

1
@ Atinesh 내 대답은 이것에 대한 충분한 정보를 제공한다고 생각합니다.
Raphael

-1

영형(2)

무작위 퀵 정렬의 최악의 경우는 입력과 동일한 요소입니다. 예 : 2,2,2,2,2,2

()=(1)+영형(2)


퀵 정렬을 과도하게 구현 한 경우입니다. 적절한 구현은 첫 번째 파티션 교환 # 1 및 # 6, # 2 및 # 5, # 3 및 # 4에서 길이 3의 두 개의 하위 배열을 정렬합니다.
gnasher729

LHS와 RHS에서 스캔하는 포인터 모두에 <=와> =가 있다고 생각합니다. 당신이 그렇게 말하는 이유입니다. '='는 둘 중 하나가 아닌 포인터 중 하나와 연관되어 있습니다. 이 경우 재귀 트리는 n까지 커집니다.
pratyay

그리고 그것이 내가 엄청나게 멍청한 구현이라고 부릅니다. "모든 요소가 동일하다"는 경우에 2 차 런타임을 수행하는 구현은 범죄 적으로 어리 석습니다. 이 경우 선형 시간이 걸리는 구현이 실제로 있습니다 (O (n log n)가 아닌 O (n)).
gnasher729
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.