추출 이있는 우선 순위 큐가 있습니까?


46

우선 순위 큐 인터페이스를 구현하는 많은 데이터 구조가 있습니다.

  • 삽입 : 구조에 요소를 삽입
  • Get-Min : 구조에서 가장 작은 요소를 반환
  • 추출 최소 : 구조에서 가장 작은 요소 제거

이 인터페이스를 구현하는 일반적인 데이터 구조는 (최소) 입니다.

일반적으로 이러한 작업의 실행 시간은 다음과 같습니다.

  • 삽입 : (때때로 )O ( 로그 n )O(1)O(logn)
  • Get-Min :O(1)
  • 최소 추출 :O(logn)

피보나치 힙 예를 들어 다음 실행 시간을 달성한다. 이제 내 질문은 다음과 같습니다.

다음과 같은 실행 시간을 가진 데이터 구조가 있습니까?

  • 삽입 :O(logn)
  • Get-Min :O(1)
  • 최소 추출 :O(1)

정렬 된 입력이 주어진 시간에 이러한 구조를 구성 할 수있는 경우 , 예를 들어 교차점은 '일반적인'우선 순위 대기열을 사용하는 것보다 엄격히 빠릅니다.o ( nO(n)o(nlogn)


나는 생각한다 , 그 것이다 균형 BST를 사용 하지 추출 민은 일할 수있는 일을 할 때 균형. 아니면 건너 뛰기 목록 일 수도 있습니다.
svick

@ svick : 건너 뛰기 목록이 무작위이며, 내가 찾고있는 것이 아닙니다. 당신이 BST와 함께 할 수 있다면, 그것은 중대하다,하지만 난 당신이해야 할 것이라고 생각 어떤 균형의 종류.
Alex ten Brink 1

참고 사항 : 이것은 시드 질문이며 대답을 알고 있지만 쉽게 해결되지 않는다는 것을 알면 좋습니다. 사람이 답을 알고 있다면 :)를 제공하기 위해 주저하지 말고
알렉스 열 직전에게

상각 된 업데이트 시간을 수락하는 경우 표준 힙 구조를 유지하고 분석을 약간만 수정할 수 있습니다. 아래 답변을 참조하십시오.
Joe

답변:


27

우리의 아이디어는 스레드 스플레이 트리 를 사용하는 것입니다 . Wikipedia 기사 이외의 모든 노드는 next순차 순회에서 후속 노드에 대한 포인터 를 갖도록 트리를 스레드합니다 . 또한 start트리에서 가장 작은 요소에 대한 포인터 를 보유합니다 .

작은 요소를 추출하는 시간 (최악의 경우)에서 가능하다는 것을 쉽게 알 수있다 : 그냥 따라 , 포인터를 최소를 제거하고 최소한의 포인터를 변경 . 최소는 결코 왼쪽 자녀를 가질 수 없습니다. 그것이 올바른 아이를 가지고 있다면, 우리는 그것을 나무의 최소 위치에 놓습니다. 스플레이 트리는 일반적으로 수행하는 스플레이 작업을 수행 하지 않습니다 . 결과는 여전히 합리적으로 균형 잡힌 검색 트리입니다. 왼쪽 측면의 노드 만 제거하기 때문에 (영향을받는 하위 트리의) 노드 수가 삭제로 인해 원래 수의 약 절반으로 떨어지면 (sub ) 나무의 높이가 1 씩 줄어 듭니다.O(1)startnext

상각 시간에 삽입이 가능합니다 . 여기서 지그재그 (및 그렇지 않은 것) 작업도 트리의 균형을 잘 맞 춥니 다.O(logn)

이것은 대략적인 스케치입니다. 크레딧은 저와 함께 문제를 해결 한 F. Weinberg와 우리가 시도하지 않은 유일한 트리 변형에 대해 스플레이 트리를 언급 한 M. Nebel 고문 M.에게갑니다.


2
extractMin을 사용하지 않으면 상각 분석을 수행하는 방법이 명확하지 않습니다. 힌트를 줄 수 있습니까?
jbapple

우리는 그것을 자세히하지 않았습니다. 아이디어는 일련의 추출 최소 연산이 트리의 불균형을 제거하지 않으므로 스플레이가 필요 없으며 삽입에 대해 정상적인 분석이 작동해야한다는 것입니다.
Raphael

9
꼼꼼한! 플레이 트리는 반드시 균형을 유지하지 않아도됩니다. 오랫동안 액세스하지 않은 노드 는 트리에서 매우 깊을 수 있습니다 . 분석이 통과하려면, 당신은 splays을 분석하는 데 사용한 것과 동일한 잠재적 기능의 관점에서 주장 할 수 있습니다.
JeffE

20
  • 삽입 :O(logn)
  • Get-Min :O(1)
  • 최소 추출 :O(1)

상각 시간

우선 순위 대기열 (예 : 균형 잡힌 BST 또는 표준 이진 최소 힙)의 간단한 구현은 단순히 삽입 할 Extract-Min 비용을 청구하고 최소 요소에 대한 포인터를 유지함으로써 이러한 실행 시간을 달성 할 수 있습니다. 예를 들어, 인 잠재적 기능을 가질 수 있습니다 . 그때 새로운 요소 증가 전위 삽입 와 인서트의 상각은 여전히도록 지만 추출물 최소값 ()에 의한 전위 저하 , 및 상각 된 비용은 단지 입니다.O ( log n ) O ( log n ) Ω ( log n ) O ( 1 )cnlognO(logn)O(logn)Ω(logn)O(1)

최악의 경우

문헌에서 기존 데이터 구조 인 손가락 검색 트리를 사용할 수 있으며 최소 요소에 대한 포인터를 유지하면됩니다. 이 참조 설문 조사 에 대한 개요 및 1988 년 논문 의 요구 사항을 충족 구현 가능한 버전 Levcopoulos와 오베르마스으로합니다.


1
아주 비열한. 네 말이 맞아, 나는 이것을 배제하기 위해 더 강한 것을 요구했을 것 같다. 좋은 생각 :)
Alex ten Brink

@AlextenBrink 최악의 경우 삭제 를 요구할 수 있습니다. (이것은 다른 답변 중 일부인 것 같습니다) 나는 그 사건을 다루기 위해 내 답변에 단락을 추가했습니다. O(1)
Joe

14

2-4 그루의 나무는 알려진 위치에서 수정을 상각했다 . 즉, 트리의 특정 위치에 대한 포인터가 있으면 상각 시간 내에 해당 요소를 제거하거나 추가 할 수 있습니다 .O ( 1 )O(1)O(1)

따라서 2-4 트리에서 최소 요소와 루트 노드에 대한 포인터를 유지할 수 있습니다. 인서트는 루트 노드를 통과해야합니다. deleteMin 후 포인터를 최소로 업데이트하는 것은 쉽지 않으며 deleteMins는 ( 암 스트 ) 시간입니다.O(1)

흥미로운 측면 참고 사항 : 빨강-검은 나무는 2-4 나무를 보는 방법입니다. C ++ 98 표준 라이브러리 구현 자들은 레드-블랙-트리 기반 컨테이너를 제공 할 것으로 예상되며,이 표준은 삽입과 삭제가 알려진 위치 ( "반복자"라고 함 상각 시간 이어야한다고 지정 합니다. ). 그러나 실제로 색상을 변경해야하는 지연 마킹 노드가 필요하기 때문에 2-4 개의 나무보다 빨강-검정 나무의 경우 훨씬 까다 롭습니다. 내 지식으로는 C ++ 98 표준 라이브러리의 구현이 특정 요구 사항을 충족시키지 못했습니다.O(1)


8

요청에 따라 질문을 공식화 한 후에 찾은 구조는 다음과 같습니다.

기본 아이디어는 스레드 Scapegoat 트리 를 최소값에 대한 포인터와 함께 사용하는 것입니다 . 스레딩에 대한보다 간단한 대안은 모든 노드에서 선행 및 후속 포인터를 유지하는 것입니다 (동일하고 단순하지만 더 많은 오버 헤드가 있음). 이름을 지정하기 위해 Scapegoat heap 이라고 부릅니다 .

이 기본 구조만으로 다음 작업을 수행 할 수 있습니다.

  • 검색 : 키가 주어지면 시간에 해당 노드에 대한 포인터를 반환합니다 .O(logn)
  • Insert : 키가 주어지면 키를 구조에 삽입하고 시간 에 해당 노드에 대한 포인터를 반환합니다 .O(logn)
  • 전임자 / 후임자 : 포인터가 주어지면 후임자 또는 전임자를 시간 내에 반환합니다 .O(1)
  • Get-Min / Max : 포인터를 최소 또는 최대로 반환합니다.

Scapegoat 트리 분석에서 삭제 균형 조정 오버 헤드는 분석되지만 실제로 분석은 의 균형 오버 헤드를 제공합니다 (이 문서에서는 무시 됨 또한 삭제 될 노드를 찾는 데 걸리는 시간 도 계산합니다 . 따라서 노드에 대한 포인터가 있으면 일정한 시간에 노드를 삭제할 수 있습니다 ( 시간의 스레드 이진 검색 트리에서 수행 할 수 있음 ). 균형 조정 오버 헤드로 인해 시간이 삭제됩니다.O ( 1 ) O ( 로그 없음 ) O ( 1 ) O ( 1 ) O ( 1 )O(logn)O(1)O(logn)O(1)O(1)O(1)

  • 삭제 : 포인터가 주어지면 시간에 노드를 삭제합니다 .O(1)

이것을 결합 :

  • Extract-Min / Max : 시간 에서 최소 / 최대 노드를 삭제합니다 .O(1)

포인터를 사용하여 조금 더 많은 작업을 수행 할 수 있습니다. 예를 들어 중간 또는 다른 순서 통계에 대한 포인터를 유지하는 것이 어렵지 않으므로 필요한 경우 일정한 수의 포인터를 유지할 수 있습니다.

다른 것들 :

  • 구성 : 정렬 된 순서로 키가 제공 되면 시간에 Scapegoat 힙을 빌드하십시오 .O ( N )nO(n)
  • 균형 : 트리를 균형 조정하여 시간에 완벽하게 균형 잡힌 이진 검색 트리 (검색 오버 헤드를 줄임 를 만듭니다 (사용하여 용지가 제안한 것보다이 상수를 더 빠르게 수행 할 수 있음) 선행 작업 / 후행 포인터).O(n)

마지막으로 이러한 작업을 지원할 수 있다고 확신하지만 확실하게 알기 전에 이에 대해 좀 더 생각해야합니다.

  • Insert-New-Min / Max : 구조에 이미있는 키보다 작거나 큰 키가 주어지면 키를 구조에 삽입하여 시간 에 해당 노드에 대한 포인터를 반환합니다 .O(1)

중요한 통찰력은 희생양 트리 가 재조정 없이 노드를 삭제 해도 많은 노드를 삭제하더라도 장기적으로 다른 작업의 성능에 영향을 미치지 않는다는 것입니다.
Raphael

희생양 나무에서 삭제하는 두 가지 방법을 알고 있습니다. 한 가지 방법은 인서트를 미러링하며 상각 시간입니다. 내가 들었던 다른 방법은 전역 재 구축을 사용하고 상각되었지만 그 경우 스레딩을 유지하는 방법을 모르겠습니다. 트리의 일부에 모든 삭제 된 키가 아직 제거되지 않은 새 키를 삽입한다고 가정 해보십시오. 시간에 삽입 할 키의 선행 작업을 어떻게 찾 습니까? O ( 1 ) O ( LG N )O(lgn)O(1)O(lgn)
jbapple

2
@jbapple : Scapegoat 트리의 시간에 삭제를 수행하는 방법에는 두 가지 변형이 있습니다 . 하나는 노드를 그대로두고 삭제 된 것으로 표시하고 전역 재 구축을 통해 삭제 된 모든 노드를 제거하고 다른 하나는 실제로 노드를 제거하는 것입니다. 첫 번째는 분석하기가 쉽고 (두 번째에 대한 경계를 제공하므로 일반적으로 설명되는 이유입니다) 두 번째는 내가 따르는 것 입니다. 바닐라 이진 검색 트리 에서 시간 안에 삭제할 수 있습니다 시간 에 선행 작업 / 성공자 쿼리를 수행 할 수 있고 상각 된 시간에 균형을 유지 하면 나머지 범위가 제공됩니다. O ( 1 ) O ( 1 ) O ( 1 )O(1)O(1)O(1)O(1)
Alex ten Brink

아, 이제 이해합니다.
jbapple

2

소프트 힙은 이항 큐의 미묘한 수정입니다. 데이터 구조는 오류 매개 변수 과 비슷 합니다. insert, delete, meld 및 findmin을 지원합니다. 시간 이 걸리는 insert를 제외하고 각 연산 의 상각 복잡도는 입니다. 소프트 힙의 참신 성은 비교 기반 모델에서 힙의 복잡성에 대한 로그 바운드를 능가하는 것입니다. 정보 이론적 장벽을 없애기 위해, 일부 키의 값을 인위적으로 올리면 데이터 구조의 엔트로피가 줄어 듭니다. 이를 키 손상 이라고 합니다. 데이터 구조는 포인터 기반 (배열이나 숫자 가정이 아님)이며 모든 값에 최적입니다.O ( 1 ) 로그 ( 1 / ϵ ) ϵϵO(1)log(1/ϵ)ϵ 비교 기반 모델에서.

소프트 힙의 애플리케이션에는 그래프의 최소 스패닝 트리 계산, 백분위 수 및 선형 시간 순서 통계를 동적으로 유지하는 것이 포함됩니다. 또한 요소의 순위가 실제 순위 와 이상 차이가없는 근사 정렬과 같은 근사 계산에도 사용할 수 있습니다 .ϵn

독창적이고 명확하고 훌륭하게 작성된 논문은 Bernard Chazelle, The Soft Heap : 최적의 오류율을 가진 대략적인 우선 순위 대기열, Journal of the ACM, 47 (6), pp. 1012-1027, 2000을 참조하십시오 . SODA'09에서 더 단순하고 직관적 인 대안 구현 및 분석에 대해서는 Chazelle의 소프트 힙에 대한 간단한 구현 및 분석 인 Kaplan H. & Zwick U., 2009를 참조하십시오 .


매우 흥미로운 데이터 구조이지만 소프트 힙은 정확하지 않습니다. findmin은 최소값은 아니지만 대략적인 최소값 만 반환 할 수 있습니다. 링크를 주셔서 감사합니다 어쨌든 :)
알렉스 열 직전

1
@AlextenBrink : 많은 확률 적 알고리즘과 같은 데이터 구조의 요점은 대략적인 데이터 구조를 사용하여 정확한 답을 얻을 수 있다는 것입니다. 실제로 소프트 힙의 대략적인 특성으로 인해 최소 스패닝 트리에 대해 알려진 알려진 선형 시간 알고리즘에서 소프트 힙이 사용되는 것을 막을 수 없었습니다.
Jérémie

2

좋아, 마침내 당신이 찾고있는 복잡성을 얻었고, 가장 좋은 것은 문학에서 발견했습니다.

최악의 경우 복잡성

O(1)

O(1)

O(1)

O(log n)

참고

[3]O(1)O(log n)O(n)

Brodal, Gerth Stølting. '빠른 녹는 우선 순위 대기열'. 알고리즘 및 데이터 구조에 관한 제 4 차 국제 워크샵, 282–290에서 발췌. WADS '95. 영국 런던, 영국 : Springer-Verlag, 1995.

[3]: Dietz, Paul F 및 Rajeev Raman. '항상 업데이트 시간 핑거 검색 트리'. 정보 처리 서신 52, no. 3 (1994) : 147 – 154.

이것은 RAM 계산 모델을 사용하지만 :

우리의 데이터 구조는 단가 측정 및 로그 워드 크기의 RAM (Random-Access Machine) 모델을 사용합니다.

보다 최근에는, 계산 솔루션 의 Pointer-Machine 모델이 제공되었습니다 [1].

[1]: Brodal, Gerth Stølting, George Lagogiannis, Christos Makris, Athanasios Tsakalidis 및 Kostas Tsichlas. '포인터 머신의 최적의 손가락 검색 트리'. J. 컴퓨팅 시스. 공상 과학 67 번 2 (2003 년 9 월) : 381–418.


2

배열과 이진 트리라는 두 가지 데이터 구조를 유지하여이 문제에 접근합니다.

Ω(lognloglogn)Ω(logn)

O(logn)O(logn)

nullO(logn)

O(1)O(1)

O(logn)O(1)delete_at(idx)


1 Patrascu, Mihai 및 Erik D. Demaine. “세포 프로브 모델의 로그 하한.”SIAM J. Comput. 35 번 4 (2006 년 4 월) : 932–963. doi : 10.1137 / S0097539705447256.


1
O(logn)

"이진 검색 트리를 배열에 스레딩"이란 무엇입니까?
jbapple

@AT : jbapple의 정서를 공유합니다.
Raphael

Ω(k)kO(1)

일정한 시간에 회전을 구현하는 방법을 설명하는 업데이트는 배열에서 작동하지 않습니다. 이 답변은 여전히 ​​옳지 않습니다. 참조하는 Tarjan 논문은 노드와 포인터로 저장된 나무에 관한 것입니다.
jbapple

-2

O(1)O(log log n)

2007 년 논문 : 우선 순위 대기열과 Mikkel Thorup의 분류에 의한 동등성을 참조하십시오 .

참고 : 그는 Han & Thorup : 정수 정렬O(n log log n)


당신이 연결 한 논문이 흥미롭지 만, 그들이 제시하는 우선 순위 대기열은 일정한 시간 삭제를 갖지 않으므로 (추상을 올바르게 읽으면) 따라서 내가 요구하는 것이 아닙니다.
Alex ten Brink

-2

분석

o(n log log n)

o(log log n)

O(1)

O(n)

O(1)

O(1)

이행

  1. O(1)
  2. O(6)O(1)
  3. k±
    ((k>nsize1)(k<n0)((k<ni)(k>ni+1)))
    o(log log n)

[1] : Andersson, Arne 및 Christer Mattsson. 'O (log log n) 시간의 동적 보간 검색'. Automata, 언어 및 프로그래밍에서 Andrzej Lingas, Rolf Karlsson 및 Svante Carlsson에 의해 편집 됨 (700 : 15–27). 컴퓨터 과학 강의 노트. Springer Berlin / Heidelberg, 1993. http://dx.doi.org/10.1007/3-540-56939-1_58 .


2
글쎄, 인서트 타임은 끝이났다.
라파엘

nsize1n0nini+1

당신이 연결하는 논문의 초록을 읽으면,이 경계는 특정 분포의 입력에 대한 경계로 예상되는 것 같습니다. 따라서 내가 찾고있는 것이 아닙니다 : 나는 입력에 대해 언급 한 경계를 원합니다.
Alex ten Brink

O(log n)

@AT 대수 이진 검색에는 임의 액세스가 필요합니다. 기본 목록은 무엇으로 구현됩니까? 당신은 정말로 당신의 주장 된 경계에 대해 논쟁해야합니다. 또한 "목록의 위치"는 모호합니다. 어떤 위치와 기호가 무엇을 의미합니까? 모든 사람이 귀하가 연결 한 논문에 접근 할 수있는 것은 아닙니다. 답변을 (포함) 자급 자족하고 최소한 사실을 요약 해보십시오. 이 시점에서 나는 당신의 대답이 옳다고 생각하지 않습니다.
Juho
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.