end
가 그 우선순위를 가장 만족하는 루트 노드를 가리킨다meldable single-ended pq
: 두 개 이상의 우선순위 큐를 병합해 하나의 우선순위 큐로 만들어주는 자료구조 - leftist trees
, binomial heaps
fibonacci heaps
, pairing heaps
네트워크 버퍼에 DEPQ가 사용될 수 있다! 우선순위를 가진 패킷을 해당 큐에 받는다고 하자. 가장 먼저 보내야 하는(=우선순위 최대) 패킷은 2번 연산으로, 패킷을 버퍼에 삽입할 때에는 3번 연산으로, 버퍼가 가득 찰 때에는 4번 연산으로 핸들링해야 한다!
meldable PQ
을 사용하는 효율적인 트리 구조n
: 병합될 두 우선순위 큐가 가지고 있는 모든 원소 개수힙을 사용할 때 병합은 이 걸린다!
extended binary tree
) 채용 → internal nodes
, external nodes
두 가지 종류internal nodes
)가 자식 노드 두 개를 가질 수 있도록 함x
: (1). leftChild(x)
(2). rightChild(x)
(3). shortest(x)
: 노드 x
에서 출발, 다른 external node
로 가는 가장 짧은 경로의 길이shortest
계산: (1). external
이라면 0 리턴 (2). internal
이라면 두 자식 노드의 shortest
중 최솟값 + 1 리턴(재귀적 정의)leftist trees
는 (존재한다면) 왼쪽 자식 노드의 shortest
가 우측 자식의 shortest
보다 언제나 같거나 크다.internal
노드 n
개를 가지고 있는 leftist tree
의 루트 노드 r
이 있을 때 이고 루트 노드에서 가장 오른쪽에 치우쳐 있는 external
노드 경로는
shortest(r)
의 정의에 따르면 첫 번째 레벨에서는external
노드가 없다. 즉 적어도 개의internal
노드를 가진다.
leftist trees
는 각각 일종의 최소/최대 트리leftist tree
에 원소 x
를 삽입할 때: (1). 하나의 원소 x
만 가지고 있는 최소 leftist tree
를 만들기 (20. 두 최소 leftist trees
를 병합하기leftist tress
에서 최솟값을 삭제할 때: 루트 노드의 우측 서브 트리와 좌측 서브 트리를 병합하고 기존 루트 노드는 리턴rightmost
경로를 따라 모으면서 이진 트리 만들기leftist tree
로 만들기 위해 필요한 만큼 좌측, 우측 서브 트리를 바꾸기leftists tree
의 왼쪽부터 붙을 브런치를 교환하면서 만들어가기
leftist tree
를 한 번 구성한 뒤에는 필요 조건인shortest
의 경로 길이가 좌측 서브 트리가 우측 서브 트리보다 같거나 커야 한다는 점을 만족할 수 있도록 계속해서 교환하자!
HBLT
처럼 트리 내 external
노드까지의 경로 길이가 아니라 트리를 구성하는 노드의 개수를 고려하는 자료 구조x
의 가중치인 는 루트 노드 x
및 서브트리의 internal
노드 개수다.extenral
노드일 때에는 가중치 값은 0internal
노드일 때에는 자식 노드의 가중치를 합한 데 + 1을 리턴
external
노드의 가중치 값이 0이기 때문에 리프 노드부터 계산, 루트 노드까지 가중치 값을 계산하는 게 보다 편리하다!
internal
노드에서 좌측 자칙의 가중치 값이 우측 자식 가중치 값 이상이라면 WBLT
로 간주할 수 있다.최대, 최소
WBLT
는 곧WBLT
인 최대, 최소 트리이다!
WBLT
의 특정 노드 x
는 해당 노드에서 가장 우측에 있는(rightmost
)까지의 길이가 을 만족한다. Leftist trees
에서 지원 가능한 모든 함수 가능leftist trees
에 비해 특정 상황에서는 이 걸릴 수도 있음 → 비용이 큰 연산을 비용이 작은 연산에 amortize
할 때 시간 복잡도를 또는 에 할 수 있음.min
이 해당 이진 힙을 포인터로 가리키고 있음x
노드 삽입 min
이 가리키고 있는 원형 리스트에 해당 노드 삽입min
이 0이거나 해당 노드 x
의 키 값이 더 작을 때에만 min
값이 새로 갱신됨non-empty
) 이진 힙을 병합min
포인터constant
이기 때문에 결과적으로 병합 연산 또한 min
이 가리키는 값을 리턴한 뒤 생기는 서로 다른 트리를 다시 이진 힙 상태(각 트리의 degree
가 서로 다른 상태)로 만드는 과정까지 포함min
이 가리키고 있는 노드를 리턴, 해당 노드가 루트 노드인 이진 힙의 서브 트리를 분리degree
를 가지고 있는 최소 트리 쌍을 조인degree
가 모두 다른 상태)를 만족할 때까지 반복a
에서 특정 노드 b
를 삭제하는 과정a
와 b
가 같다면 delete min
연산을 수행b
노드가 들어 있는 이중 연결 리스트에서 해당 노드 삭제b
의 서브 트리를 b
가 연결되어 있는 해당 트리에서 분리b
를 리턴해당 노드를 분리해서 서브 트리 두 개가 더 만들어졌다 할지라도 이진 힙의 삭제처럼 트리를 조인하지는 않는다!
b
의 키를 감소시키는 과정b
의 키를 감소시키기b
가 최소 트리의 루트가 아니고 현재 키 값이 부모 노드보다 작다면 b
를 이중 연결 리스트에서 삭제, 최소 트리 루트의 이중 연결 리스트에 삽입