簡體   English   中英

類似於STL的Java紅黑樹/ TreeSet / Map以及具有非故障快速/安全迭代器的鏈表

[英]STL-like Java Red-black tree / TreeSet/Map and linked lists with non fail-fast/safe iterators

我正在尋找一個帶有紅黑樹和鏈接列表實現的庫,該實現提供不會快速失敗的迭代器。 我希望具有與使用STL在C ++中相同的功能,即:

  • 在樹/列表中插入不會使任何迭代器無效
  • 刪除僅使指向要刪除的元素的迭代器無效
  • 可以以某種方式存儲迭代器的“位置”並引用其指向的值

此實現將是不錯的選擇,因為它可以在使用列表/樹的一部分時對其進行修改。 這里有些例子:

  • 獲取鏈表/紅黑樹中的相鄰元素到O(1)中的某個存儲值
  • 批量插入/刪除(無限制,例如每個位置增量一次刪除)
  • 通過迭代器的位置在O(1)中拆分鏈表
  • 在存儲迭代器的位置時,可以進行更有效的刪除(例如,通過將迭代器保持在鏈接列表中的某個位置,刪除為O(1),而不是O(N))

我還希望該庫/源代碼/實現具有一些對Apache / GPL友好的許可證並且相當可擴展(因此,我可以自行修改以實現某些操作,例如上面示例中的操作)。

如果沒有這樣的庫,是否還有其他庫可以幫助我自己實現這兩個數據結構?

這些都很容易實現。 迭代器必須做三件事:

  1. 存儲兩個引用,一個存儲到“當前”元素,另一個存儲到外部容器對象(用於存儲根引用(樹)或頭/尾引用(列表)的Blob)。

  2. 能夠確定所引用的元素是否有效(很容易,如果父指針為空(樹)或上一個/下一個指針為空(列表),則最好是樹的根或列表的頭/尾)。 在無效的迭代器上嘗試執行任何操作時,都會拋出異常。

  3. 能夠找到prev / next元素。

有一些陷阱:對於列表,有效地支持java.util.ListIterator的nextIndex()和prevIndex()會很痛苦,當然,現在您遇到了處理並發修改的問題! 這是一個可能如何變壞的示例:

while (it.hasNext()) {
    potentially_delete_the_last_element()
    it.next() // oops, may throw NoSuchElementException.
}

避免這種情況的方法是永遠不要在檢查列表是否具有next / prev和實際檢索next / prev之間修改列表。

暫無
暫無

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

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