資料結構與演算法之美(筆記1)陣列

2021-09-12 08:29:50 字數 2176 閱讀 3817

鍊錶適合插入,刪除,時間複雜度是o(1),陣列支援隨機訪問,根據下標隨機訪問的時間複雜度是o(1)。

插入操作

假設陣列的長度為 n,現在,如果我們需要將乙個資料插入到陣列中的第k個位置。為了把第k個位置騰出來,我們需要把 k後的 n-k  位置順序向後移動一位。

最好時間複雜度:在最後一位插入,時間複雜度為:o(1)。

最壞時間複雜度:在第一位插入,時間複雜度是:o(n)。

平均時間複雜度:我們有可能在n個位置插入,每一種情況的可能都是1/n,所以平均情況時間複雜度為 (1+2+…n)/n=o(n)。

如果陣列中的資料是有序的,我們在某個位置插入乙個新的元素時,就必須按照剛才的方法搬移 k 之後的資料。但是,如果陣列中儲存的資料並沒有任何規律,陣列只是被當作乙個儲存資料的集合。那麼這種情況之下,我們可以把插入的資料放到陣列的最後一位,然後與第k個位置進行交換,這樣就把時間複雜度降到o(1)了。

刪除操作

與插入一樣,我們刪除資料之後,也要搬移資料。

最好時間複雜度:在末位進行刪除,o(1)。

最壞時間複雜度:搬移n-1個位置,o(n)。

平均時間複雜度:與插入類似,時間複雜度為o(n)。

優化:在某些情景下,我們可以將多次刪除操作在一起執行,刪除的效率會提高。我們先記錄下已經刪除的資料,當陣列沒有空間儲存的時候,再觸發一次真正的資料搬移。

容器最大的優勢就是可以將很多陣列操作的細節封裝起來。比如,陣列插入,刪除資料時候,需要搬移其他資料。另外,它還支援動態擴容。

1.如果特別關注效能,首選陣列。

2.如果資料的大小已經事先知道,優先使用陣列。

3.二維矩陣,使用陣列更加直觀。

所以,對於平常的開發,直接使用容器就足夠了,省時省力。畢竟損耗一丟丟效能,完全不會影響系統整體的效能。但如果是一些底層的開發,什麼網路框架,效能優化需要做到極致,就要使用陣列。

因為陣列在計算某個位置的時候(假設從0開始),是通過下面這個公式來計算的:

a[k]_address = base_address + k * type_size
如果這個時候,是從1開始的話,計算某個資料的位置就是:

a[k]_address = base_address + (k-1)*type_size
對比這兩個公式,從1開始編號,每次隨機訪問陣列元素都要進行多了一次減法運算,對與cpu來說,就是多了一次減法指令。 

我們事先給陣列指定乙個大小size,並且通過乙個used表示已經使用了的數量,當used大於等於size的時候,我們就把size擴大兩倍。這裡我們需要乙個size*2的陣列,然後把之前的陣列複製到這個擴大之後的陣列。它的均攤時間複雜度是o(1)。

這裡是c++**實現:

#include using namespace std;

class array

arr = new int[size];

capacity = size;

used = 0;

}void print()

思路是這樣的:假設第乙個陣列l1有m個資料,第二個陣列l2有n個資料,我們建立乙個新的,大小為m+n的陣列,用兩個游標 i和 j 遍歷l1和l2,兩個陣列的資料每一次都相互比較一次,把小的放到新的陣列,然後對應的游標向右移動,直到某個游標到達界限,這時候我們再判斷哪個陣列還沒有遍歷完,然後將剩下的資料複製到新的陣列之中就可以了。它的時間和空間複雜度都是o(n)。

這裡是**實現:

int main();

int l2[6] = ;

int l3[11] = ;

int i=0,j=0,k=0;

while(i < 5 && j < 6)else

}if(i<5)

}else

}for(int i=0;i<11;++i)

return 0;

}

資料結構與演算法之美 4 陣列

陣列 array 是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。在面試的時候,面試官常常會問陣列和鍊錶的區別,很多人都回答說,鍊錶適合插入 刪除,時間複雜度 o 1 陣列適合查詢,查詢時間複雜度為 o 1 實際上,這種表述是不準確的。陣列是適合查詢操作,但是查詢的時間...

資料結構與演算法之美

什麼是資料結構?什麼是演算法 狹義重點 複雜度分析 方法 邊學邊練,適度刷題 複雜度分析 時間複雜度 常見時間複雜度 非多項式量級 非常低效的演算法 空間複雜度 漸進空間複雜度,表示演算法的儲存空間和資料規模的增長關係 最好情況時間複雜度 理想情況的時間複雜度 最壞情況時間複雜度 最糟糕的情況下的時...

資料結構與演算法之美(筆記9)雜湊演算法

我們前面講到雜湊表,雜湊函式,這裡又是雜湊演算法,實際上,雜湊函式就是雜湊演算法的乙個特例。只不過在雜湊表中,我們通常希望雜湊函式簡單,才不會影響查詢等的效能。雜湊演算法的定義和原理很簡單,就是把任意二進位制串值對映為固定長度的二進位制值串,這個對映的規則就是雜湊演算法,而通過原始的資料對映之後得到...