簡體   English   中英

優先級隊列之類的結構,但下限類似

[英]Structure like priority queue but with something like lower bound

我想要一個結構來存儲(例如)我可以在其中插入和刪除元素的數字,我的結構始終保持排序(就像優先級隊列一樣),但是可以知道給定數字在哪里,並且每個操作都以對數時間進行。

也許使用lower_bound,upper_bound或僅進行二進制搜索,但是在priority_queue中,阻止我進行二進制搜索的原因是我無法訪問只有第一個索引的元素。

優先級隊列不會使事物保持排序。 至少,不是通常。 優先級隊列使您可以快速獲取序列中的下一項。 但是您無法有效地訪問隊列中的第五項。

我知道三種建立優先級隊列的方法,在這些隊列中,您可以通過鍵有效地訪問項目:

  • 使用平衡的二進制搜索樹來實現隊列。 盡管所有操作均為O(log n),但典型的運行時間比二進制堆慢。
  • 將堆優先級隊列實現為跳過列表 這是一個不錯的選擇。 我見過有人報告說,跳過列表優先級隊列的性能優於二進制堆。 搜索[C ++跳過列表]將返回許多實現。
  • 我所謂的索引二進制堆也可以工作。 基本上,您將哈希映射或字典與二進制堆結合在一起。 該映射由鍵索引,其值包含堆數組中該項的索引。 這樣的東西並不難構建,並且非常有效。
  • 想一想,您可以為任何類型的堆創建索引版本。

您有很多選擇。 我個人比較喜歡跳過列表,但是您的里程可能會有所不同。

正如我所指出的那樣,索引的二進制堆是一種混合數據結構,它維護一個字典(哈希圖)和一個二進制堆。 簡要說明其工作原理:

字典關鍵字是用於查找放入堆中的項目的字段。 該值是一個整數:該項目在堆中的索引。

堆本身是在數組中實現的標准二進制堆。 唯一的區別是,每次將項目從堆中的一個位置移動到另一個位置時,都會更新其在字典中的位置。 因此,例如,如果交換兩個項目,則不僅必須交換項目本身在數組中的位置,還必須交換它們在字典中存儲的位置。 例如:

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操作以及其他兩個操作:

  • rank(elem):返回排序后的元素將占用的索引。
  • index(k):給定索引k,返回排序序列中該索引處的元素。

以上兩個操作的運行時間為O(log n),因此非常快。

您可以將訂單統計樹視為優先級隊列。 插入與普通的BST插入一樣工作,要提取最低/最高元素,您只需從樹中刪除最小/最大元素,就可以在時間O(log n)中通過沿着樹的左或右棘走而完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM