[英]Structure like priority queue but with something like lower bound
我想要一個結構來存儲(例如)我可以在其中插入和刪除元素的數字,我的結構始終保持排序(就像優先級隊列一樣),但是可以知道給定數字在哪里,並且每個操作都以對數時間進行。
也許使用lower_bound,upper_bound或僅進行二進制搜索,但是在priority_queue中,阻止我進行二進制搜索的原因是我無法訪問只有第一個索引的元素。
優先級隊列不會使事物保持排序。 至少,不是通常。 優先級隊列使您可以快速獲取序列中的下一項。 但是您無法有效地訪問隊列中的第五項。
我知道三種建立優先級隊列的方法,在這些隊列中,您可以通過鍵有效地訪問項目:
您有很多選擇。 我個人比較喜歡跳過列表,但是您的里程可能會有所不同。
正如我所指出的那樣,索引的二進制堆是一種混合數據結構,它維護一個字典(哈希圖)和一個二進制堆。 簡要說明其工作原理:
字典關鍵字是用於查找放入堆中的項目的字段。 該值是一個整數:該項目在堆中的索引。
堆本身是在數組中實現的標准二進制堆。 唯一的區別是,每次將項目從堆中的一個位置移動到另一個位置時,都會更新其在字典中的位置。 因此,例如,如果交換兩個項目,則不僅必須交換項目本身在數組中的位置,還必須交換它們在字典中存儲的位置。 例如:
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
}
這是對標准二進制堆實現的非常簡單的修改。 您只需要在每次移動項目時小心更新位置即可。
您還可以使用基於節點的堆(例如配對堆,斐波納契堆,偏斜堆等)來執行此操作。
我認為您正在尋找訂單統計樹 ,這是一種增強的BST,它支持時間為O(log n)的所有常規BST操作以及其他兩個操作:
以上兩個操作的運行時間為O(log n),因此非常快。
您可以將訂單統計樹視為優先級隊列。 插入與普通的BST插入一樣工作,要提取最低/最高元素,您只需從樹中刪除最小/最大元素,就可以在時間O(log n)中通過沿着樹的左或右棘走而完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.