陣列和連結串列的區別與優缺點
阿新 • • 發佈:2018-11-16
1.儲存
陣列儲存必須有提前宣告空間,因為陣列的儲存是連續的,沒有足夠的空間是無法儲存陣列的。
連結串列可以將資料儲存在不連續的空間中,從第一個空間開始,連結串列會記錄下下一個空間的位置,這樣就能檢索到整條連結串列了
2.查詢
根據陣列的特有屬性,只要找到第一個元素就能知道所有元素的地址,因為是連在一起的,所以理論上,get(0)與get(10000)所用的時間是一樣的。
連結串列就不一樣了,因為每個元素只知道自己上一個和下一個元素的地址(雙向連結串列),所以得一個一個的查詢,這裡有個問題要注意一下,比如這個連結串列共有100個元素,是不是get(99)耗時最多呢?答案是否定的,這裡以linkedlist原始碼為例,在get時會進行一個判斷,如果get的索引小於size的一半就從0開始檢索,否則從99開始檢索,就是順序查詢與倒序查詢,所以理論上查詢中位數消耗的時間最長,下面是linkedlist中get方法的原始碼片段:
3.插入與刪除
陣列插入一個數據比較複雜,先要判斷陣列空間還能不能放得下,有足夠空間的情況下將需要插入位置後面的陣列整體向後移動,最後把這個數插入進來,如果陣列沒有足夠的空間還需要進行擴容操作,費時費力。
連結串列因為對整塊空間大小沒有要求,見縫插針即可,所以隨便找個地方存放這個元素,然後把需要插入的位置前一個元素的next指標指向這個新的元素,然後再把插入資料的next指標指向下一個元素(pre指標修改類似),建明快捷,刪除一個元素也是一樣,陣列要整體移動,而連結串列只需要移動指標,所以在這個方面連結串列的效率要大大的高於陣列。
陣列的查詢時間複雜度O(1) 修改的時間複雜度O(n)
連結串列的查詢時間複雜度O(n) 修改的時間複雜度O(1)