요청에 따라 질문을 공식화 한 후에 찾은 구조는 다음과 같습니다.
기본 아이디어는 스레드 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)