【數據結構】鏈表與順序表的比較

不同點:

順序表和鏈表是兩種常見的數據結構,他們的不同點在于存儲方式和插入、刪除操作、隨機訪問、cpu緩存利用率等方面。

一、存儲方式不同:

順序表:

順序表的存儲方式是順序存儲,在內存中申請一塊連續的空間,通過下標來進行存儲;

鏈表:

鏈表的存儲方式是鏈式存儲,申請的空間是未必連續的,以節點的形式連接,每個節點會有一個next指針,指向下一個節點,通過指針來訪問元素;

二、插入、刪除的效率不同:

順序表:

插入刪除元素時,需要移動元素的位置也就是搬移元素,導致效率低下

鏈表:

插入刪除時只需要修改指針指向。

三、內存利用率:

順序表:

需要擴容,創建空間大小是固定的,當空間不夠時需要進行擴容,以2倍的關系擴增的,你少一個空間,我增大到原來的2倍,還會有多余空間未使用,所以擴容會造成空間浪費的現象。

但是注意我們因為用的realloc擴容,所以擴容本身會有消耗!!👉👉👉

由于realloc擴容的特性,不確定是原地還是異地擴容,這個與編譯器有點關系

原地擴容:擴容的空間地址與原來地址相同

異地擴容:擴容的空間地址與原來地址不同(將原來的數據拷貝過來,還要銷毀原來的空間)

鏈表:

按需申請的空間,不會存在空間浪費現象,利用率極高

四、隨機訪問:

順序表:

支持用下標隨機訪問

鏈表:

不支持,因為空間在物理上就不是連續的,next找到下一個節點,在用該節點的next找一個,找起來比較麻煩

五、緩存利用率:

緩存👉CPU高速緩存🧑?🎓🧑?🎓 內存在帶電的情況下存儲,當斷電后未保存的數據會丟失(就像我們在用畫板時,畫了畫,你給電腦關機,下次進去就找不到了)但其速度快,而硬盤可以不帶電存儲,但是速度慢。

🤔🤔為啥有寄存器和三級緩存??

??主要是cpu的運行速度很快,看不上內存日常不會去訪問內存,但是寄存器和三級緩存的速度還是能入下眼??

我們寫的代碼時,變量存在內存里面,當你要修改變量時會將數據放到寄存器,然后cpu對其接收指令進行修改

看下面代碼的反匯編,mov 是將 i 放到 eax(寄存器)中,然后對寄存器的數據進行inc指令也就是加1, 在講寄存器的數據放到可i中

但是寄存器個數有限,一般對于4個 8個字節會放到寄存器,數據比較大會加載到緩存,( 緩存里面還要涉及到三級緩存的調用,有點深奧,不講這么難的,可以自己去查資料)

cpu訪問數據會先訪問數據是否在緩存中,在---》緩存命中,直接訪問。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不在---》不命中,先將數據加載到緩存中,再進行訪問。

🤔怎么加載到緩存的??

cpu會按cpu字長去讀,會認為你訪問當前數據后面(連續在一起的)都不在緩存中,給它加載進去

舉個例子:數組為例子,下面的20個人就是一個數組。度假村相當于緩存,領導是cpu,大巴車也是cpu,cpu給你加載到緩存,再訪問

注意:緩存有一定的范圍,新進來的過多,放不下了,就給舊的清理掉!


對于鏈表了,你的物理空間是不連續,拉的數據太多,會把緩存區之前的一些數據排擠走了

順序表:

?CPU緩存利用率高。

鏈表:

CPU緩存利用率低。

六、總結:

不同點順序表單鏈表
存儲空間物理上一定連續(底層是數組)只是邏輯上連續,物理上并不連續
隨機訪問下標訪問 O(1)不支持:要遍歷O(N)
任意位置的增刪需要搬運元素,效率低O(N)無需搬運,只需要修改指針指向
插入動態順序表,需要擴容(成倍擴容,可能會造成空間浪費)按需申請,沒有擴容這一說法
應用場景元素的高效存儲+頻繁的訪問任意位置插入+刪除頻繁
CPU緩存利用率緩存利用率高緩存利用率低

鏈表和順序表各有優勢,互相彌補各自的缺點

總之,順序表用于數據元素較少、讀取操作頻繁的場景,而鏈表更適用于數據元素較多、插入、刪除操作頻繁的場景。

??就到? ? ? ? ? ? ? ?這吧? ??🫰

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

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

相關文章

解決OpenCV讀取目標圖像,cv2.imshow出現閃退的問題

前言 本文是該專欄的第17篇,后面將持續分享OpenCV計算機視覺的干貨知識,記得關注。 最近有粉絲朋友詢問到OpenCV讀取目標圖像出現的一個問題,在基于python語言“使用OpenCV讀取目標圖像的時候,利用cv2.imshow函數出現閃退”的情況。 而本文,筆者將詳細介紹針對上述問題,…

【硬件工程師話家常】硬件工程師的項目時間管理

在整個項目研發團隊中,有兩個人和所有人打交道,一個就是項目經理,另一個就是硬件工程師。硬件工程師需要和各種研發人員打交道 、協調工作,這也要求硬件工程師具有豐富的知識面和強大的協調能力。 硬件工程師處于一個項目中的核心…

Java運算符及程序邏輯控制

🎉welcome to my blog 請留下你寶貴的足跡吧(點贊👍評論📝收藏?) 💓期待你的一鍵三連,你的鼓勵是我創作的動力之源💓 🐣目錄 🍀運算符📚1.算術運算符&#x…

centos7安裝jq報錯No package jq available

安裝EPEL倉庫 sudo yum install epel-release清理軟件倉緩存 sudo yum clean all重建軟件倉緩存 sudo yum makecache重新安裝jq yum install jq

python基礎知識點(藍橋杯python科目個人復習計劃67)

今日復習內容:做一下昨天的算法賽題目,試試基礎怎樣 小白挑戰賽一共6題,我只會5題,而且這5題是全對的,比起上次的兩題,已經有進步了。 第一題:六一獻禮 題目描述: 六月的陽光熱情…

python判斷文件是否存在

import os test_path "/Users/yxk/Desktop/test/GrayScale.tif" if(os.path.exists(test_path)):print(文件存在!!!!) else:print("文件不存在!!!!")結果如下 …

net前端怎么集成:探索集成之道

net前端怎么集成:探索集成之道 在軟件開發領域,前端集成是一個復雜而關鍵的環節。特別是在.NET框架中,前端集成的成功與否直接影響著應用程序的整體性能和用戶體驗。本文將深入剖析net前端集成的四個方面、五個方面、六個方面和七個方面&…

RabbitMQ(四)事務消息,惰性隊列,優先隊列

文章目錄 事務消息概念配置 惰性隊列概念應用場景 優先隊列概念配置 事務消息 僅在生產者端有效,消費端無效 概念 總結: 在生產者端使用事務消息和消費端沒有關系在生產者端使用事務消息僅僅是控制事務內的消息是否發送提交事務就把事務內所有消息都發送…

Python知識點13---面向對象的編程

提前說一點:如果你是專注于Python開發,那么本系列知識點只是帶你入個門再詳細的開發點就要去看其他資料了,而如果你和作者一樣只是操作其他技術的Python API那就足夠了。 Python是一個完全面向對象開發的語言,它的一切都以對象的…

Java面試——專業技能

優質博文:IT-BLOG-CN 一、簡單講下 Java 的跨平臺原理 由于各個操作系統(Windows,Linux等)支持的指令集不是完全一致的。就會讓我們程序在不同的操作系統上要執行不同的程序代碼。Java 開發了適用于不同操作系統及位數的 Java 虛擬…

【教程】自監督 對比學習,代碼,爽學一波

from: https://docs.lightly.ai/self-supervised-learning/examples/simclr.html

代碼隨想錄第22天|回溯part2 組合總和III電話號碼的字母組合

216.組合總和III 當組合的數量為k就判斷和&#xff0c;并且返回。 在枚舉的時候可以進行剪枝&#xff0c;如果總和已經超過了n&#xff0c;那么就沒必要繼續遞歸下去了 class Solution { public:vector<int> path;vector<vector<int>> res;void backTrackin…

微信小程序手機號碼授權登錄

文章目錄 一、微信小程序開發二、使用步驟1.前端代碼2.后臺配置3.后臺代碼 總結 一、微信小程序開發 目前個人的小程序無法使用手機號碼授權登錄&#xff0c;可以使用測試號進行開發 二、使用步驟 1.前端代碼 代碼如下&#xff08;示例&#xff09;&#xff1a; <butto…

Java版本家政上門系統源碼,自主研發、安全可控,支持任意二次開發

家政上門系統源碼&#xff0c;Java版本&#xff0c;自主研發、安全可控。支持任意二次開發、有豐富合作案例。多端管理&#xff1a;管理端、用戶端、服務端。 技術參數&#xff1a; 技術架構&#xff1a;springboot、mysql 、Thymeleaf 開發語言&#xff1a;java1.8、vue 開…

python 象棋小游戲代碼

以下是一個簡單的Python象棋小游戲的代碼示例。這個示例使用了pygame庫來創建圖形用戶界面和處理用戶輸入。 首先&#xff0c;確保安裝了pygame庫&#xff1a; pip install pygame 然后&#xff0c;可以運行以下代碼&#xff1a; import pygame import sys # 初始化pygam…

軟件開發步驟詳解

一、引言 隨著信息技術的迅猛發展&#xff0c;軟件已成為現代社會不可或缺的一部分。無論是企業運營、個人生活還是科學研究&#xff0c;都離不開各種軟件的支持。因此&#xff0c;掌握軟件開發的步驟和技巧對于IT從業者來說至關重要。本文旨在詳細介紹軟件開發的整個流程&…

Python知識點7---字典與集合

提前說一點&#xff1a;如果你是專注于Python開發&#xff0c;那么本系列知識點只是帶你入個門再詳細的開發點就要去看其他資料了&#xff0c;而如果你和作者一樣只是操作其他技術的Python API那就足夠了。 Python的字典與集合是沒有下標一說的&#xff0c;字典說的其實就是ma…

使用機器學習做醫學圖像分類的開源項目集錦

項目名稱倉庫描述主要特點適配建議U-Net用于生物醫學圖像分割zhixuhao/unetKeras中的U-Net實現&#xff0c;用于2D圖像分割。 - 基本的U-Net架構 - 生物醫學圖像訓練示例 - 簡單的數據加載器 - 修改數據加載器以處理特定MRI格式 - 調整訓練管道以適應STIR序列和標簽 使用PyTor…

更改Web網站設計——css和css框架

雖然使用HTML可以定義文章的結構&#xff0c;但是其中不包含設計相關的信息。此時CSS就派上用場&#xff0c;可以用它對HTML文章指定設計樣式。由于可以決定Web網頁的外觀風格&#xff0c;因此&#xff0c;它有時也被稱為格式表。 如果使用CSS設置背景色&#xff0c;文…

計算機網絡期末復習(1)計算機網絡在信息時代對的作用 計算機網絡的定義和分類 三種交換方法

計算機網絡在信息時代扮演著至關重要的角色&#xff0c;它極大地改變了我們生活、工作和學習的方式。 計算機網絡在信息時代的作用 信息共享與傳播&#xff1a;計算機網絡使全球范圍內的信息快速共享成為可能&#xff0c;無論是新聞、學術研究還是娛樂內容&#xff0c;都可以…