누구나 '평범한 영어'를 제공 할 수 있습니까? QuickSort n log n을 만드는 것이 직관적이면서도 공식적인 설명입니까? 내 이해에서 그것은 n 항목을 통과해야하며,이 로그를 n 번 수행합니다 ...이 로그를 n 번 수행하는 이유를 단어에 넣는 방법을 모르겠습니다.QuickSort가 n log n 인 이유에 대한 직관적 인 설명?
답변
각 분할 작업에는 O (n) 작업 (배열에서 한 번만 수행)이 필요합니다. 평균적으로 각 분할은 배열을 두 부분으로 나눕니다 (로그 연산까지 합계 함). 전체적으로 O (n * log n) 연산이 있습니다.
e.e. 평균 log n 파티셔닝 작업에서 각 파티셔닝은 O (n) 작업을 필요로합니다.
log n
부분은 (적어도 이상적으로) 매 반복마다 입력을 절반으로 나누었 기 때문입니다. N 개의 항목부터 시작하여 매번 절반으로 나누면 로그 (N) 회 반복 후 항목 1 개까지 내려 갔다는 것을 의미합니다.이 시점에서 분명히 더 이상 세분화 할 수 없습니다. 예를 들어 128 개의 항목부터 시작하여 64, 32, 16, 8, 4, 2, 1 항목 - 반복 7 개 그룹으로 나눕니다 (로그 (128) = 7).
각 반복은 전체 배열을 스캔하여 파티션을 분할하므로 전체 복잡도가 O (n log n) 인 경우 O (n) 개의 복잡도를 갖는 O (로그 N) 연산으로 끝납니다.
기술적으로 올바른 Big-O는 O (N)입니다. 이는 파티션 요소를 충분히 잘못 선택하면 어레이를 한쪽 요소의 한 요소로, 나머지 배열 전체를 다른 요소로 분할 할 수 있기 때문에 발생합니다. 이 작업이 매 반복마다 발생하면 N 개의 반복 작업을 통해 하나의 요소 조각으로 나눕니다. 그러면 O (N * N) 전체에 대해 N 개의 연산이 O (N)의 복잡성을 갖습니다.
실제 구현에서는 일반적으로 그 전에 멈추지 만 가장 멀리 갈 수 있습니다.
음, 항상 n (log n)이 아닙니다. 선택한 피벗이 대략 중간에있는 것은 연주 시간입니다. 최악의 경우, 가장 작은 요소 또는 가장 큰 요소를 피벗으로 선택하면 시간은 O (n^2)가됩니다.
'n log n'을 시각화하려면 피벗을 정렬 할 배열의 모든 요소 평균에 가장 가까운 요소로 가정 할 수 있습니다. 이렇게하면 어레이가 거의 동일한 길이의 두 부분으로 분할됩니다. 둘 다 quicksort 절차를 적용합니다.
각 단계에서 배열의 길이를 반으로 줄이면 length = 1에 도달 할 때까지 log n (기본 2) 시간 동안 수행됩니다. 즉 정렬 된 배열은 1 요소입니다.
당신 말이 맞지만 평균과 중간을 혼합하지 마십시오. 중앙값은 길이가 같은 두 부분으로 나누는 것을 허용합니다 (+ -1). – kvetis
실제로 모든 N 요소 (피벗)의 위치를 찾아야하지만 각 요소에 대한 최대 비교 횟수는 logN입니다. 첫 번째 요소는 N이고 두 번째 요소는 N/2,3rd N/4입니다. . 피어싱 피벗은 중간 요소입니다.
- 1. (log (n))^log (n) 및 n/log (n)은 더 빠릅니까?
- 2. 큰 오 표기 O ((log n)^k) = O (log n)?
- 3. n/(log (n))은 다항식 시간으로 간주됩니까?
- 4. 충돌 탐지를위한 O (n^log n) 알고리즘
- 5. 보관이되지 않은 직관적 인 결과
- 6. Postgres : n : m 유형이 중간 인 표
- 7. O (n) 시간 복잡도가있는 N-queen에 대한 설명?
- 8. 왜 문자열 정렬 O (n log n)입니까?
- 9. O (n log n)보다 일반적이고 실용적인 정렬 알고리즘이 빠릅니까?
- 10. 이진 검색 트리를 작성하는 이유는 O (N Log N)입니까?
- 11. O (n log n) 시간에 특수 점 k를 찾는 알고리즘
- 12. 그래프를 탐색하지만 깊이가 n 레벨 인 경우
- 13. 교체 "\ 연구 \ n"인 NSMutableString에서, 데이터는 서버에서받은
- 14. '$ N!! $ D'나오지도 설명
- 15. O (n log n) 복잡도를 사용하여 Java HashMap을 값순으로 정렬합니다.
- 16. O (log n)은 항상 O (n)보다 빠릅니다.
- 17. isset()의 카운터 직관적 인 동작
- 18. OCaml 펑터 :: 반 직관적 인 행동
- 19. C++ STL 맵 컨테이너의 복잡성이 O (log (n)) 인 이유는 무엇입니까?
- 20. 더 직관적 인 상한이있는 파이썬 for 루프?
- 21. ListBox.FindString 최악의 런타임은 무엇입니까? O (n), O (n log n), O (1)?
- 22. 언제 O (n * n)이 더 빠를 것인가? O (log n)?
- 23. Brainstorm : log (n) 시간에 x/y를 계산하려면
- 24. windows '.dll이 리눅스가 아닌 이유에 대한 설명
- 25. 레일스 - escape_javascript가 없어도 \ n \ n \ n \ n \ n
- 26. 거리의 n * n 행렬에 대한 질문 알고리즘
- 27. n : n 관계에있는 NHibernate 맵핑
- 28. T (n) = 2T (n/2) + O (n)
- 29. rspec/capybara 통합 테스트에서 N (순차적 인) 단계가 N 'it ... do'예제로 어떻게 구현 될 수 있습니까?
- 30. 기술적으로 동적 인 크기의 힙 삽입이 O (n)입니까?
고맙습니다. 여기에 수락 된 대답은 단순히 OP (및 I)가 이미 알고있는 작업 (n 번 수행 된 작업은 n 번)을 다시 작성한 것이지만 중요한 부분에만 광택을 적용한 이유는 무엇입니까? 이 대답은 로그 용어가 실제로 어디서 왔는지에 대한 간단하고 훌륭한 설명입니다. –
매우 명확한 답변 감사합니다. – huseyin
이것은 가장 좋은 설명입니다 – huseyin