陣列是線性表,就是資料排成像一條直線一樣的結構,除了陣列,鍊錶,佇列,棧都是線性結構
而非線性表就是二叉樹,堆,圖等,資料之間不是簡單的先後關係。
陣列有連續的記憶體空間和相同型別的資料。正式有了這兩個限制,才有了乙個堪稱殺手鐗的特性:「隨機訪問」,但是刪除,插入乙個資料,為了保證連續性,就需要做大量的資料搬移工作。
陣列和鍊錶的區別?
我們時常會回答:鍊錶適合插入,刪除,時間複雜度為o(1);陣列適合查詢,查詢時間複雜度是o(1)
實際上,這種表達是不準確的,陣列是適合查詢,但是查詢的時間複雜度並不是o(1).即便是排好序的陣列,用而發查詢,時間複雜度也是o(logn)。所以,正確的表述是,陣列支援隨機訪問,根據下表隨機訪問的時間複雜度是o(1)
為什麼陣列插入會很低效?
你插入乙個元素,其他元素就要往後面排,最壞的情況是o(n),因為我們在每個位置插入元素的概率是一樣,所以平均情況時間複雜度是(1+2+。。。n)/n = o(n)
如果陣列中的資料是有序的,我們在某一位置插入乙個新的元素,就必須按照剛才的方法搬移後面的資料,但是,若陣列沒有任何規律,如果要插入到第k個位置,為了避免大規模搬移,還有乙個簡單的就是直接將第k位資料搬移到陣列元素的最後,把新的元素直接放入第k個位置。
那刪除操作呢?
和插入資料類似,記憶體因為是連續的,也需要搬移,若刪除陣列末尾資料,就是o(1),刪除開頭就是o(n),平均也是o(n)。
為什麼大多數語言陣列都是0開頭?而不是1開頭呢?
從陣列儲存的記憶體模型上來看,「下標」最確切的定義應該是「偏移(offset)」,如果用a來表示陣列的首位址,a[0]就是偏移為0的位置,也就是首位址,a[k]就表示偏移k個type_size的位置,所以計算a[k]的記憶體位址只需要
a[k]_address = base_address + k * type_size
若是陣列從1開始計數,那麼我們計算陣列元素a[k]的記憶體位址就是
a[k]_address = base_address + (k-1) * type_size
從1開始編號,每次隨機訪問陣列元素都多了一次減法運算,對於cpu來說,就是多了一次減法指令。
在底層開發時,直接使用陣列可能會更合適。
資料結構之陣列
陣列的考點 1.二維陣列元素位址計算 三維陣列中元素個數的計算 選擇題 2.廣義表的基本概念 會求表尾 表頭,填空題 3.矩陣的壓縮儲存 壓縮儲存的目的 對稱矩陣壓縮儲存後的大小,填空題 針對考點,一一擊破。哈哈哈。第一部分 首先,二維陣列元素位址計算。注 只要知道以下三要素便可隨時求出任一元素的位...
資料結構之 陣列
陣列是由相同型別的元素的集合所組成的資料結構並且是分配一塊連續的記憶體來儲存。利用元素的索引 index 可以計算出該元素對應的儲存位址。一維陣列就是最簡單的陣列,就像 int data 二維陣列實質就是儲存的一維陣列,就像 int data 大於等於二維的陣列就叫多維陣列。需要初始化空間大小,並且...
資料結構之陣列
北航軟體工程專業考研991資料結構總結 三 陣列 1 一維陣列和二維陣列的儲存 2 矩陣的壓縮儲存的基本概念 3 對稱矩陣 對角矩陣以及三角矩陣的壓縮儲存。陣列 序列和值的偶對 1 一位陣列和二維陣列的儲存 一維陣列的儲存 a 1 n 1 i 二維陣列的儲存 行序儲存 按行儲存,先存第一行 a i ...