陣列(array)是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料
第一是線性表(linear list)。顧名思義,線性表就是資料排成像一條線一樣的結構。每個線性表上的資料最多只有前和後兩個方向。其實除了陣列,鍊錶、佇列、棧等也是線性表結構
非線性表,比如二叉樹、堆、圖等。之所以叫非線性,是因為,在非線性表中,資料之間並不是簡單的前後關係。
插入操作:假設陣列的長度為 n,現在,如果我們需要將乙個資料插入到陣列中的第 k 個位置。為了把第 k 個位置騰出來,給新來的資料,我們需要將第 k~n 這部分的元素都順序地往後挪一位
如果在陣列的末尾插入元素,那就不需要移動資料了,這時的時間複雜度為 o(1)。但如果在陣列的開頭插入元素,那所有的資料都需要依次往後移動一位,所以最壞時間複雜度是 o(n)。 因為我們在每個位置插入元素的概率是一樣的,所以平均情況時間複雜度為 (1+2+…n)/n=o(n)
刪除操作:和插入類似,如果刪除陣列末尾的資料,則最好情況時間複雜度為 o(1);如果刪除開頭的資料,則最壞情況時間複雜度為 o(n);平均情況時間複雜度也為 o(n)。
**注意:**陣列越界在 c 語言中是一種未決行為,並沒有規定陣列訪問越界時編譯器應該如何處理。因為,訪問陣列的本質就是訪問一段連續記憶體,只要陣列通過偏移計算得到的記憶體位址是可用的,那麼程式就可能不會報任何錯誤
從陣列儲存的記憶體模型上來看,「下標」最確切的定義應該是「偏移(offset)」。如果用 a 來表示陣列的首位址,a[0]就是偏移為 0 的位置,也就是首位址,a[k]就表示偏移 k 個 type_size 的位置,所以計算 a[k]的記憶體位址只需要用這個公式:
a[k]_address = base_address + k * type_size
而如果從1開始編號,則該公式變為:
a[k]_address = base_address + (k-1)*type_size
多了乙個減法指令,不夠高效,所以要用從0開始
《資料結構與演算法之美》學習筆記 3 資料結構
陣列定義 陣列 array 是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。第一是線性表 linear list 顧名思義,線性表就是資料排成像一條線一樣的結構。每個線性表上的資料最多只有前和後兩個方向。除了陣列,鍊錶 佇列 棧等也是線性表結構。而與它相對立的概念是非線...
《資料結構與演算法之美》學習筆記之開篇
本系列是極客時間中前 google 工程師王爭 資料結構與演算法之美 專欄的學習筆記,想加強資料結構及演算法能力的同學可以直接購買此專欄,跳轉鏈結在此 從廣義上講,資料結構就是指一組資料的儲存結構。演算法就是運算元據的一組方法。資料結構和演算法是相輔相成的。資料結構是為演算法服務的,演算法要作用在特...
資料結構與演算法之美學習筆記 5 9章
陣列是一種線性表資料結構,他用一組連續的記憶體空間,來儲存相同型別的資料 這裡要注意不根據下標是不能隨機訪問的啊 假設乙個長度為10的int型陣列,會分配一塊連續記憶體空間 1000 1039,其中,記憶體塊首位址是1000 我們可以通過以下公式快速獲取到指定下標的元素 a i address ba...