資料結構:陣列和連結串列的區別(陣列和連結串列的優缺點 & 陣列和連結串列的適用場景)
陣列和連結串列是兩種基本的資料結構,他們在記憶體儲存上的表現不一樣,所以也有各自的特點
陣列
一、陣列的特點
1.在記憶體中,陣列是一塊連續的區域
2.陣列需要預留空間在使用前需要提前申請所佔記憶體的大小,這樣不知道需要多大的空間,就預先申請可能會浪費記憶體空間,即陣列空間利用率低
ps:陣列的空間在編譯階段就需要進行確定,所以需要提前給出陣列空間的大小(在執行階段是不允許改變的)3.在陣列起始位置處,插入資料和刪除資料效率低。
插入資料時,待插入位置的的元素和它後面的所有元素都需要向後搬移
刪除資料時,待刪除位置後面的所有元素都需要向前搬移4.隨機訪問效率很高,時間複雜度可以達到O(1)
因為陣列的記憶體是連續的,想要訪問那個元素,直接從陣列的首地址處向後偏移就可以訪問到了
5.陣列開闢的空間,在不夠使用的時候需要擴容,擴容的話,就會涉及到需要把舊陣列中的所有元素向新陣列中搬移
6.陣列的空間是從棧分配的
二、陣列的優點
隨機訪問性強,查詢速度快,時間複雜度為O(1)
三、陣列的缺點
1.頭插和頭刪的效率低,時間複雜度為O(N)
2.空間利用率不高
3.記憶體空間要求高,必須有足夠的連續的記憶體空間
4.陣列空間的大小固定,不能動態拓展
連結串列
一、連結串列的特點
1.在記憶體中,元素的空間可以在任意地方,空間是分散的,不需要連續
2.連結串列中的元素都會兩個屬性,一個是元素的值,另一個是指標,此指標標記了下一個元素的地址每一個數據都會儲存下一個資料的記憶體的地址,通過此地址可以找到下一個資料
3.查詢資料時效率低,時間複雜度為O(N)
因為連結串列的空間是分散的,所以不具有隨機訪問性,如要需要訪問某個位置的資料,需要從第一個資料開始找起,依次往後遍歷,直到找到待查詢的位置,故可能在查詢某個元素時,時間複雜度達到O(N)
4.空間不需要提前指定大小,是動態申請的,根據需求動態的申請和刪除記憶體空間,擴充套件方便,故空間的利用率較高
5.任意位置插入元素和刪除元素效率較高,時間複雜度為O(1)
6.連結串列的空間是從堆中分配的
二、連結串列的優點
1.任意位置插入元素和刪除元素的速度快,時間複雜度為O(1)
2.記憶體利用率高,不會浪費記憶體
3.連結串列的空間大小不固定,可以動態拓展
三、連結串列的缺點
隨機訪問效率低,時間複雜度為0(N)
綜上:
對於想要快速訪問資料,不經常有插入和刪除元素的時候,選擇陣列
對於需要經常的插入和刪除元素,而對訪問元素時的效率沒有很高要求的話,選擇連結串列
相關推薦
pycharm 使用之:導包的小區別(使用編輯器裡的包和環境變數的包)
一、前言 標題名字有點low,可能一看不知道什麼意思,但是看了接下來的東西,相信你就會明白了。 之前,我的一片部落格是解決pycharm匯入selenium包,不能 import webdriver 的問題,地址: 其實,當時我就想過,我當時
c# base和this的區別(base、this、virtual、override、static詳解)
今天的程式除錯中出現了以下錯誤,引發了我對base關鍵字的用法的疑惑,總結一下。 1、base關鍵字 用法1: base是為了實現子類的方法中實現父類原有的方法。 this關鍵字代表本類物件,base關鍵字代表父類物件。 如: base.pr
資料結構:陣列和連結串列的區別以及各自的優缺點
原文地址 http://blog.csdn.net/qq_25806863/article/details/70607204 陣列和連結串列是兩種基本的資料結構,他們在記憶體儲存上的表現不一樣,所以也有各自的特點。 大致總結一下特點和區別,拿幾個人一起去看電影時坐座位為例。 陣列的特點
資料結構:陣列和連結串列的區別(陣列和連結串列的優缺點 & 陣列和連結串列的適用場景)
陣列和連結串列是兩種基本的資料結構,他們在記憶體儲存上的表現不一樣,所以也有各自的特點 陣列 一、陣列的特點 1.在記憶體中,陣列是一塊連續的區域 2.陣列需要預留空間
重溫四大基礎資料結構:陣列、連結串列、佇列和棧
![file](https://img2020.cnblogs.com/other/1648938/202008/1648938-20200805081813714-1550683399.jpg) # 前言 > 本文收錄於專輯:[http://dwz.win/HjK](http://dwz.win/H
玩轉資料結構——第三章:最基礎的動態資料結構:連結串列
內容概括: 3-1.什麼是連結串列 3-2.在連結串列中新增元素 3-3.使用連結串列的虛擬頭結點 3-4.連結串列的遍歷,查詢和修改 3-5.從連結串列中刪除元素 3-6.使用連結串列實現棧 3-7.帶有尾指標的連結串列:使用連結串列實現佇列
最基礎的動態資料結構:連結串列
什麼是連結串列 連結串列是一種線性結構,也是最基礎的動態資料結構。我們在實現動態陣列、棧以及佇列時,底層都是依託的靜態陣列,靠resize來解決固定容量的問題,而連結串列是真正的動態資料結構。學習連結串列這種資料結構,能夠更深入的理解引用(或者指標)以及遞迴。其中連結串列分為單鏈連結串列和雙鏈連結串列,本文
演算法班筆記 第九章 資料結構:區間、陣列、矩陣和樹狀陣列
第九章 資料結構:區間、陣列、矩陣和樹狀陣列 子陣列與字首和 Subarry PrefixSum[i] = A[0] + A[1] + ... + A[i-1], PrefixSum[0] = 0; 構造花費 O(n) 時間,O(n) 空間 Sum(i to j)
資料結構:用連結串列實現棧的括號匹配
完成以下程式,並在右邊空白處,對錯誤進行修改,並記錄下程式執行結果: 1. 編寫演算法,判斷一表達式中的括號是否配對,包括大、中、小三類括號。 連結串列版本: #include <cstdio> #include <cmath> #inclu
資料結構:實現雙向帶頭迴圈連結串列的各個介面
實現雙向帶頭迴圈連結串列的各個介面 List.h #pragma once #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef int LT
基本資料結構:連結串列(list)
那個單向連結串列程式樓主寫的很不錯,學習了,但是實際應用執行後,還是發現幾個問題1,第一個是最嚴重的問題,Delete函式中的temp變數並不是用new來分配的,但是後面卻用delete來撤銷,這樣在執行時是報錯的。在insert和insertHead函式中用new來分配的node變數,最後卻沒有用delet
資料結構:單鏈表(三)輸出連結串列值最大的節點
/********************************************************* **************新增加功能:輸出連結串列中值的最大節點*********
Linux核心工程導論——資料結構:連結串列與雜湊
scatterlist table由於可以被拼接(chain),不同的scatterlist如果所指向的記憶體是相鄰的還可以被合併,所以其遍歷格外複雜。1.4 llistllist全稱是Lock-less NULL terminated single linked list,意思是不需要加鎖
[C++]資料結構:連結串列形式的堆疊LinkedStack類
//自定義連結串列形式的堆疊 #include<iostream> using namespace std; template<class T> class Node{ public: T data; Node<T> *lin
資料結構:連結串列與順序表的優缺點
1.順序表儲存 原理:順序表儲存是將資料元素放到一塊連續的記憶體儲存空間,存取效率高,速度快。但是不可以動態增加長度 優點:存取速度高效,通過下標來直接儲存 缺點:1.插入和刪除比較慢,2.不可以增長長度 比如:插
資料結構:連結串列(指標+遊標)
指標實現連結串列 沒什麼好廢話的, 註釋在程式碼中 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef
資料結構:帶頭結點的雙向迴圈連結串列
標頭檔案及函式宣告: #include<stdio.h> #include<windows.h> #include<assert.h> typedef int DataType; typedef struct DLi
JavaScript 資料結構與演算法之美 - 線性表(陣列、棧、佇列、連結串列)
前言 基礎知識就像是一座大樓的地基,它決定了我們的技術高度。 我們應該多掌握一些可移值的技術或者再過十幾年應該都不會過時的技術,資料結構與演算法就是其中之一。 棧、佇列、連結串列、堆 是資料結構與演算法中的基礎知識,是程式設計師的地基。 筆者寫的 JavaScript 資料結構與演算法之美 系列用
資料結構:任意長度的有序連結串列歸併排序
難點:不知道何時輸入結束,剛開始想了很長時間,後來想到可以通過if (getchar()=='\n') 是否遇到回車鍵。 有特點
資料結構與演算法JavaScript描述讀書筆記(js實現連結串列-迴圈連結串列)
迴圈連結串列 迴圈連結串列同單鏈表,只需設定head.next = head就可以實現迴圈連結串列 其它方法不變,但是遍歷方法需要改一下 function display() { var cur = this.head; var str = ''; //如果不設定