안정적인 힙이 있습니까?


32

다음 작업을 지원하는 우선 순위 대기열 데이터 구조가 있습니까?

  • 삽입 (x, p) : 우선 순위 p로 새 레코드 x 추가
  • StableExtractMin () : 우선 순위가 가장 낮은 레코드를 반환 순서대로 삭제하고 삭제합니다 .

따라서 Insert (a, 1), Insert (b, 2), Insert (c, 1), Insert (d, 2) 후에 StableExtractMin의 시퀀스는 a, c, b, d를 반환합니다.

분명히 한 사용할 수 있는 한 쌍의 저장함으로써 우선 순위 큐의 데이터 구조 실제 우선 순위 등을,하지만 않는 데이터 구조에 관심이 없는 유사한 방법에 의해 명시 적으로 삽입 시간 (또는 신청서)를 저장 안정적인 정렬.(p,time)

동등하게 (?) : 추가 공간이 필요없는 안정적인 버전의 힙 정렬이 있습니까?Ω(n)


"a, c, b, d"를 의미한다고 생각하십니까?
로스 스나이더

링크 된 레코드 목록이있는 힙 + 해당 링크 된 목록을 가리키는 우선 순위를 기준으로 균형 이진 트리가 작동하지 않습니까? 내가 무엇을 놓치고 있습니까?
Aryabhata

Moron : 그것은 삽입 순서를 명시 적으로 저장하는 것입니다. 정확하게 피하고 싶은 것입니다. 나는 문제 진술을 명확히했다 (그리고 Ross의 오타를 고쳤다).
Jeffε

답변:


16

Bently-Saxe 방법은 상당히 자연스러운 안정적인 우선 순위 대기열을 제공합니다.

일련의 정렬 된 배열 데이터를 저장하십시오 . 사이즈 갖는 2 I를 . 각 배열은 카운터 c i 도 유지합니다 . 배열 항목 A i [ c i ] , , A i [ 2 i - 1 ] 에는 데이터가 포함됩니다.A0,,AkAi2iciAi[ci],,Ai[2i1]

, 모든 요소 A는 제가 최근에 비해 첨가 I + 1 각 내 I의 요소와의 관계 값에 의해 정렬을 새로운 요소에 앞서 이전 요소를 배치하여 세분화된다. 이는 A iA i + 1을 병합 하고이 순서를 유지할 수 있음을 의미 합니다. (병합 중 타이의 경우 A i + 1 에서 요소를 가져옵니다 .)iAiAi+1AiAiAi+1Ai+1

값 인서트 , 작은 찾을 내가 되도록 A가 나는 0 요소 병합 포함 0 , ... , A는 I - 1X는 ,이 저장 I 와 세트 c를 0 , ... , c를 내가 적절.xiAiA0,,Ai1xAic0,,ci

최소값을 추출하려면 A i [ c i ] 의 첫 번째 요소가 모든 i 보다 최소 이고 c i가 증가 하도록 가장 큰 인덱스 찾으십시오 .iAi[ci]ici

표준 인수에 따르면, 이는 작업 당 상각 시간을 제공하며 위에서 설명한 순서로 인해 안정적입니다.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,,A0AkAk1nniAi2i

과 배열의 길이를 삽입 할 때 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 에서이 값을 찾으면ciAici2ici1O(logn)A0[0],,Ak[0]A i [ 0 ] 을 null로설정 다음 A i 에서이진 검색을 수행하여 null이아닌 첫 번째 값 A i [ c i ] 를 찾은 다음 A i [ 0 ] A i [ c i ]를 교체합니다.Ai[0]Ai[0]AiAi[ci]Ai[0]Ai[ci]

최종 결과 : 전체 구조는 각 삽입마다 길이가 증가하는 하나의 배열과 삽입 수를 계산하는 하나의 카운터 으로 구현할 수 있습니다 .n


1
이것은 O (n) 추출 후 주어진 순간에 잠재적으로 O (n) 여분의 공간을 사용합니다. 이 시점에서 우선 순위도 저장할 수 있습니다.
Mehrdad

10

당신의 제약이 무엇인지 잘 모르겠습니다. 다음은 자격이 있습니까? 데이터를 배열에 저장합니다. 우리는 이진 힙과 같은 암시 적 이진 트리로 해석하지만 내부 노드가 아닌 트리의 맨 아래에 데이터 항목이 있습니다. 트리의 각 내부 노드는 두 자식에서 복사 된 작은 값을 저장합니다. 관계가있는 경우 왼쪽 아이를 복사하십시오.

최소값을 찾으려면 트리의 루트를보십시오.

요소를 삭제하려면 요소를 삭제됨 (지연 삭제)으로 표시하고 트리를 전파하십시오 (삭제 된 요소의 사본을 보유한 루트 경로의 각 노드는 다른 하위의 사본으로 대체되어야 함). 삭제 된 요소의 수를 유지하고 모든 요소의 일부가 너무 많으면 맨 아래 레벨에서 요소의 순서를 유지하면서 구조를 다시 작성하십시오. 다시 작성하는 데는 선형 시간이 걸리므로이 부분은 일정한 상각 시간 만 추가합니다. 작업 복잡성.

요소를 삽입하려면 트리 맨 아래 행의 다음 빈 위치에 요소를 추가하고 루트 경로를 업데이트하십시오. 또는 맨 아래 행이 가득 차면 트리 크기를 두 배로 늘립니다 (할부 상환 인수와 함께이 부분은 표준 이진 힙이 배열을 초과 할 때 다시 빌드해야 할 필요성과 다르지 않습니다).

그러나 삭제를 처리하는 데 드는 공간 비용을 게으르게 무시하더라도 실제 암시 적 데이터 구조보다 두 배의 메모리를 사용하기 때문에 Mihai의 더 엄격한 버전의 질문에 대한 대답은 아닙니다.


나는 이것을 좋아한다. 일반 암시 적 트리 최소 힙과 마찬가지로 캐시 효과로 인해 3 진 또는 4 진 암시 트리가 더 빠를 것입니다 (더 많은 비교가 필요하더라도).
Jonathan Graehl

8

다음은 문제를 올바르게 해석 한 것입니다.

지원할 수있는 보조 정보없이 N [1..N] 배열에 N 키를 저장해야합니다. * 삽입 키 * 삭제 최소.

대부분의 암시 적 데이터 구조가 일부 요소의 로컬 순서에서 비트를 인코딩하는 트릭을 수행한다는 점을 감안하면 상당히 어려워 보입니다. 여기서 여러 사람이 동일하면 순서를 유지해야하므로 그러한 트릭은 불가능합니다.

흥미 롭군


1
나는 이것이 원래의 질문에 실제로 대답 하지 않기 때문에 대답이 아닌 의견이어야한다고 생각합니다 . (삭제하고 주석으로 추가 할 수 있습니다.)
Jukka Suomela

5
예,이 웹 사이트는 약간 말도 안됩니다. 우리는 평판, 보너스, 보상, 내가 이해할 수 없다는 모든 종류의 의견을 가지고 있습니다. 나는 이것이 어린이 게임처럼 보이지 않기를 바랍니다.
Mihai

1
댓글을 올리려면 더 많은 담당자가 필요하다고 생각합니다. 그게 문제입니다.
Suresh Venkat

@Suresh : 아, 맞아요. 실제로 이러한 상황을 어떻게 처리해야합니까 (즉, 새로운 사용자가 질문에 대답하기 전에 설명을 요구해야합니까)?
Jukka Suomela

2
더 쉬운 방법을 밖으로. 나는 MO에서 이것을 자주 보았다. Mihai가 생각하는 경우 Mihai는 담당자를 얻는 데 어려움이 없을 것입니다 :)
Suresh Venkat

4

짧은 대답 : 당신은 할 수 없습니다.

약간 더 긴 답변 :

동일한 우선 순위를 구별 할 수 있도록 항목의 "나이"를 저장 하려면 추가 공간 이 필요합니다 . 그리고 빠른 삽입과 검색이 가능한 정보를 위해서는 Ω ( n ) 공간 이 필요 합니다. 또한 페이로드 (값 및 우선 순위).Ω(n)Ω(n)

그리고, 당신은 저장 각 페이로드를 들어, 주소의 일부 정보 (예 : "숨기기"를 할 수 있습니다 D D R ( X ) < D D R ( Y가 ) Y가 X보다 나이가 의미). 그러나 "숨겨진"정보에서 "나이"또는 "빠른 검색"정보를 숨길 수 있습니다. 둘 다 아닙니다.addr(X)<addr(Y)


정확하지 않은 색다른 의사 수학으로 매우 긴 대답 :

참고 : 언급 한 것처럼 두 번째 부분의 끝은 스케치입니다. 일부 수학자가 더 나은 버전을 제공 할 수 있다면 감사 할 것입니다.

레코드 (값 및 우선 순위) 기계 단어가 있는 X 비트 기계 (32 또는 64 비트)에 관련된 데이터의 양에 대해 생각해 봅시다 .P

( a , 1 ) = ( a , 1 ) 과 부분적으로 정렬 된 잠재적 인 레코드 세트가 있지만 ( a , 1 )( b , 1 ) .(a,1)<(a,2)(a,1)=(a,1)(a,1)(b,1)

그러나 삽입 된 시간을 기준으로 레코드 세트에서 비교할 수없는 두 값을 비교할 수 있습니다. 따라서 여기에 또 다른 값 세트가 있습니다. 삽입 된 값이며 부분 순서로 값을 향상 시키려고합니다 . iff XY 앞에 삽입되었습니다 .X<YXY

최악의 경우, 메모리는 형태의 기록으로 채워집니다 (와 ? 각각에 대해 서로 다른), 하나가 간다 결정하기 위해 삽입 시간에 전적으로 의존해야하므로 먼저.(?,1)?

  • Xlog2(P)2X
  • P

Xlog2(P)O(n)n

이제 각 메모리 "셀"은 몇 비트의 정보를 제공합니까?

  • WW
  • X

P1Xlog2(P)<X

따라서 모든 정보를 저장하려면 두 가지 가능성이 있습니다.

  • 삽입 순서를 주소에, 페이로드를 메모리에 저장하십시오.
  • 둘 다 메모리에 저장하고 다른 용도로는 주소를 비워 두십시오.

분명히 낭비를 피하기 위해 첫 번째 솔루션을 사용합니다.


이제 작업합니다. 나는 당신이 갖고 싶다고 생각합니다 :

  • Insert(task,priority)O(logn)
  • StableExtractMin()O(logn)

StableExtractMin()

정말 일반적인 알고리즘은 다음과 같습니다.

  1. O(logn)
  2. O(logn)
  3. 반환.

0(1)O(1)O(1)

O(logn)2(Xlog2(P))

Xlog2(P)O(logn)O(logn)

O(logn)

O(logn)Xlog2(P)

O(logn)

Xlog2(P)O(logn)

삽입 알고리즘은 일반적 으로이 정보의 일부만 업데이트하면됩니다. 성능이 빠르기 위해서는 더 많은 메모리가 필요하다고 생각하지 않습니다.


Xlog2(P)

  • Xlog2(P)
  • P
  • Xlog2(P)

Ω(n)


정말 답을 CW로 하시겠습니까?
Suresh Venkat

예. 내 대답은 100 % 정확하지 않습니다. 내가 언급 한 것처럼 더 이상 또는 무엇이든하지 않아도 누구나 수정할 수 있다면 좋을 것입니다. 지식은 공유되어야하고 지식은 변경 가능해야합니다. 그러나 CW의 사용법을 잘못 이해했을 수도 있습니다. 그렇다면 알려주십시오 :). 편집 : 으악, 실제로 방금 CW 게시물에서 어떤 담당자도 얻지 못하고 내용이 어떤 식 으로든 CC-wiki 라이센스가 있음을 발견했습니다 ... 너무 나쁜 :).
Georges Dupéron

3

우선 순위 대기열을 균형 이진 트리 (일반적인 선택)로 구현하는 경우 요소를 트리에 추가 할 때 우선 순위가 동일한 모든 요소의 왼쪽에 삽입되어야합니다.
이런 식으로 삽입 순서는 트리 자체의 구조로 인코딩됩니다.


1
그러나 이것은 포인터를위한 O (n) 공간을 추가합니다.
Jeremy

-1

나는 그것이 가능하지 않다고 생각한다

구체적인 경우 :

       x
    x    x
  x  x  1  x
1  x  

모든 x> 1의 최소 힙

힙화는 결국 뭔가를 선택할 것입니다.

       x
    1    1
  x  x  x  x
x  x  

이제 어느 1이 루트로 전파됩니까?

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