【追求卓越02】數據結構--鏈表

引導

????????今天我們進入鏈表的學習,我相信大家對鏈表都很熟悉。鏈表和數組一樣,作為最基礎的數據結構。在我們的工作中常常會使用到。但是我們真的了解到數組和鏈表的區別嗎?什么時候使用數組,什么時候使用鏈表,能夠正確的選取嗎?

????????鏈表需要我們進行一些練習才能更好的掌握。我后面也會結合幾個經典的練習題進行訓練。

鏈表和數組區別

????????數組和鏈表的最大區別就是存儲了。從上一欄,我們了解到數組的存儲結構是連續的。鏈表與之恰恰相反,它可以利用內存中零碎的內存空間。如圖:

????????這樣就存在一個問題;當我們向內存申請100M的數組時,即使內存剩余200M內存,但經常會提示申請失敗“out of memory”。因為內存中存在著很多的內存碎片,導致200M內存中基本不存在100M連續的。但是鏈表就不會存在這種情況,因為它支持動態分配,不需要內存地址上的連續要求。

單鏈表

????????單鏈表,是比較簡單的了,并且也比較常見。結構圖如下:

單鏈表的刪除,新增操作的時間復雜度

????????我們知道數組的刪除,新增操作,要進行數據的搬移(保證數據的連續性)。導致數組的復雜度為O(n)。但是單鏈表并不需要進行數據的搬移,只要修改節點的指針的指向即可。所以鏈表的復雜度時O(1)

單鏈表的隨機訪問的時間復雜度

????????數組的存儲是連續的,當知道下標時,數組復雜度O(1);但是鏈表由于不是連續存儲的,所以在訪問第i個節點時,需要從頭節點,一個接一個遍歷。因此鏈表復雜度O(n)

循環鏈表

????????循環鏈表其實就是特殊的單鏈表(尾節點指向了頭節點)。因此它也不是很難。不過對于特殊的問題,使用循環鏈表比較方便。比圖經典的約瑟夫問題。結構圖如下:

雙向鏈表

????????雙向鏈表雖然我們接觸的不多,但在項目中,雙向鏈表比單鏈表使用的更加廣泛。 雙向鏈表其實就是多了一個指針變量,指向了前節點。結構圖如下:

????????正如我們上面說的雙向鏈表在工作中使用的往往比單鏈表要廣泛,為什么呢

從鏈表的刪除舉例,刪除鏈表的中節點,無非就是以下兩種情況:

  1. 刪除節點中,值等于某個特定值的節點
  2. 刪除給定指針指向的節點

????????對于第一種情況,無論是單鏈表或雙鏈表都要先找到對應的節點,再進行刪除操作。 根據復雜度的加法原則,O(n)+O(1)=O(n)。兩者的復雜度都是O(n)。

????????對于第二種情況,給定一個需要刪除節點之后,僅需要將該節點的前節點指向該節點的下一個節點即可。

????????但是單向鏈表需要進行遍歷,找到該節點的前節點。需要O(n)。所以單鏈表需要O(n)。但是由于雙向鏈表每個節點有指向前節點的指針。故雙向鏈表僅需O(1)。

????????其實第二種情況,是我們經常會遇到的,比如LinkedHashMap容器,就是使用了雙向鏈表。

????????不僅僅時刪除和插入操作,雙向鏈表比單向鏈表高效。其實查詢也會比單向鏈表高效。比如在一個有序的鏈表中,我們可以保存上一次查詢節點,判斷查詢值的大小,采取向上還是從下查詢的方式。

????????其實這就是一個空間換時間的例子,雙向鏈表雖然比單向鏈表要高效,但是它比單向鏈表多一個指針變量。因此消耗的內存資源也會比較多。

數組和鏈表的選擇

我覺得數組和鏈表的選擇應該要結合以下幾點因素考慮:

1. 時間復雜度

????????數組的隨機訪問時間復雜度是O(1),刪除操作的復雜度O(n);鏈表的隨機訪問的復雜度是O(n),刪除操作的復雜度O(1);結合你的業務邏輯,評價主要是查詢操作居多還是刪除操作居多。

2. 內存要求

????????因為鏈表中每個節點需要一個指向下一個節點的指針變量,所以鏈表比數組消耗更多的內存資源。當你的內存資源比較有限的情況下,我還是建議你使用數組。

3. 性能提高--CPU緩存機制

????????我們知道數組的訪問比鏈表要高效。但是這只是從時間復雜度來分析的。但是不僅僅如此,數組在訪問操作時,因為cache機制的存在,效率會更加高。因此,如果你想更進一步提高訪問的效率,我建議你也選擇數組。

總結:綜上所述,數組有這么多的優勢,我們是不是基本都選擇數組呢?我們工作中基本還是選擇鏈表較多。因為我們基本不會存在性能和內存資源上的擔憂,并且鏈表使用起來還是比較方便的

什么是CPU緩存機制?

????????上面我們談到了CPU緩存機制,數組對CPU緩存機制比較友好能夠加快訪問效率,但是鏈表對其不友好,不能提高效率。但是何為CPU緩存機制呢?其實它是依據操作系統中局部性原理來實現的。

????????所謂的局部性原理,包括兩個部分:時間局部性空間局部性。時間局部性指的是最近訪問的存儲位置,很可能在不久的將來還要訪問;空間局部性指存儲訪問有聚集的傾向,當訪問了某一個位置之后,很有可能也要訪問附近的位置。

????????我們知道Cache是高速訪問的緩存,比內存的訪問還要快。CPU從內存中訪問數據并不會僅僅只獲取該地址的內容。而是會將該內容在內的物理塊一起放到Cache緩存中。下次再讀取內容時,首先再Cahce中找,找不到再從內存中重復上面的操作。

????????因為數組的存儲空間是連續的,所以能夠很好的適應CPU緩存機制。但是鏈表是非連續存儲的,所以對CPU緩存機制不友好。

總結

????????了解了數組和鏈表之間的區別,以及如何選擇數組和鏈表數據結構。數組對CPU緩存機制更加友好。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163125.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163125.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163125.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

監控員工上網有什么軟件

監控員工上網的軟件主要用于監控員工在工作時間內的網絡行為,包括瀏覽網頁、使用社交媒體、發送郵件等。通過監控員工上網行為,企業管理者可以更好地了解員工的工作狀態和行為,規范員工的上網行為,提高工作效率,同時也…

SSL證書對網站的作用及影響?

SSL證書作為當下互聯網的重要安全件,包括搜索引擎的收錄、網站是否具備信任的條件以及HTTP2.0傳輸協議的相互作用等,尤其是瀏覽器對古老的http協議警告提示不安全將直接影響到用戶的信任度以及品牌形象,對于網站來說可謂是必不可少。 SSL證書…

Webstorm 插件文件目錄顏色分析——白藍綠紅黃灰

Webstorm 插件文件目錄【白色、藍色、綠色、紅色、黃色、灰色】對應當前文件發生什么了,即文件夾當前狀態。 WebStrom配置好git或SVN后文件顏色代表的含義: 白色:本地無修改內容 藍色:文件內容有修改,暫未提交到git…

python命令行 引導用戶填寫可用的ip地址和端口號

字多不看,直接體驗 待補充 演示代碼 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/23 10:29 file: 引導用戶填寫可用的ip地址和端口號.py desc: xxxxxx """# region 引入必要的依賴 import …

C語言-判斷上三角矩陣

上三角矩陣指主對角線以下的元素都為0的矩陣;主對角線為從矩陣的左上角至右下角的連線。 本題要求編寫程序,判斷一個給定的方陣是否上三角矩陣。 輸入格式: 輸入第一行給出一個正整數T,為待測矩陣的個數。接下來給出T個矩陣的信…

【LeetCode:2304. 網格中的最小路徑代價 | dijkstra(迪杰斯特拉)】

🚀 算法題 🚀 🌲 算法刷題專欄 | 面試必備算法 | 面試高頻算法 🍀 🌲 越難的東西,越要努力堅持,因為它具有很高的價值,算法就是這樣? 🌲 作者簡介:碩風和煒,…

Vue中使用Echarts實現數據可視化

文章目錄 引言一、安裝Echarts二、引入Echarts三、創建圖表容器四、初始化Echarts實例五、配置圖表選項和數據六、實現圖表更新七、Vue實例代碼結語我是將軍,我一直都在,。! 引言 接著上一篇內容,我將繼續分享有關數據可視化的相…

Bellman-Ford算法

初步了解 Bellman-Ford算法是一種用于尋找帶有負權邊的圖中的單源最短路徑的算法。它可以處理一般的圖,包括存在負權邊和負權環的情況。 以下是Bellman-Ford算法的基本思想和步驟: 初始化:將源節點的距離設置為0,將所有其他節點…

Hook+jsdom 解決cookie逆向

前言 記錄下如何破cookie逆向 目標 目標網址:https://q.10jqka.com.cn/ 目標接口:http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/ 對抗:cookie反爬蟲處理,關鍵字v,如圖 解決步驟 1、JS中關鍵字查找 如上,我們找到了關鍵字 v,…

為何設計師都在用這個原型樣機資源網站?

談論原型樣機素材模板,這個話題對設計師來說如同老朋友一般熟悉。設計師們在創作完畢后,為了更淋漓盡致地展示他們的設計成果,通常會將其放置在真實的樣機素材模板中。這種原型樣機素材可以讓設計作品迅速且清晰地呈現在真實環境中。找到一個…

(5秒解決)ImportError: attempted relative import with no known parent package

尋找了很多方法,發現大家把事情講的復雜了。我這里用最簡單的辦法來解決父包引用找不到的問題。 報錯提示:ImportError: attempted relative import with no known parent package 先給大家看看我的目錄結構,model.py和test目錄在同一級。tra…

前端數組方法匯總集錦

前言 數組主要使用場景有: 存儲和處理數據:數組是一種有序的數據結構,可以用來存儲和處理多個相關的數據。在前端開發中,我們經常使用數組來存儲和處理列表、表格、選項等數據。 循環和遍歷:數組提供了循環和遍歷的功能…

Android12:內置第三方應用,權限控制器已停止運行,應用app已停止運行

1.設備先安裝我提供的app【EasyControler】 2.設備--設置--關于手機--版本號(滑動到最下方)---連續點擊六下打開 開發者模式 3.設置--系統--開發者模式--開發者選項 --打開usb調試 4.設置--安全設備管理應用--easycontrol的開關打開 5.將設備連接電腦 打開cmd命令框 輸入指令…

smartsofthelp 7.0 最簡單的代碼生成器

這是一款值得開發人員認真研究的軟件 https://pan.baidu.com/s/1xjDL5QypcRJ5neulUPFmWQ?pwdgedx 1.查詢數據庫死鎖相關信息 2.查看數據庫的鏈接情況 3.當前實例上的所有用戶 4.創建數據庫獨立密碼 5.查看數據庫使用的端口號 6.當前數據庫設置的最大連接數 7.當前數據庫最大的…

C語言運算符優先級表

C語言運算符優先級表 運算符優先級與結合性 優先級運算符描述結合性1,--后綴自增,自減從左往右()函數調用[]數組下標.結構體與聯合體訪問成員->結構體與聯合體通過指針訪問成員(type){list}復合字面量(C99)2,--前綴自增,自減從…

淡入淡出transition: right 1s

transition: right 1s; //重點直接改變right值 操作過快 這里用該方法實現1s內淡入淡出 達到效果目標

JS PromiseLike 的判定與使用

目錄 一. $.ajax()返回值遇到的問題二. Promise A 規范三. 判斷是否為PromiseLike3.1 判斷ES6的new Promise()3.2 判斷包含then方法的對象3.3 判斷$.ajax()返回的對象 一. $.ajax()返回值遇到的問題 當我們執行如下js代碼時,可以看到$.ajax()執行后,得到…

Linux python安裝 虛擬環境 virtualenv

根目錄創建 venvs 文件夾 sudo mkdir /venvs 進入 /venvs 目錄 cd /venvsp 創建虛擬環境,前提要按照 python3 安裝 的 命令 sudo apt install python3 sudo python3 -m venv 虛擬環境名 激活虛擬環境 sourcepippip /venvs/zen-venv/bin/activatepinpi 安裝flask pip…

【C語言】深入解開指針(四)

🌈write in front :🔍個人主頁 : 啊森要自信的主頁 ??真正相信奇跡的家伙,本身和奇跡一樣了不起啊! 歡迎大家關注🔍點贊👍收藏??留言📝>希望看完我的文章對你有小小的幫助&am…

centos7上用docker部署mysql 5.7,并解決中文亂碼問題

1. 安裝docker 查看這篇文章的前半部分即可: 虛擬機上安裝docker,并安裝flink鏡像 2. 安裝mysql 5.7 2.1 下載mysql鏡像 可以使用docker search mysql命令查看遠程鏡像倉庫中的鏡像信息,或者訪問dockerhub去找需要的鏡像 這里直接拉取鏡像…