[英]How to efficiently remove an element from java LinkedList
我有一個算法,我以某種方式通過圖中的節點,偶爾多次通過同一個節點,我需要形成一個傳遞的節點列表,這樣一個節點出現一次,我最后一次通過它。
例如,如果我通過節點A -> B -> C -> A -> C
,我最終需要的列表是[B, A, C]
。
我想要做的是使用LinkedList,這樣圖中的每個節點都將包含對LinkedList中其節點的引用。 然后,每次我通過一個節點,我將從LinkedList中刪除它的相應節點,並將其再次插入到LinkedList的末尾,並且操作的復雜性將只是O(1)
。
但是,當我開始實現這個時,我遇到了一個問題:顯然,java類LinkedList不允許我看到它的實際列表節點。 使用LinkedList的常規刪除函數來刪除包含給定圖節點的列表節點將是O(n)
而不是O(1)
,否定使用LinkedList開始的全部要點。
當然,我可以自己實現LinkedList,但我寧願避免這種情況 - 在我看來,如果我必須在java中實現LinkedList,我做錯了。
那么,有沒有辦法解決這個問題而不自己實現LinkedList? 有什么東西我不見了嗎?
看起來,你期待一種內置的方法,我認為沒有任何Collection提供這樣的功能。 你必須自己實現它,如@MartijinCourteaux所建議的那樣。 要么:
TreeSet<E>
這樣的Sorted Set集合,支持操作的O(log n)
成本: add, remove and contains
。 LinkedHashSet<E>
但要注意,與HashSet<E>
, LinkedHashSet
可以具有O(1)
預期的操作性能: add, contains, remove
但是性能可能略低於HashSet
,因為增加了維護費用鏈表。 但我們可以使用它而不會產生與TreeSet
相關的增加的成本。 但是, 如果將元素重新插入到集合中 ,則插入順序不會受到影響,因此請在重新插入之前嘗試刪除元素的第一次插入 。 LinkedHashMap保持輸入值的順序,並允許通過其鍵刪除節點,然后放回到最后。 我認為這就是你所需要的。
除非您的鏈表很大,否則只需使用常規數組列表即可實現快速性能。 您還應該考慮使用哈希集,如果順序不重要,如果插入順序很重要則鏈接哈希集,或者如果要對其進行排序則設置樹集。 它們不允許重復值,但對插入,刪除和包含具有良好的O性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.