우선 순위 대기열은 항목을 정렬 된 순서로 유지하지 않습니다. 최소한, 일반적으로는 아닙니다. 우선 순위 대기열을 사용하면 시퀀스의 다음 항목을 빠르게 얻을 수 있습니다. 하지만 대기열에있는 다섯 번째 항목에 효율적으로 액세스 할 수는 없습니다.
몇 가지 옵션이 있습니다. 나는 오히려 건너 뛰기 목록을 좋아하지만 나 자신의 마일리지는 다를 수 있습니다.
인덱스 된 바이너리 힙은 사전 (해시 맵)과 바이너리 힙을 유지하는 하이브리드 데이터 구조입니다. 간단히 작동 원리 :
사전 키는 힙에 넣은 항목을 검색하는 데 사용하는 필드입니다. 값은 정수입니다. 힙에있는 해당 항목의 인덱스입니다.
힙 자체는 배열에 구현 된 표준 바이너리 힙입니다. 유일한 차이점은 힙의 한 위치에서 다른 위치로 항목을 이동할 때마다 해당 위치를 사전에서 업데이트한다는 것입니다. 따라서 예를 들어 두 항목을 서로 바꾸면 배열의 항목 자체뿐만 아니라 사전에 저장된 항목의 위치도 바꿔야합니다. 예 :
heap is an array of string references
dict is a dictionary, keyed by string
swap (a, b)
{
// swap item at heap[a] with item at heap[b]
temp = heap[a]
heap[a] = heap[b]
heap[b] = temp
// update their positions in the dictionary
dict[heap[a]] = b
dict[heap[b]] = a
}
표준 바이너리 힙 구현의 매우 간단한 수정입니다. 항목을 이동할 때마다 위치를 업데이트하는 데주의해야합니다.
또한 등 페어링 힙, 피보나치 힙, 기울기 힙,
당신이 무엇을 요구하고 있는지 분명하지 않지만, std :: set은 어떻습니까? –
세트를 사용하면 로그 시간에 요소가 어디에 있는지 알 수 없습니다. 예를 들어 lower_bound가있는 요소를 가리키는 포인터를 얻을 수 있지만 그 위치를 알기 위해서는 선형 포인터 사이의 거리가 필요합니다. – seba
[건너 뛰기 목록] (https://en.wikipedia.org/wiki/Skip_list)처럼 들립니다.) 당신이 찾고있는 것입니다. 또한 인덱스 된 힙을 사용하여 임의 항목에 대한 O (1) 액세스 권한을 부여 할 수도 있습니다. –