3 방향 Quicksort (이중 피벗 퀵 소트)의 경우 Big-O 경계를 찾는 방법은 무엇입니까? 누구든지 그것을 파생시키는 방법을 보여줄 수 있습니까?3 방향 Quicksort Big-O Bound
답변
을 증명 알고리즘의 복잡성과 을 찾는 사이에 미묘한 차이가있다. 당신이 미트로 할 수 으로
찾을이 알고리즘의 복잡성, 다른 대답했다 : 당신이 평균, 당신은 크기 n/3
의 3 개의 작은 문제가 크기 n
의 문제를 분리 것을 알고, 당신이 그렇게 크기가 1 인 문제에 대해 평균적으로 log_3 (n)`단계를 거치게됩니다.경험을 통해이 접근법에 대한 느낌을 갖기 시작하고 관련된 하위 문제와 관련하여 알고리즘을 복잡하게 추론 할 수 있습니다. 으로
이 알고리즘은 평균 경우 O(nlogn)
에서 실행 증명, 당신은 Master Theorem를 사용합니다. 이를 사용하려면 배열을 정렬하는 데 소요 된 시간을 제공하는 재귀 수식을 작성해야합니다. 우리가 말했듯이, 크기 배열 n
을 정렬하는 것은 크기가 n/3
인 3 개의 배열과 그것들을 만드는 데 걸린 시간을 정렬하는 것으로 분해 될 수 있습니다.
T(n) = 3T(n/3) + f(n)
T(n)
가 (실제로 필요한 기본 작업의 수) 크기
n
의 입력 해상도 "시간"을 제공하는 기능이다
및 f(n)
가 필요한 "시간"을 제공합니다 : 이것은 다음과 같이 쓸 수있다 문제를 하위 문제로 나눕니다.
3 방향 퀵 정렬의 경우 f(n) = c*n
배열을 검토하기 때문에 각 항목을 배치 할 위치를 확인하고 결국 교환을 수행하십시오. 이것은 (우리의 경우 k = 0
에서) 일부 k >= 0
에 대한 f(n) = O(n^(log_b(a)) log^k(n))
다음
T(n) = O(n^(log_b(a)) log^(k+1)(n)))
이 a = 3
및 b = 3
으로 (우리가 재발 관계, T(n) = aT(n/b)
에서 이러한 얻을) 경우,이
T(n) = O(n log n)
그리고 증명입니다.
글쎄, 같은 증명이 실제로 적용됩니다.
각 반복은 배열을 3 개의 하위 목록으로 나눕니다. 평균적으로이 하위 목록의 크기는 각각 n/3
입니다.
따라서 반복 횟수는 log_3(n)
입니다. 도착할 때까지 (((n/3) /3) /3) ...
횟수를 찾아야하기 때문입니다. 이것은 당신에게 공식을 준다 :
n/(3^i) = 1
어느 것이 i = log_3(n)
에 만족한다.
각 반복은 여전히 모든 입력을 처리하지만 (다른 하위 목록에 있음) - quicksort와 동일하며 O(n*log_3(n))
을 제공합니다.
log_3(n) = log(n)/log(3) = log(n) * CONSTANT
부터 평균 실행 시간은 O(nlogn)
입니다.
하위 목록의 크기를 계산하는 데 더 비관적 인 방법을 사용하더라도 최소 균일 분포를 취하여도 여전히 1/4 크기의 첫 번째 하위 목록, 크기 1/2의 두 번째 하위 목록, 마지막 1/4 크기 (최소 및 최대 균일 분포)의 하위 목록은 log_k(n)
반복 (다른 k> 2)으로 다시 부패하여 전체적으로 O(nlogn)
이됩니다. 각각의 반복이 몇 가지 상수, N_1을 C_1를 들어, 각 n>N_1
를 들어, 실행하는 데 최대 c_1* n
작전 소요
:
는 공식적으로, 증거는 무엇인가있을 것입니다. (큰 O 표기법의 정의와 각 반복이 재귀를 제외하고 O(n)
이라는 주장. 이것이 사실 인 이유를 스스로 설명하십시오. 여기에서 "반복"은 특정 "수준"에서 알고리즘에 의해 수행 된 모든 반복을 의미하며 단일 재귀 호출).
위에서 볼 수 있듯이, 당신은
이제, 우리는 알고리즘의 실행 시간 T(n)
는 것을 얻을 log_3(n) = log(n)/log(3)
반복 평균 경우에 (, 비관적에 대한 동일한 원칙을 사용할 수 있습니다 여기에 낙관적 버전을 복용)이 있습니다
for each n > N_1:
T(n) <= c_1 * n * log(n)/log(3)
T(n) <= c_1 * nlogn
, 그것은 T(n)
가 M = c_1
N = N_1
과 함께 O(nlogn)
인 것을 의미한다.
QED
- 1. 3 방향 파티션이있는 Quicksort
- 2. 3 방향 분할 알고리즘
- 3. QuickSort 파티션
- 4. 단일 링크 목록의 quicksort
- 5. DrScheme의 Quicksort
- 6. Quicksort + Profiling
- 7. Quicksort 구현
- 8. 울트라 그리드에서 3 방향 정렬
- 9. C# bound Datagridview
- 10. 치타의 Un/bound 메소드
- 11. BigO 표기법을 사용하여 forward_lists로 정렬 하시겠습니까?
- 12. quicksort C를 정렬하지
- 13. Quicksort Algorithm throws StackOverflowException
- 14. QuickSort 알고리즘 향상
- 15. 그걸로 정렬 - Quicksort
- 16. c에서 병렬 quicksort
- 17. imlpement하는 방법을 모른다. Quicksort
- 18. 스칼라에서 느슨한 Quicksort
- 19. quicksort orderby id asc
- 20. QuickSort 알고리즘에 문제가 발생했습니다
- 21. 결정론적인 Quicksort 란 무엇입니까?
- 22. 행렬 - QuickSort 재귀 문제
- 23. insertSort를 사용한 quickSort 수정
- 24. QuickSort in C++
- 25. MongoDB Ruby Bound ORM이없는 쿼리
- 26. Castle Windsor "Late bound"components
- 27. JavaScript 또는 PHP의 3 방향 병합
- 28. SmartGit에는 3 방향 충돌 해결 방법이 있습니까?
- 29. FileMerge에서 3 방향 병합을 어떻게 수행합니까?
- 30. WPAM의 3 방향 스플리터 용 XAML