나는 우선 순위가 복합 형이고 일부만 정렬 된 객체를 가지고 있습니다 . 이 우선 순위에 따라 객체를 선택해야합니다 (즉, 매번 최소 항목 생성 ). 그러나 임의로 주문을 완료하는 대신 큐가 안정된 경우 최소 요소가 두 개 이상인 경우 가장 오래된 요소를 먼저 반환해야합니다.
부분 순서와 작동하는 힙 데이터 구조가 있습니까? 또는 일반 우선 순위 대기열을 수정하여 작업합니까? 필요한 알고리즘에 대한 일반적인 선택은 간단한 이진 또는 4 진 힙이지만 부분 순서로는 작동하지 않습니다.
우선 순위 값은 다음을 지원합니다.
- 작업을 사용한 부분 순서 . 부분 순서이므로 는 false이고 는 false 일 수도 있습니다. 나는 쓰기 ⋚ ̸ 나 그 경우입니다.
- y y ≼ x i n O ( n )
- 부분 순서에 대한 선형 확장을 정의 할 수 있습니다. 알고리즘이 그런 식으로 작동하므로 우선 순위 대기열에 사용하는 것이 쉬운 방법입니다. 그러나 순서는 성능에 영향을 미치며 삽입 순서는 최악의 경우를 피하는 것이 가장 좋습니다.
또한 이것을 사용하려는 알고리즘은 대기열의 모든 우선 순위를 파악해야합니다.
우선 순위는 실제 의미를 갖지만 변경 될 수 있으므로 다른 속성에 의존 할 수는 없습니다.
참고 : 이진 힙은 부분 순서로 작동하지 않습니다. , 및 c 로 이진 힙을 가정합니다 . 여기서 및 및 입니다. 순서대로 배치되므로
a (0)
/ \
b (1) c (2)
이제 d 가 삽입되었습니다. 다음 자유 위치는 b 의 왼쪽 자식 인 3 이므로
a (0)
/ \
b (1) c (2)
/
d (3)
경우 (의미하는 이행 성에서, 그러나에 대해 아무것도 말하지 않는다 와 )와 , 다음 함께 교환되지 않습니다 는 이하이기 때문에. 그러나 실제로는 보다 작지만 비교되지 않으므로 주 힙 불변은 유지되지 않습니다. 최고는 최소가 아닙니다.d ≼ c d b d ⋚ ̸ b d b a
나는 이항 힙 스타일의 힙 포리스트가 작동 할 수 있다고 생각합니다. 기본적으로 항상 새로운 값을 루트와 비교하고 비교 가능한 요소 만 함께 연결하는 것이 중요합니다. 따라서 포리스트의 트리가 임의의 크기로 만들어 지므로 힙에서 서로 비교할 수없는 세트 수에 따라 복잡성이 달라집니다. 다소 복잡성을 해결할 수 없다고 생각합니다 (비슷한 요소에 도달 할 때까지 비교를 계속해야합니다). 내가 놓친 것일 수도 있으므로 이것을 열어 둡니다.
참고 : 순서는 부분적 이며 선형 확장을 정의하는 방법이 있지만 타임 스탬프를 추가하고이를 보조 기준으로 사용하는 것은 그 중 하나 가 아닙니다 . 우리는 타임 스탬프에 할당한다고 가정 각 상기 순서 정의 로서 IFF 또는 ( 및 . 그런 다음 우리는 별개 있다고 가정 , , , 등 그 및 . 그런 다음 와a ≼ ′ a ≼ ′ b a ≼ b b ⋠ a t ( a ) ≤ t ( b ) a b c t ( a ) ≤ t ( b ) ≤ t ( c ) c ≤ a a ≼ ′ b 이지만 이므로 관계는 전 이적이지 않으므로 순서가 아닙니다. 이러한 종류의 확장은 약한 주문에만 적용되지만 부분적인 주문에는 적용되지 않습니다.
편집 : 나는 정의 된 집합에 충실하지 않을뿐만 아니라 실제로 대기열에있는 요소를 효율적으로 얻을 수 있어야한다는 것을 깨달았습니다. 따라서 하위 힙을 포함하는 특수 노드를 공통 힙 구조에 추가하는 것이 도움이 될지 여부를 고려하고 있습니다.