O (k)에서 배열에서 가장 작은 k 요소 찾기


12

이것은 웹에서 찾은 흥미로운 질문입니다. n 개의 숫자를 포함하는 배열이 주어지면 (그들에 대한 정보가 없음), 우리는 숫자 1 <= k가 주어지면 O (k) 시간에 가장 작은 k 개의 요소를 반환 할 수 있도록 선형 시간으로 배열을 사전 처리해야합니다 <= n

나는이 문제를 몇몇 친구들과 논의했지만 아무도 해결책을 찾지 못했다. 도움을 주시면 감사하겠습니다!

빠른 참고 사항 :-k 가장 작은 요소의 순서는 중요하지 않습니다-배열의 요소는 숫자, 정수 일 수 있으며 기수 정렬이 아닐 수 있습니다-숫자 k는 전처리 단계에서 알 수 없습니다. 전처리는 O (n) 시간이다. O (k) 시간에 함수 (k 가장 작은 요소를 찾습니다).


4
최소 힙을 사용하는 것은 어떻습니까?
Shir

1
k- 스카이 밴드와 top-k 계산을보십시오. cs.sfu.ca/~jpei/publications/subsky_tkde07.pdf 문서 는 관련 문헌에 대한 좋은 리뷰를 가지고 있습니다.
András Salamon

1
Shir-I는 min-heap 아이디어를 조사했습니다. 그러나, 최소 힙에서 K 작은 번호를 인쇄하기 위해 필요로 O (klogn) 시간이 아닌 O (K)이다
Idan

4
@ idannik : 왜 최소 힙에서 k 개의 가장 작은 요소 를 찾는 데 시간 이 걸린다고 생각 합니까? Ω(klogn)k
Kristoffer Arnsfelt Hansen 2016

8
나는 이것이 연구 수준이라고 생각하지 않습니다. 과제처럼 보입니다. 어디서 찾았습니까?
Kaveh

답변:


24

시간 O ( n ) 에서 값 의 배열을 전처리하십시오 .nO(n)

  • in
  • 반면 i>2
    • 시간 O ( i ) 에서 A [ 1 .. i ] 의 중앙값 을 계산합니다 .mA[1..i]O(i)
    • 파티션 [ 1 .. I ][ 1 .. I / 2 - 1 ] m[ I / 2 + 1 ... I ] m 동시에있다.A[1..i]A[1..i/21]mA[i/2+1..i]m
    • ii/2

총 사전 실행 시간 내에 O(1+2+4+...+n)O(n)

시간 O ( k ) 에서 A 가장 작은 요소에 대한 쿼리에 응답하십시오 .kAO(k)

  • llog2k
  • 선택 번째 원소 X[ 2 . .2 l + 1 ] 시간 O ( 2 l ) O ( k )(k2l)xA[2l..2l+1]O(2l)O(k)
  • 파티션 에 의해 X 동일한 시간A[2l..2l+1]x

포함 K 작은 소자.A[1..k]k

참고 문헌 :

  • 1999 년 Dor와 Zwick2.942 n + o ( n ) 비교 내에서 시간 에 요소 의 중앙값을 계산 하는 알고리즘을 제공하여 6 n 미만의 비교 에서 n 개의 정렬되지 않은 요소에서 k 번째 요소 를 선택하는 알고리즘을 생성했습니다 .n2.942n+o(n)kn6n

1
I는 외부 루프 'I에 대해 가정된다 추측 '. 알고리즘이 Yuval Filmus의 답변과 다른 알고리즘입니까? {2lgn,,4,2,1}
Radu GRIGore

2
이것은 내 알고리즘을 임의의 으로 일반화 합니다. 또한 내 답변에서 (고의적으로) 누락 된 구현 세부 사항을 설명합니다. n
Yuval Filmus

3
@YuvalFilmus 내 답변이 비 윤리적으로 귀하의 답변에 가깝다는 의견을 내시겠습니까? 이것이 내가 질문을 검토했을 때 떠오른 해결책입니다. 나는 당신이 비슷한 것을 게시했지만 명확하지 않다는 것을 알았으므로 (당신의 주요 편집을하는 것과는 대조적으로) 내 것을 썼습니다. 궁극적으로 중요한 것은 실제로 작성한 사람이 아니라 시스템에 대한 답변의 품질입니다. 배지와 평판은 목표 자체가 아니라 인센티브 일뿐입니다.
Jeremy

4
@Jeremy 전혀; 두 솔루션이 동일하지만 (임의의 에서는 작동합니다 ) 실제로 숙제 문제 인 경우 세부 사항을 살려 보지 않았습니다. n
Yuval Filmus

2
Oh :( 그런데 미안합니다. (아직도 완전한 대답을하는 것이 과제를 의심하는 것보다 우선이라고 생각할 것입니다.)
Jeremy

14

n=2m2m1,2m2,2m3,,1kt2t1k2t2t2k2tkO(2t)=O(k)

Θ(nlogn)

while n > 0:
  find the (lower) median m of A[0..n-1]
  partition A in-place so that A[n/2-1] = m
  n = n/2

n+n/2+n/4++1<2nAkA[0..n/2k1]n/2k


1
O(1)kO(n)

4
lognnlogn

3
@ AndrásSalamon : Jeremy (이것과 거의 동일하게 보입니다)가 제공 한 답변을 읽으면 먼저 전체 배열을 처리 한 다음 전반부를 처리하는 것을 볼 수 있습니다.
Radu GRIGore

3
n+n/2+n/4++1<2n



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.