만약 정수가 n이라면, O (k + logn) 시간에 n 개의 값 중에서 k 개의 가장 큰 원소를 나열 할 수 있습니까? 내가 얻은 가장 가까운 것은 최대 힙을 만들고 O (klogn) 시간이 걸리는 최대 k 시간을 추출하는 것입니다. 또한 inorder traversal 사용에 대해 생각합니다.k 개의 가장 큰 원소를 추출하기
답변
당신은 의 아이디어 퀵을 사용하기 때문에 때때로 빠른 선택라고한다 array.Technique에서 k 번째 요소를 추출하기위한 분할 및 정복 기술을 사용할 수 있습니다.
이것은 QuickSort, 우리는 다음의 정확한 위치 및 주위 partition
어레이에 피벗 부재를 이동하는 pivot
요소를 선택. 아이디어는, 은 완전한 퀵 소트을하지 않고 피벗 자체가 k 번째 작은 요소 인 지점에서 멈 춥니 다. 또한 피벗의 왼쪽과 오른쪽을 모두 재발행하지 말고 피벗의 위치에 따라 그 중 하나를 재발행하십시오. 이 방법의 최악의 시간 복잡도는 O(n^2)
이지만, 평균적으로 O(n)
에서 작동합니다.
힙을 생성하려면 O (nlogn)이 필요하고 k 요소를 추출하려면 O (klogn)가 필요합니다. k 요소를 추출하는 것이 O (klogn)라는 결론에 이르면 힙을 빌드하는 데 걸리는 시간을 걱정하지 않는다는 의미입니다.
그런 경우 목록 (O (nlogn))을 정렬하고 k 개의 가장 큰 요소 (O (k))를 취하십시오.
을 참조하십시오. 올바르지 않습니다. O (n) 시간에 힙을 생성 할 수 있습니다. –
O (n)에서 힙을 어떻게 작성합니까? – zmbq
https://stackoverflow.com/questions/1787252/is-there-a-on-algorithm-to-build-a-max-heap –
이 문제를 해결하는 방법.
데이터를 정렬 한 다음 최상위 k를 가져옵니다. 정렬에는
O(n lg n)
이 필요하고 상단 k를 반복하는 데O(k)
이 필요합니다. 총 시간 :O(n lg n + k)
데이터에서 최대 힙을 작성하고 상위 k 배를 제거하십시오. 힙 빌드는
O(n)
이고 다시 가기 작업을 수행하는 작업은O(lg N)
입니다. 총 시간 :O(n) + O(k lg n)
실행중인 최대 힙 크기는 k로 유지하십시오. 모든 데이터를 반복하고 힙에 추가 한 다음 힙 전체를 가져옵니다. 총 시간 :
O(n lg k) + O(k)
k 번째로 큰 값을 찾으려면 선택 알고리즘을 사용하십시오. 그런 다음 모든 데이터를 반복하여 해당 값보다 큰 모든 항목을 찾습니다.
. 평균 실행 시간이O(n)
이고 최악의 경우가O(n^2)
인 QuickSelect을 사용하면 k 번째로 큰 것을 찾을 수 있습니다. 총 평균 케이스 시간 :O(n)
+O(n)
=O(n)
. 총 최악의 경우 시간 :O(n^2) + O(n) = O(n^2)
.b.
O(n)
의 최악의 실행 시간을 가지지 만 현재 위치가 아닌 median-of-medians 알고리즘을 사용하면 k 번째로 큰 것을 찾을 수 있습니다. 총 시간 :O(n)
+O(n)
=O(n)
.
배열의 데이터를 서로 바꿔 놓는 중앙값의 중앙값에 대한 위치에 변형이 있습니다. 메모리 할당을 피하십시오. 재귀 때문에 스택 공간이 사용됩니다. 그것은 O (n)이지만 상수 요소가 큽니다. – rcgldr
- 1. 중복이있는 경우 배열의 k 번째로 큰 원소를 찾는 알고리즘을 설계하십시오.
- 2. 자바 스크립트에서 가장 큰 객체 배열 추출하기
- 3. GPU에서 k 개의 가장 큰 고유 값을 계산하는 방법은 무엇입니까?
- 4. 배열에서 K 번째 가장 큰 정수를 찾으십시오
- 5. k 번째로 작은 원소를 찾을 수
- 6. networkx를 사용하여 모든 k- 코어 추출하기
- 7. k 가장 가까운 이웃 알고리즘의 k 값
- 8. 가장 큰 수를 얻기 위해 길이 L의 K 시퀀스를 자른다.
- 9. R : dplyr tibble의 특정 원소를 중심으로 n 개의 원소를 추출하십시오.
- 10. 집합이 시간에 따라 변화하는 동안 k 번째로 큰 원소를 효율적으로 찾는 방법?
- 11. n 개의 정렬 된 배열에서 전체적으로 k 개의 가장 작은 값을 얻는 데 시간이 얼마나 걸리나요?
- 12. IndexError : K 가장 가까운 이웃의 파이썬 K 가장 가까운 이웃
- 13. CUDA를 사용하여 M 개의 원소 중에서 N 개의 가장 큰 원소를 얻는 법. N << M?
- 14. 배열의 원소를 비교하고 새로운 원소를 가져 오는 것
- 15. K 가장 가까운 이웃
- 16. K 가장 가까운 이웃은
- 17. K- 가장 가까운 이웃
- 18. 파이썬의 정렬되지 않은리스트에서 효율적으로 k 번째로 작은 원소를 얻는다.
- 19. O (log n)에서 k 번째로 작은 원소를 찾습니다.
- 20. 스택에서 k 개의 원소를 팝하는 List MultiPop (int k) 함수를 작성하거나 스택이 비어있을 때까지 어떻게 할 수 있습니까?
- 21. O (n) 시간에리스트에서 k 개의 가장 큰 정수를 찾는 방법은 무엇입니까?
- 22. CountVectorizer 클래스에서 n 개의 가장 높은 주파수 추출하기
- 23. 가장 큰 k 고유 값 및 해당 고유 벡터를 numpy로 계산하는 가장 빠른 방법
- 24. 셀레늄에서이 원소를 찾는 가장 좋은 방법은 무엇입니까?
- 25. 테이블에서 n 개의 가장 큰 값 선택
- 26. CMake에서 두 개의 문자열의 가장 큰 접두어
- 27. 배열에서 두 개의 가장 큰 값을 반환합니다.
- 28. 가장 큰 3 개의 숫자 인쇄
- 29. 클러스터링 - 가장 큰 n 개의 클러스터를 그려야합니다.
- 30. 데이터 프레임 pyspark에서 큰 데이터 세트 추출하기
왜 O (k + log n)을 원하십니까? 최소한 O (n) 이상은 통과해야합니다. –
컬렉션이 정렬되지 않은 경우 모든 n 개의 정수를 검사해야합니다. 나는 어떻게 O (k + log n)의 해답을 얻을 수 있는지를 보지 못했다. max heap을 생성하는 것은 이미 O (n)입니다. –
AVL 트리를 사용하는 것은 어떻습니까? –