資料結構與演算法 03 陣列 Array

2021-10-04 17:48:01 字數 1323 閱讀 4402

陣列概念:用一組連續的記憶體空間,儲存一組相同型別的資料。

總結,我們可以將資料之間的關係大致分為兩類,線性結構和非線性結構。

我們訪問陣列中的資料時,通常根據資料的下標進行資料的檢視。我們申請乙個長度為10的陣列,儲存相同型別的資料。

我們從圖中可知,每乙個記憶體空間大小是一致的。當我們某乙個資料時,例如 a[9]=1000 +9 *3=1039

a[i]_address = base_address(首位址) + i * data_type_size(陣列每個元素的大小)
如果陣列下標從1開始

a[i]_address = base_address(首位址) + (i-1)* data_type_size(陣列每個元素的大小)
陣列下標從1 開始,這樣 cpu 每次訪問資料的時候都用進行一次減法指令的操作。所以陣列下標從 0 開始是不是更好一些呢。(注意:陣列下標從0開始,陣列越界問題一定要慎重)

通過上述講解我們可知道陣列記憶體空間的連續性,使得隨機訪問更加方便,時間複雜度為o(1),一定注意,我說的是隨機訪問,隨機訪問,隨機訪問。一定是隨機兩個詞,如果查詢特定的某乙個資料,我們還是需要通過遍歷的方法進行訪問,此時查詢具體某乙個資料的時間複雜度依然是o(n)。

2.2 時間複雜度分析(插入和刪除)

陣列記憶體的連續性,如果我們插入或者刪除某一條資料,可能造成其它資料的移動。

插入操作,最好的情況是在陣列後面進行插入,此時其他資料不需要移動,如果在a[0] 位置插入資料,其它的資料都要進行移動,此時時間複雜度為o(n),刪除操作同樣如此。所以無論是插入還是刪除操作,都可能會造成資料的移動,時間複雜度為 o(n)。

arraylist 封裝了陣列記憶體連續性的特性,並在陣列基礎之上公升級,如果申請空間大小是固定的,不支援動態擴容,而 arraylist 支援動態擴容,當空間不足時,自動擴容原來的1.5倍。

建立arraylist 時,需要制定資料的大小,且arraylist 無法儲存基本型別的資料,例如(int),但是儲存引用型別(integer),這就造成了裝箱操作,使得cpu的效能有所消耗。

arraylist 適合基本業務開發,陣列適合於底層框架開發,兩者各有優勢。

資料結構與演算法(03)

1.雙鏈表應用例項 1.1雙向鍊錶的操作分析和實現 使用帶head頭的雙向鍊錶實現 管理單向鍊錶的缺點分析 1 單向鍊錶,查詢的方向只能是乙個方向,而雙向鍊錶可以向前或者向後查詢。2 單向鍊錶不能自我刪除,需要靠輔助節點,而雙向鍊錶可以自我刪除,單鏈表刪除時節點,總是找到temp,temp是刪除節點...

資料結構與演算法03稀疏陣列與佇列

該二維陣列很多值是預設值 0,記錄了很多沒有意義的資料.稀疏陣列 將二維陣列 轉 稀疏陣列的思路 1.先遍歷二維陣列 得到非0資料的個數 int sum 0 for int i 0 i 11 i 2.建立對應的稀疏陣列 int sparsearr new int sum 1 3 給稀疏陣列賦值 sp...

資料結構 演算法 03

1.棧結構實現 棧可以用順序表實現,也可以用鍊錶實現。棧的操作 stack 建立乙個新的空棧 push item 新增乙個新的元素item到棧頂 pop 彈出棧頂元素 peek 返回棧頂元素 is empty 判斷棧是否為空 size 返回棧的元素個數 2.佇列 佇列 queue 是只允許在一端進行...