資料結構與演算法之美學習筆記 5 9章

2021-10-03 05:35:24 字數 2301 閱讀 4677

陣列是一種線性表資料結構,他用一組連續的記憶體空間,來儲存相同型別的資料

(這裡要注意不根據下標是不能隨機訪問的啊)

假設乙個長度為10的int型陣列,會分配一塊連續記憶體空間 1000~1039,其中,記憶體塊首位址是1000

我們可以通過以下公式快速獲取到指定下標的元素

a[i]_address = base_address + i * data_type_size

base_address 就是首位址 1000, i為我們要獲取的下標,.data_type_size為每個元素的位元組大小,這裡int為4個位元組

比如我們要找第1個元素,為1000+1*4  = 1004

這裡其實可以解釋為什麼陣列從0開始

因為如果從1開始 上面的公式就會變成

a[i]_address = base_address + (i -1)* data_type_size

cpu在執行指令的時候 還需要多執行一步減1的操作,雖然影響不大,但陣列做為乙個底層的資料結構,應該盡量做到優化

陣列在插入和刪除的時候會需要移動插入或刪除目標位置後面的元素.這樣最好情況下時間複雜度為o(1),最壞為o(n)

深入思考

但是我們換個角度看,如果換個角度,如果陣列不要求保證元素的順序性,比如在插入元素到指定下標i的時候,我們可以直接找到下標為i的原有元素然後將他放在陣列最後,然後將要插入的元素直接放在空出來的i的位置.這樣時間複雜度將變o(1)

同樣的當我們要對陣列進行多次刪除時.我們可以先不進行刪除,只是記錄下要刪除的下標,等到陣列容量不夠時,我們一次性進行刪除.

這就有點類似我們jvm中的標記清除.

記憶體塊稱為鍊錶的「結點」,第乙個結點叫作頭結點,最後乙個結點叫作尾結點,記錄下個結點位址的指標叫作後繼指標 next

鍊錶的優勢在於插入刪除操作簡單.只需要控制前後節點的改變即可時間複雜度為o(1)

迴圈鍊錶是一種特殊的單鏈表,迴圈鍊錶的尾結點指標是指向鍊錶的頭結點

支援兩個方向,每個結點不止有乙個後繼指標 next指向後面的結點,還有乙個前驅指標 prev指向前面的結點。

雙向鍊錶相比於單向鍊錶的優勢在於,他記錄了前指標,也就是可以快速的找到前面的節點,單向鍊錶雖然刪除操作快,但是前提要知道前和後節點,在已知當前節點要刪除或插入位置時,還得遍歷鍊錶找到後繼節點為目標節點的節點,也就是前節點,這個操作時間複雜度是o(n)

兩者都是線性表結構.不同點在於陣列是一組連續的記憶體空間,而鍊錶是一組分散的記憶體空間,假設記憶體中剩下100m 但這100m不是連續的記憶體空間,陣列就無法存入,而鍊錶可以存入,同時陣列需要制定初始空間,設定過大會浪費記憶體,設定過小就需要設定新的更大空間的陣列,然後將原有陣列拷貝到新的陣列,這個操作非常耗時,即使arraylist可以動態擴容,但是我們如果我們儲存的資料大小達到1g,這個時候陣列空間不足,自動擴容為1.5g,此時還需要複製拷貝,可以想象下時間耗費是多大.

陣列可以根據下標快速隨機訪問 時間複雜度是o(1),但是鍊錶必須遍歷查詢時間複雜度是o(n),反之陣列插入刪除的時間複雜度是o(n),鍊錶的時間複雜度為o(1).

lua常見淘汰策略有3種,先進先出,最少使用,最近最少使用.

我們維護乙個有序單鏈表,越靠近鍊錶尾部的結點是越早之前訪問的。當有乙個新的資料被訪問時,我們從煉表頭開始順序遍歷鍊錶。

1. 如果此資料之前已經被快取在鍊錶中了,我們遍歷得到這個資料對應的結點,並將其從原來的位置刪除,然後再插入到鍊錶的頭部。

2. 如果此資料沒有在快取鍊錶中,又可以分為兩種情況:

這樣我們就用鍊錶實現了乙個 lru 快取

《資料結構與演算法之美》學習筆記 3 資料結構

陣列定義 陣列 array 是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。第一是線性表 linear list 顧名思義,線性表就是資料排成像一條線一樣的結構。每個線性表上的資料最多只有前和後兩個方向。除了陣列,鍊錶 佇列 棧等也是線性表結構。而與它相對立的概念是非線...

《資料結構與演算法之美》學習筆記之開篇

本系列是極客時間中前 google 工程師王爭 資料結構與演算法之美 專欄的學習筆記,想加強資料結構及演算法能力的同學可以直接購買此專欄,跳轉鏈結在此 從廣義上講,資料結構就是指一組資料的儲存結構。演算法就是運算元據的一組方法。資料結構和演算法是相輔相成的。資料結構是為演算法服務的,演算法要作用在特...

陣列 資料結構和演算法之美學習筆記

陣列 array 是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料 第一是線性表 linear list 顧名思義,線性表就是資料排成像一條線一樣的結構。每個線性表上的資料最多只有前和後兩個方向。其實除了陣列,鍊錶 佇列 棧等也是線性表結構 非線性表,比如二叉樹 堆 圖等...