簡體   English   中英

Java中的數據結構,支持快速搜索並在重復項中刪除數組

[英]Data structure in Java that supports quick search and remove in array with duplicates

更具體地說,假設我有一個重復的數組:

{3,2,3,4,2,2,1,4}

我想擁有一個支持搜索的數據結構,並比O(n)更快地刪除某些值的首次出現,例如,如果該值為4,則它將變為:

{3,2,3,2,2,1,4}

我還需要按照相同的順序從頭開始迭代列表。 不需要其他操作,例如get(index)或insert。
您可以使用O(n)時間來記錄數據結構中的原始數據(例如,它是int []),我只需要稍后的搜索並比O(n)更快地刪除它。
如上所示,“搜索並刪除”被視為一次操作。
如果必須自己創建,則可以使用LinkedList存儲數據,並使用HashMap將每個鍵映射到所有出現的節點及其上一個和下一個節點的列表。
這是正確的方法嗎? Java中已經有更好的選擇了嗎?

由於您的要求是應刪除該元素的第一個匹配項,並保留其余的匹配項,因此您無法比O(n)更快地執行此操作,因為您肯定需要遍歷列表的末尾才能找到如果還有另一件事發生。 Java包中沒有Oracle提供的標准api可以做到這一點。

您描述的數據結構,本質上是混合鏈表和映射,我認為這是處理您所陳述問題的最有效方法。 您必須自己跟蹤節點,因為Java的LinkedList不能提供對實際節點的訪問。 這里的AbstractSequentialList可能會有所幫助。

您需要的索引結構是從元素值到列表中該元素的外觀的映射。 我建議從hashCode % modulus到(值,主列表節點列表)的鏈接列表的哈希表。

請注意,當您遇到通用哈希沖突時,在最壞的情況下,這種方法仍然是O(n)。 無論您使用開放式還是封閉式哈希,這都適用。 通常情況下,它應該更接近O(ln(n)),但我不准備證明這一點。

還請考慮跟蹤所有這些開銷是否真的值得。 除非您已經對運行代碼進行了LinkedList分析,並確定因為remove為O(n)導致LinkedList引起了問題,否則請堅持這樣做直到您這樣做。

暫無
暫無

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

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