陣列(array)是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。
陣列支援隨機訪問,根據下標隨機訪問的時間複雜度為 o(1)。
arraylist 無法儲存基本型別,比如 int、long,需要封裝為 integer、long 類,而 autoboxing、unboxing 則有一定的效能消耗
它並不需要一塊連續的記憶體空間,它通過「指標」將一組零散的記憶體塊串聯起來使用。
單鏈表、雙向鍊錶和迴圈鍊錶:單鏈表的尾結點指標指向空位址,表示這就是最後的結點了。而迴圈鍊錶的尾結點指標是指向鍊錶的頭結點。單向鍊錶只有乙個方向,結點只有乙個後繼指標next指向後面的結點。而雙向鍊錶,顧名思義,它支援兩個方向,每個結點不止有乙個後繼指標next指向後面的結點,還有乙個前驅指標prev指向前面的結點,用空間換時間的設計思想。
針對鍊錶的插入和刪除操作,我們只需要考慮相鄰結點的指標改變,所以對應的時間複雜度是 o(1),鍊錶隨機訪問需要 o(n) 的時間複雜度。
在實際的軟體開發中,從鍊錶中刪除乙個資料無外乎這兩種情況:
1.刪除結點中「值等於某個給定值」的結點。 單向鍊錶查詢o(n)刪除o(n),雙向鍊錶查詢o(n)刪除o(1)
2.刪除給定指標指向的結點。 單向鍊錶 o(n),雙向鍊錶o(1)
陣列簡單易用,在實現上使用的是連續的記憶體空間,可以借助cpu的快取機制,預讀陣列中的資料,所以訪問效率更高。而鍊錶在記憶體中並不是連續儲存,所以對cpu 快取不友好,沒辦法有效預讀。陣列的缺點是大小固定,一經宣告就要占用整塊連續記憶體空間,鍊錶本身沒有大小的限制,天然地支援動態擴容,我覺得這也是它與陣列最大的區別。
後進者先出,先進者後出,這就是典型的「棧」結構。就像一疊盤子。
當某個資料集合只涉及在一端插入和刪除資料,並且滿足後進先出、先進後出的特性,這時我們就應該首選「棧」這種資料結構。
用陣列實現的棧,我們叫作順序棧,用鍊錶實現的棧,我們叫作鏈式棧。
先進者先出。用陣列實現的佇列叫作順序佇列,用鍊錶實現的佇列叫作鏈式佇列。
阻塞佇列:在隊列為空的時候,從隊頭取資料會被阻塞,如果佇列已經滿了,那麼插入資料的操作就會被阻塞;
執行緒安全的佇列我們叫作併發佇列;
實際上,對於大部分資源有限的場景,當沒有空閒資源時,基本上都可以通過「佇列」這種資料結構來實現請求排隊
鍵 --雜湊函式--> 雜湊值 存入陣列,雜湊值是下標,鍵是陣列值
雜湊錶用的是陣列支援按照下標隨機訪問資料的特性,所以雜湊表其實就是陣列的一種擴充套件,由陣列演化而來。可以說,如果沒有陣列,就沒有雜湊表。
業界著名的md5、sha、crc等雜湊演算法,也無法完全避免這種雜湊衝突。j**a 中 linkedhashmap 就採用了鍊錶法解決衝突,threadlocalmap 是通過線性探測的開放定址法來解決衝突
j**a 中的 hashmap 這樣乙個工業級的雜湊表:預設的初始大小是 16,最大裝載因子預設是 0.75,每次擴容都會擴容為原來的兩倍大小,底層採用鍊錶法來解決衝突,當鍊表長度太長(預設超過8)時,鍊錶就轉換為紅黑樹,當紅黑樹結點個數少於 8 個的時候,又會將紅黑樹轉化為鍊錶
這種鍊錶加多級索引的結構,就是跳表
建立了很多索引,空間換時間。查詢時間複雜度 logn,插入時間複雜度也是logn,空間複雜度o(n)。
索引儲存的只是引用,相比物件很小,所以不必在意索引所佔空間。
資料結構 概覽
資料結構 在電腦科學資料結構是一種資料組織和儲存格式,支援非常高效。訪問和修改。1 2 3 更準確地說,乙個資料結構是資料值的集合,它們之間的關係,可以應用到的函式或運算元據。4 資料結構可以實現乙個或多個特定的抽象資料型別 adt 指定的操作可以在乙個資料結構和執行計算複雜度這些操作。相比之下,乙...
資料結構 概覽
概念 資料 是對客觀事物的符號表示。能輸入到計算機中並且被電腦程式處理的符號的總稱 資料元素 描述資料的基本單位 資料項 描述資料的最小單位 資料型別 數值,字元等對資料分成不同的型別 抽象資料型別 由資料物件,資料關係和基本操作三部分組成,可用三元組 d,s,p 表示 資料結構 資料和結構兩部分,...
資料結構 線性結構
typedef int position typedef struct lnode list struct lnode 初始化 list makeempty 查詢 define error 1 position find list l,elementtype x 插入 bool insert lis...