2012-08-17 3 views
4

정렬되지 않은 배열이 주어지고 효율적으로 상위 5 개 요소를 찾아야하므로 목록을 정렬 할 수 없습니다.정렬되지 않은 배열의 상위 5 개 요소

내 솔루션 :

  • 이 배열의 최대 요소를 찾을 수 있습니다. O (n)

  • 처리/사용 후이 최대 요소를 삭제하십시오.

  • 단계 1을 반복한다. & 2, k 회 (이 경우 5 회).

시간 복잡도 : O (KN)/O (N) 공간 복잡성 : O (1)를.

나는 우리가 O (logN)의 최대 요소를 찾을 수 있다고 생각, 그래서 O (klogN)을 향상시킬 수있다. 내가 틀렸다면 나를 바로 잡아주세요.

우리가 이보다 더 잘 할 수 있을까요? 최대 힙을 사용하면 비효율적일까요?

PS - 숙제가 아닙니다.

+3

정렬되지 않은 배열에서 max 요소를 찾을 때 O (N)보다 더 잘할 수 있다고 생각하지 않습니다. 너 마음에 무엇이 있었 니? – Kevin

+2

배열을 탐색하면서 상위 5 개 (또는 k 개)의 요소를 추적 한 다음 완료하면이를 삭제하지 않는 이유는 무엇입니까? O (n) [또는 O (logN)]이라면 검색 알고리즘을 향상시킬 수 있습니다]. –

+0

죄송 합니다만, O (log n) 시간에 _unsorted_ 배열의 max 요소를 찾을 수 없습니다. 예를 들어 정렬 된 배열로 할 수 있습니다. 이진 검색. 그러나 정렬 된 배열에서 문제는 사소한 O (1) 솔루션을 가지고 있습니다. – 9000

답변

8

당신이 n이 최대 요소의 수를 추적하는 목록 길이와 m 인 보조 힙이 O(nlogm)에서이 작업을 수행 할 수 있습니다 (상단에 마이너스 요소와 분 힙)를 사용 할 수 있습니다.

보조 힙은 최대 크기 (5)가 고정되어 있으므로 해당 구조의 작업은 O(1)으로 간주 할 수 있습니다. 이 경우 복잡도는 O(n)입니다.

의사 코드 :

foreach element in list: 
    if aux_heap.size() < 5 
     aux_heap.add(element) 
    else if element > aux_heap.top() 
     aux_heap.remove_top() 
     aux_head.add(element) 
+0

일반적으로 이것은 O (nlogk)입니다. 비록 그것이 우수하다는 데 동의하지만 k = 5입니다. – cmh

+0

보조 목록으로 추가 공간을 의미합니까? 여분의 배열처럼? 아니면 다른 것입니까? – h4ck3d

+0

@sTEAK : 예 여분의 공간.하지만 물론 원래의 목록에서 요소를 제거하고 다른 곳으로 옮겨 놓은 것 같아서 솔루션을 사용하더라도 필요하다고 생각합니다. – Heisenbug

4

partial quicksort 우리가 달성 O (n)을 사용하여, 이것은 임의의 보조 공간을 필요로하지 않는다. 다른 솔루션에서와 같이 최대 힙을 사용하려면 O (n log k) 시간이 필요합니다.

관련 문제