鏈表和數組的隨機刪除的問題


對於隨機刪除,
鏈表需要迭代n次找到對應的項然后修改指針指向實現刪除,那么復雜度是O(n)
數組根據下標直接找到對應項然后復制元素實現刪除,復雜度還是O(n)
thinking in java的作者說對比下,在鏈表中重復迭代n次的代價可以忽略。。不理解。。
既然一樣,為什么講到添加刪除選擇數據結構的時候鏈表就會優於數組?
求高人解答。。。

10 个解决方案

#1


數組元素是連續存放的,因此刪除一個元素之后,所有的后續元素必須全部前移一格,這個非常的耗時。而鏈表就沒有這樣的困擾。

#2


我想可能是鏈表的節點是相對獨立的吧,刪除后只要把該節點的前和后連接上就可以了。而數組不一樣,刪除一個元素后它的前和后面的就不能夠連接起來了。

#3


引用 1 樓  的回復:
數組元素是連續存放的,因此刪除一個元素之后,所有的后續元素必須全部前移一格,這個非常的耗時。而鏈表就沒有這樣的困擾。

這個回答是對的!

#4


引用 1 樓  的回復:
數組元素是連續存放的,因此刪除一個元素之后,所有的后續元素必須全部前移一格,這個非常的耗時。而鏈表就沒有這樣的困擾。

但是在刪除前肯定要查找這個元素,查找的話復雜度為0(n),即使刪除復雜度為O(1),加起來還是O(n)。。比如在隊尾,都要迭代n次才能實現功能。。只不過數組在移動元素耗時鏈表在查找元素耗時。計算平均情況下刪除復雜度都是O(n),我想問的是這個。。。

#5


O(n)只是個概念性質的表達,只能表達在n變化時函數的變化趨勢。但不同的O(n)之間則不能等同看待。因為被忽略掉的常數們會使得兩者間具有成倍的差異。

就分別用一維數組和鏈表組成的列表來說,具體情況不同還是會有很大差異:

當數組非常大時,刪除其中一個元素帶來的移動操作就非常可觀。如果刪除操作主要發生在接近表頭的位置,那移動操作更是巨大。而這樣的情況在鏈表來說就比較容易解決了。如果刪除操作主要發生在接近表尾的位置,顯然數組就要比鏈表好很多。如果完全無規律,那得看具體機器更適合於哪種操作了。內存移動更快還是鏈表查找更快,相比之下我想多數機器應該都是內存移動速度快些。

不過,真正碰到這樣需要頻繁插入刪除的大表,估計沒人會選擇數組或者鏈表了——純屬自虐嘛。

#6


另外,如果不是已經排好序的表,那數組方式在刪除前還是要做查找的。

#7


引用 6 樓  的回復:
另外,如果不是已經排好序的表,那數組方式在刪除前還是要做查找的。

那大家所說的刪除添加鏈表優於動態數組的原因是什么?是不是就是說復雜度雖然用大O都是O(n),但由於常數項還是鏈表比動態數組好了?
另外請教下頻繁插入刪除一般會用什么?

#8


從時間上考慮,鏈表只是讀了n個節點,但是數組讀了后面的節點還寫了這么多個節點。讀的時間較短,寫的時間較長。
從實際應用看,元素個數會有很多,如果僅在第二個位置刪除,顯然數組效率多么低下。

#9


對大多數機器來說,查找的時候數組要比鏈表快些。

頻繁插入刪除時一般會用樹結構。雖然每一次操作很復雜,但查找非常快,插入刪除的操作也遠比數組快捷。

#10


引用 9 樓  的回復:
對大多數機器來說,查找的時候數組要比鏈表快些。

頻繁插入刪除時一般會用樹結構。雖然每一次操作很復雜,但查找非常快,插入刪除的操作也遠比數組快捷。


學習!

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com