據說LinkedList的複雜性刪除和添加操作是O(1)
。在ArrayList
的情況下,它是O(n)
。爲什麼鏈表刪除和插入操作的複雜度爲O(1)?它不應該是O(n)
計算大小爲「M」的ArrayList:如果我想刪除第N個位置的元素,那麼我可以直接使用索引在第N個位置(我不必遍歷到第N個索引),並且那麼我可以刪除元素,直到這一點的複雜性是O(1),那麼我將不得不移動其餘的元素(MN移位),所以我的複雜性將是線性的,即O(M-N + 1)。因此在最後的刪除或插入會給我最好的性能(如N〜M),並且在開始時的刪除或插入將是最差的(如N〜1)。
現在,大小爲「M」的LisnkedList:因爲我們無法直接到達LinkedList中的第N個元素,所以要訪問第N個元素,我們必須遍歷N個元素,因此LinkedList中的搜索比ArrayList更昂貴。 ..但刪除和添加操作被認爲是O(1)LinkedList的情況下,在LinkedList中沒有涉及Shift,但是涉及rigary的遍歷操作?所以複雜度應該是O(n)的次序,其中最差的性能將在尾節點處,並且最佳性能將會在頭節點處。
任何人都可以請解釋一下爲什麼我們在計算LinkedList刪除操作的複雜度時不考慮遍歷成本?
所以我想了解它如何在java.util包中工作。如果我想在C或C++中實現相同,我將如何實現O(1)用於隨機刪除和插入LinkedList中?
[LinkedList的add(int,E)的O(1)複雜性如何重複?](http://stackoverflow.com/questions/15732334/how-is-linkedlists-addint-e-of-o1 -complexity) – jdigital
O(1)用於插入或刪除在雙鏈表中找到的位置以執行操作。如果該位置既不是列表的頭部也不是尾部,並且您沒有以其他方式明確指出它,那麼您必須找到它並且該部分是O(n)。 –