1. 陣列,
所有元素都連續的儲存於一段記憶體中,且每個元素占用的記憶體大小相同。這使得陣列具備了通過下標快速訪問資料的能力。
但連續儲存的缺點也很明顯,增加容量,增刪元素的成本很高,時間複雜度均為 o(n)。
增加陣列容量需要先申請一塊新的記憶體,然後複製原有的元素。如果需要的話,可能還要刪除原先的記憶體。
刪除元素時需要移動被刪除元素之後的所有元素以保證所有元素是連續的。
增加元素時需要移動指定位置及之後的所有元素,然後將新增元素插入到指定位置,如果容量不足的話還需要先進行擴容操作。
總結一下陣列的優缺點:
2.鍊錶,
由若干個結點組成,每個結點包含資料域和指標域。
一般來講,鍊錶中只會有乙個結點的指標域為空,該結點為尾結點,其他結點的指標域都會儲存乙個結點的記憶體位址。
鍊錶中也只會有乙個結點的記憶體位址沒有儲存在其他結點的指標域,該結點稱為頭結點。
鍊錶的儲存方式使得它可以高效的在指定位置插入與刪除,時間複雜度均為 o(1)。
在結點 p 之後增加乙個結點 q 總共分三步:
a.申請一段記憶體用以儲存 q (可以使用記憶體池避免頻繁申請和銷毀記憶體)。
b.將 p 的指標域資料複製到 q 的指標域。
c.更新 p 的指標域為 q 的位址。
刪除結點 p 之後的結點 q 總共分兩步:
a.將 q 的指標域複製到 p 的指標域。
b.釋放 q 結點的記憶體。
演算法學習筆記之大O表示法 陣列與鍊錶
程式的演算法有好有壞,而執行時間和空間占有率是關鍵。一般使用大o表示法討論執行時間,它指出了最糟糕情況下的執行時間。使用陣列意味著資料在記憶體中都是相連的 緊靠在一起 就像朋友聚餐,找到地方後又來了乙個朋友,但原來的地方沒有空位置,只得再找乙個可以坐下所有人的地方,但是如果又來了乙個朋友,而之前的地...
演算法學習 反轉鍊錶
輸入乙個鍊錶的頭結點,將這個鍊錶反轉並輸出它的新的頭結點 public class listnode 方法一 public class solution h1.next null return head 方法二 其實我寫的這兩個差不多,為什麼要寫相似的兩個?因為我要學習區別使用p和p.next的區別...
演算法學習 2 4 鍊錶
前言 在儲存一大波數的時候我們通常用的是陣列,但有時候陣列顯得不太靈活 例如 從小到大排好的一串數字 2 3 5 8 9 10 18 26 32,我們要插入6使得其順序依然不變,如果用陣列的話就要讓8以及8往後的數都要往後挪一位,很浪費時間,但如果用鍊錶操作只需要將5的指標指向6的指標,再將6的指標...