주어진 시퀀스에서 O (k) 메모리 O (n) 시간만으로 k 번째로 작은 요소 찾기


11

시퀀스를 하나씩 읽습니다 . 셀 메모리를 사용하고 선형 시간 ( ) 을 사용하여 번째로 작은 요소 를 찾는 방법 . 나는 우리가 먼저 저장해야한다고 생각 시퀀스의 조건과 얻을 때 번째의 용어를, 우리가 확실히는 될 수없는 용어 삭제 번째 작은 요소 다음 저장 ' 번째의 용어. 따라서 각 단계에서 사용할 수없는 용어를 보여주는 지표가 있어야하며이 지표는 각 단계에서 빠르게 업데이트되어야합니다. 나는 "max"로 시작했다 ; 그러나 빠르게 업데이트 할 수는 없습니다. 우리가 최대 를 고려하면 의미k O ( k ) O ( n ) k k + 1 k k + 1케이O ( k )O ( n )케이k + 1케이k + 1그런 다음 첫 번째 삭제에서 최대 값을 놓치고 선형이 아닌 및 원인 시간 에서 최대를 검색해야합니다 . 어쩌면 우리는 첫 번째 항을 더 지능적으로 저장해야 할 것 입니다.( n - k ) × O ( k ) kO ( k )( n k ) × O ( k )케이

이 문제를 어떻게 해결합니까?


1
온라인 알고리즘에 관심이 있습니까, 아니면 어떤 알고리즘을 원하십니까?
Yuval Filmus

만약 다음 순서 통계 알고리즘을 사용하여 작업을 수행 할 수 있습니다. 경우 다음 당신은 할 수 메모리와 어떤 높이 균형 트리를 사용하여 시간을. K = O ( 없음 ) O ( K ) O ( N 로그 케이 )k = θ ( n )k = o ( n )O ( k )O ( n 로그k )
Shreesh

선택 문제라고합니다. en.wikipedia.org/wiki/Selection_algorithm
xavierm02

선형 시간 위치 알고리즘이 있습니다. Google은 할 수 있지만 다소 복잡합니다.
Yuval Filmus

@ xavierm02 선택 문제가 동일하지 않습니다. 메모리 제한 제약이 있기 때문입니다.
Shahab_HK

답변:


16

크기가 버퍼를 만듭니다 . 배열 에서 요소를 읽습니다 . 선형 시간 선택 알고리즘 을 사용 하여 가장 작은 요소가 첫 번째가 되도록 버퍼를 분할하십시오 . 이것은 시간 이 걸립니다 . 이제 배열 에서 다른 항목을 버퍼로 읽어 버퍼에서 가장 큰 항목을 바꾸고 이전과 같이 버퍼를 분할 한 다음 반복하십시오.2 k k O ( k ) k k2 K2 K케이O ( k )케이케이

이것은 시간과 공간을 필요로합니다.O ( k )O ( k * n / k ) = O ( n )O ( k )


+1, 이것은 요청 된 무증상에 적합합니다. 말하자면, 이것이 단일 선형 시간 선택 알고리즘을 수행하는 것보다 빠르다고 생각하지 않습니다 ... 가 작은 상수 인 경우를 제외하고 는 흥미로운 관점을 제공합니다. 예를 들어 경우이 알고리즘은 함수를 생성합니다 . k = 1케이k = 1min
orlp

1
때로는 선형 시간 선택 알고리즘이 너무 많은 공간을 사용합니다. 예를 들어 스트리밍 컨텍스트 나 입력 배열을 변경할 수없는 경우에는 적합하지 않습니다.
jbapple

그것들은 유효한 포인트입니다.
orlp

3

당신이 그것을 할 수 메모리 및 제의 고정 된 크기의 최대 힙 형성함으로써 시간 의 요소를 시간은, 그 배열의 나머지를 통해 반복하고 밀어 새로운 요소를 위해 진열하고 총 시간을주는 요소마다 = .O ( N 로그 K ) (K) O ( K ) O ( 로그 K ) O ( K + N 로그 케이 ) O ( N 로그 케이 )O ( k )O ( n 로그k )케이O ( k )O ( 로그k )O ( k + n 로그k )O ( n 로그k )

중간 값 선택 알고리즘을 사용하고 에서 선택 하고 첫 번째 요소를 반환하여 보조 메모리 및 시간에 이를 수행 할 수 있습니다 . 무증상으로 변경하지 않고도 introselect를 사용하여 평균 사례의 속도를 높일 수 있습니다. 이것이 문제를 해결하는 정식 방법입니다.O ( N ) K KO ( 로그n )O ( n )케이케이

이제 기술적으로 와 는 비교할 수 없습니다. 그러나 컴퓨터 시스템에 바이트 이상의 메모리가 것을 고려할 때 실제로 일정하기 때문에 이 실제로 더 좋습니다 . 한편 는 만큼 커질 수 있습니다 .O ( K ) O ( 로그 N ) 2 64 로그 2 64 = 64 K에서 NO ( 로그n )O ( k )O ( 로그n )264로그264= 64케이


흥미로운 경우 힙에서 사용하는 순서를 반대로하여 힙 기반 알고리즘의 복잡성을 로 향상시킬 수 있습니다. O ( n × 로그최소 ( k , n - k ) )
xavierm02

@ xavierm02 = 입니다. 증명 : 의 최악의 경우 는 입니다. 의 최악의 경우 는 입니다. 상수 인자 내에서 동일하므로 = 입니다. O ( k ) k n m i n ( k , n - k ) nO는 ( 해요 I N ( K , N - K ) )O ( k )케이m i n ( k , n k ) O(min(k,nk))O(k)2O는 ( 해요 I N ( K , N - K ) )O ( k )
orlp

@ xavierm02 그것은 여전히 ​​좋은 속도입니다 :)
orlp

O ( k ) O ( 최소 ( k , n - k ) ) C M M k n k C ( n - k ) n = k + ) . O ( ( K , N - K ) ) O ( K )n , k= k 는 이지만 아닙니다 . 그렇다고 가정하십시오. 그런 다음 일부 와 있으므로 모든 에 대해 가 있습니다 할 수 있기 때문에 분명히 거짓 따라서 입니다. O ( k )O ( 최소 ( k , n k ) )미디엄미디엄k nk C( n - k )n = k + ) .O(min(k,nk))O(k)
xavierm02

@ xavierm02 나는 당신의 표기법에 익숙하지 않습니다 . 공정을하기 위해, 나는 일반에있어 매우 익숙와 다차원 BIG- 표기법, 특히 치수 점을 감안 관련이 없습니다. O n , kun,kOn,k
orlp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.