Bently-Saxe 방법은 상당히 자연스러운 안정적인 우선 순위 대기열을 제공합니다.
일련의 정렬 된 배열 데이터를 저장하십시오 . 나 사이즈 갖는 2 I를 . 각 배열은 카운터 c i 도 유지합니다 . 배열 항목 A i [ c i ] , … , A i [ 2 i - 1 ] 에는 데이터가 포함됩니다.에이0, … , A케이에이나는2나는기음나는에이나는[ c나는] , … , A나는[ 2나는− 1 ]
각 , 모든 요소 A는 제가 최근에 비해 첨가 I + 1 각 내 I의 요소와의 관계 값에 의해 정렬을 새로운 요소에 앞서 이전 요소를 배치하여 세분화된다. 이는 A i 와 A i + 1을 병합 하고이 순서를 유지할 수 있음을 의미 합니다. (병합 중 타이의 경우 A i + 1 에서 요소를 가져옵니다 .)나는에이나는에이나는 + 1에이나는에이나는에이나는 + 1에이나는 + 1
값 인서트 , 작은 찾을 내가 되도록 A가 나는 0 요소 병합 포함 0 , ... , A는 I - 1 및 X는 ,이 저장 I 와 세트 c를 0 , ... , c를 내가 적절.엑스나는에이나는에이0, … , A난 − 1엑스에이나는기음0, … , c나는
최소값을 추출하려면 A i [ c i ] 의 첫 번째 요소가 모든 i 보다 최소 이고 c i가 증가 하도록 가장 큰 인덱스 찾으십시오 .나는에이나는[ c나는]나는ci
표준 인수에 따르면, 이는 작업 당 상각 시간을 제공하며 위에서 설명한 순서로 인해 안정적입니다.O(logn)
일련의 삽입 및 추출의 경우 n 배열 항목 (빈 배열을 유지하지 않음)과 부기 데이터의 O ( log n ) 단어를 사용합니다. Mihai의 질문에 대한 대답은 아니지만 안정적인 제약 조건에 많은 공간 오버 헤드가 필요하지 않음을 보여줍니다. 특히 필요한 여분의 공간에 Ω ( n ) 하한 이 없음을 나타냅니다 .nnO(logn)Ω(n)
업데이트 : Rolf Fagerberg는 null (데이터가 아닌) 값을 저장할 수 있으면이 전체 데이터 구조를 크기가 배열로 압축 할 수 있다고 지적합니다 . 여기서 n 은 삽입 횟수입니다.nn
먼저 을 순서대로 배열에 넣을 수 있습니다 ( A k가 먼저이고 비어 있지 않은 경우 A k - 1이 오는 식 으로). 이것의 구조는 지금까지 삽입 된 요소의 수 인 n 의 이진 표현으로 완전히 인코딩됩니다 . 이진 표현의 경우 , n은 위치 1 갖는 난을 다음 제가 차지하는 2 I , 배열 위치를, 그렇지 않으면 어떠한 배열 위치를 차지할 것이다.Ak,…,A0AkAk−1nniAi2i
과 배열의 길이를 삽입 할 때 1 씩 증가 하면 기존의 내부 안정 병합 알고리즘을 사용하여 A 0 , … , A i 와 새로운 요소를 병합 할 수 있습니다.nA0,…,Ai
이제 null 값을 사용하는 위치는 카운터 제거하는 것입니다 . 에서는 난 , 우리는 먼저 다음 값 저장 C 나 잔존 하였다 널 값, (2) I - c를 I - 1 개 값. 추출-분 동안 A 0 [ 0 ] , … , A k [ 0 ] 을 검사 하여 O ( log n ) 시간으로 추출 할 값을 여전히 찾을 수 있습니다 . A i [ 0 에서이 값을 찾으면ciAici2i−ci− 1O ( 로그n )에이0[ 0 ] , … , A케이[ 0 ]A i [ 0 ] 을 null로설정 한 다음 A i 에서이진 검색을 수행하여 null이아닌 첫 번째 값 A i [ c i ] 를 찾은 다음 A i [ 0 ] 및 A i [ c i ]를 교체합니다.에이나는[ 0 ]에이나는[ 0 ]에이나는에이나는[ c나는]에이나는[ 0 ]에이나는[ c나는]
최종 결과 : 전체 구조는 각 삽입마다 길이가 증가하는 하나의 배열과 삽입 수를 계산하는 하나의 카운터 으로 구현할 수 있습니다 .엔