나는 인터뷰에서이 질문을 받았다. O (n) 시간에 분명히 할 수 있었지만 O (logn)에서 해결할 방법을 생각하지 않았습니다. 몇 가지 divide-and-conquer 알고리즘을 사용하는 것처럼 들리지만 잘 모르겠습니다.2 개의 정렬 된 정수 배열을 가지고 있는데, O (logn) 시간에 k 번째로 큰 항목을 찾는 방법은 무엇입니까?
답변
둘 다 크기 k로 잘립니다. 필요하다면, 하나 또는 양쪽 배열의 끝에 무한대가 충분히있어 크기 k를 갖도록 프로그램을 작성하게하십시오. 이것은 점근 런타임에 영향을 미치지 않습니다. 실제 구현에서는 좀 더 효율적인 작업을 수행 할 수 있습니다.
그런 다음 각 배열의 k/2 번째 요소를 비교합니다. 요소를 동일하게 비교하면 k 번째 요소를 찾았습니다. 그렇지 않으면, 더 낮은 k/2 번째 요소를 갖는 배열을 A로하고 다른 배열을 B로 놓습니다. A의 아래쪽 절반과 B의 위쪽 절반을 버리고 남은 것의 k/2 번째 요소를 재귀 적으로 찾습니다. k = 1을 명중하면 멈 춥니 다.
모든 단계에서 A의 아래쪽 절반이 너무 작게 보장되고 B의 위쪽 절반이 너무 크게 보장됩니다. 남아있는 k/2 번째 요소는 A의 아래쪽 절반보다 더 크게 보장되므로 원본의 k 번째 요소가 될 것입니다. 파이썬에서 개념의
증명 :
def kth(array1, array2, k):
# Basic proof of concept. This doesn't handle a bunch of edge cases
# that a real implementation should handle.
# Limitations:
# Requires numpy arrays for efficient slicing.
# Requires k to be a power of 2
# Requires array1 and array2 to be of length exactly k
if k == 1:
return min(array1[0], array2[0])
mid = k//2 - 1
if array1[mid] > array2[mid]:
array1, array2 = array2, array1
return kth(array1[k//2:], array2[:k//2], k//2)
나는하지만 많은이를 테스트했습니다.
그 소리 같네요. +1. –
* 요소가 동일하면 비교해서 임의로 선택하십시오. * : 둘 다 같으면 가장 큰 k 번째 요소를 찾지 못했습니까? –
@JBNizet : 네가 맞다고 생각해. – user2357112
- 1. 중복이있는 경우 배열의 k 번째로 큰 원소를 찾는 알고리즘을 설계하십시오.
- 2. O (로그인) 시간에 5 개의 정렬 목록의 평균값을 찾는 방법은 무엇입니까?
- 3. O (logn) 실행 시간에 어레이를 통과합니까?
- 4. 유니온 B에서 k 번째로 작은 원소 찾기
- 5. O (logn) 시간에 작동하는 데이터 구조 설계
- 6. O (n) 시간 배열에서 10 개의 가장 큰 정수 찾기
- 7. 집합이 시간에 따라 변화하는 동안 k 번째로 큰 원소를 효율적으로 찾는 방법?
- 8. O (n) 시간에 n 개의 숫자가있는 0 ... n의 정수 배열 정렬
- 9. O (logn)의 정렬 된 배열에서 숫자의 발생 횟수를 찾는 방법
- 10. O (n) 시간에리스트에서 k 개의 가장 큰 정수를 찾는 방법은 무엇입니까?
- 11. BST에서 k 번째로 작은 노드를 찾는 방법은 무엇입니까?
- 12. O (LogN) == O (3LogN)입니까?
- 13. 선형 시간에 정수 배열을 정렬 할 수 있습니까?
- 14. O (logn)^2 시간 성능을 갖는 예제
- 15. O (log n)에서 k 번째로 작은 원소를 찾습니다.
- 16. O (logn) 액세스 및 O (logn) 삽입을 사용하여 데이터 구조를 구현합니까?
- 17. BIg O 표기 : n * logn
- 18. 두 개의 정수 배열을 비교하여 같은 값을 가지고 있는지 확인하십시오.
- 19. N 목록에서 매번 하나의 번호를 선택하여 N 번째 목록에서 k 번째로 큰 번호를 찾는 효율적인 알고리즘
- 20. 정렬 된 배열이 주어지면 O (n^2)에 모든 쌍의 합계를 정렬 된 배열로 작성할 수 있습니까?
- 21. 2 개의 배열을 동시에 루핑
- 22. 2 개의 정렬 된 하위 배열이있는 배열을 내부 정렬
- 23. 두 개의 매우 큰 정렬 된 배열을 효율적으로 비교하십시오.
- 24. 정렬 된 배열에서 가장 큰 요소를 찾는 방법은 무엇입니까?
- 25. 정렬 된 배열에서 배열을 추출하는 방법은 무엇입니까?
- 26. 배열 컬렉션에서 두 번째로 큰 요소의 인덱스를 찾는 방법은 무엇입니까?
- 27. O (logn) 시간에 STL 힙을 사용하여 감소 키를 구현
- 28. 정렬 된 집합의 요소 색인을 찾는 방법은 무엇입니까?
- 29. 두 개의 순차적 인 정수 배열을 가지고 있는데,이 배열들이 얼마나 많은 정수를 가지고 있는지 알고 싶습니다.
- 30. LINQ에서 2 개의 테이블을 결합하는 고유 항목을 찾는 방법은 무엇입니까?
O (n)에서 어떻게 진행했는지 알려줄 수 있습니까? 둘 사이에서 앞뒤로 뛰는 곳이 어디죠? – ChiefTwoPencils
솔직히 O (k)보다 작을 수는 없습니다. 두 배열의 마지막 요소를 비교하고 두 항목 중 가장 큰 배열과 연관된 인덱스를 줄입니다. k 번 해보세요. k 번째 가장 큰 요소가 있습니다. –