鏈表(Linked list)比數組稍微複雜一點,在咱們生活中用到最多見的應該是緩存,它是一種提升數據讀取性能的技術,常見的如cpu緩存,瀏覽器緩存,數據庫緩存等。今天咱們就來學習一下鏈表html
1.一種線性表(數據排成像一條線同樣的結構。每一個線性表上的數據最多有先後兩個方向);
2.從存儲結構來看,經過「指針」,將一組零散的內存塊串聯起來使用的數據結構;
3.鏈表中的每個內存塊被稱爲結點Node,結點除了存儲數據外,還需記錄鏈上下一個節點的地址(next)算法
1.插入、刪除數據效率高,時間複雜度爲O(1)(只需更改指針指向便可),隨機訪問效率低,時間複雜度爲O(n)級別(須要從鏈頭至鏈尾進行遍歷)。
2.和數組相比,內存空間消耗更大,由於每一個存儲數據的節點都須要額外的空間存儲後繼指針。數據庫
1)每一個節點只包含一個指針,即後繼指針。
2)單鏈表有兩個特殊的節點,即首節點和尾節點。數組
用首節點地址表示整條鏈表,尾節點的後繼指針指向空地址null。瀏覽器
3)性能特色:插入和刪除節點的時間複雜度爲O(1),查找的時間複雜度爲O(n)。緩存
1)除了尾節點的後繼指針指向首節點的地址外均與單鏈表一致。
2)適用於存儲有循環特色的數據,好比約瑟夫問題。數據結構
1)節點除了存儲數據外,還有兩個指針分別指向前一個節點地址(前驅指針prev)和下一個節點地址(後繼指針next)。
2)當此「鏈接」爲第一個「鏈接」時,指向空值或者空列表post
當此「鏈接」爲最後一個「鏈接」時,指向空值或者空列表)性能
3)性能特色:
和單鏈表相比,存儲相同的數據,須要消耗更多的存儲空間。
插入、刪除操做比單鏈表效率更高O(1)級別。學習
以刪除操做爲例,刪除操做分爲2種狀況:
給定數據值刪除對應節點和給定節點地址刪除節點。
對於前一種狀況,單鏈表和雙向鏈表都須要從頭至尾進行遍歷從而找到對應節點進行刪除,時間複雜度爲O(n)。
對於第二種狀況,要進行刪除操做必須找到前驅節點,單鏈表須要從頭至尾進行遍歷直到p->next = q,時間複雜度爲O(n),而雙向鏈表能夠直接找到前驅節點,時間複雜度爲O(1)。
對於一個有序鏈表,雙向鏈表的按值查詢效率要比單鏈表高一些。
由於咱們能夠記錄上次查找的位置p,每一次查詢時,根據要查找的值與p的大小關係,決定是往前仍是日後查找,因此平均只須要查找一半的數據。
首節點的前驅指針指向尾節點,尾節點的後繼指針指向首節點。
塊狀鏈表自己是一個鏈表,可是鏈表儲存的並非通常的數據,而是由這些數據組成的順序表。每個塊狀鏈表的節點,也就是順序表,能夠被叫作一個塊。
塊狀鏈表經過使用可變的順序表的長度和特殊的插入、刪除方式,能夠在達到{\displaystyle O({\sqrt {n}})}的複雜度。塊狀鏈表另外一個特色是相對於普通鏈表來講節省內存,由於不用保存指向每個數據節點的指針。
數組:插入、刪除的時間複雜度是O(n),隨機訪問的時間複雜度是O(1)。
鏈表:插入、刪除的時間複雜度是O(1),隨機訪問的時間複雜端是O(n)。
1)若申請內存空間很大,好比100M,但若內存空間沒有100M的連續空間時,則會申請失敗,儘管內存可用空間超過100M。
2)大小固定,若存儲空間不足,需進行擴容,一旦擴容就要進行數據複製,而這時很是費時的。
1)內存空間消耗更大,由於須要額外的空間存儲指針信息。
2)對鏈表進行頻繁的插入和刪除操做,會致使頻繁的內存申請和釋放,容易形成內存碎片,若是是Java語言,還可能會形成頻繁的GC(自動垃圾回收器)操做。
數組簡單易用,在實現上使用連續的內存空間,能夠藉助CPU的緩衝機制預讀數組中的數據,因此訪問效率更高,而鏈表在內存中並非連續存儲,因此對CPU緩存不友好,沒辦法預讀。
若是代碼對內存的使用很是苛刻,那數組就更適合
CPU在從內存讀取數據的時候,會先把讀取到的數據加載到CPU的緩存中。而CPU每次從內存讀取數據並非只讀取那個特定要訪問的地址,而是讀取一個數據塊(這個大小我不太肯定。。)並保存到CPU緩存中,而後下次訪問內存數據的時候就會先從CPU緩存開始查找,若是找到就不須要再從內存中取。這樣就實現了比內存訪問速度更快的機制,也就是CPU緩存存在的意義:爲了彌補內存訪問速度過慢與CPU執行速度快之間的差別而引入。
對於數組來講,存儲空間是連續的,因此在加載某個下標的時候能夠把之後的幾個下標元素也加載到CPU緩存這樣執行速度會快於存儲空間不連續的鏈表存儲。
相關文章
以上內容爲我的的學習筆記,僅做爲學習交流之用。
歡迎你們關注公衆號,不定時乾貨,只作有價值的輸出
做者:Dawnzhang
出處:http://www.javashuo.com/article/p-husxtogo-gp.html
版權:本文版權歸做者轉載:歡迎轉載,但未經做者贊成,必須保留此段聲明;必須在文章中給出原文鏈接;不然必究法律責任