專項練習數據結構之數組知識

全都是自己錯題的知識點,記錄一下吧!

1.C++ STL 的實現:

(1)vector 底層數據結構為數組,支持快速隨機訪問,不在乎插入和刪除的效率
(2)list 底層數據結構為雙向鏈表,支持快速增刪,而關心隨機存取
(3)deque 是一個雙端隊列,是一種具有隊列和棧的性質的數據結構。雙端隊列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。相比list增加[]運算符重載。底層數據結構為一個中央控制器和多個緩沖區,支持首尾(中間不能)快速增刪,也支持隨機訪問
(4)stack 底層一般用list和deque實現,封閉頭部即可,不用vector的原因應該是容量大小有限制,擴容耗時
(5)queue 底層一般用list和deque實現,封閉頭部即可,不用vector的原因應該是容量大小有限制,擴容耗時
(6)priority_queue 的底層數據結構一般為vector為底層容器,堆heap為處理規則來管理底層容器實現,優先隊列具有隊列的所有特性,包括隊列的基本操作,只是在這基礎上添加了內部的一個排序,在優先隊列中,元素被賦予優先級。當訪問元素時,具有最高優先級的元素最先刪除。它本質是一個堆實現的。
(7)在C++中,標準庫提供了三種順序容器適配器:queue(FIFO隊列)、priority_queue(優先級隊列)、stack(棧) 。
(8)set 底層數據結構為紅黑樹,有序,不重復

紅黑樹是一種自平衡二叉查找樹,是在計算機科學中用到的一種數據結構
紅黑樹和AVL樹類似,都是在進行插入和刪除操作時通過特定操作保持二叉查找樹的平衡,從而獲得較高的查找性能。它雖然是復雜的,但它的最壞情況運行時間也是非常良好的,并且在實踐中是高效的: 它可以在O(log n)時間內做查找,插入和刪除,這里的n是樹中元素的數目。
紅黑樹是每個節點都帶有顏色屬性的二叉查找樹,顏色或紅色或黑色。在二叉查找樹強制一般要求以外,對于任何有效的紅黑樹我們增加了如下的額外要求:
性質1. 節點是紅色或黑色。
性質2. 根節點是黑色。
性質3 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
性質4. 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。


紅黑樹

(9)multiset 底層數據結構為紅黑樹,有序,可重復
(10)map 底層數據結構為紅黑樹,有序,不重復
(11)multimap 底層數據結構為紅黑樹,有序,可重復
(12)hash_set 底層數據結構為hash表,無序,不重復
(13)hash_multiset 底層數據結構為hash表,無序,可重復
(14)hash_map 底層數據結構為hash表,無序,不重復
(15)hash_multimap 底層數據結構為hash表,無序,可重復

2.三維數組

三維數組可以看成是一本書!int a[3][4][2]; 就是有3頁每頁4行2列

3.二維數組按行存儲和按列存儲

(1)為什么要引入以列序為主序和以行序為主序的存儲方式?
因為一般情況下存儲單元是單一的存儲結構,而數組可能是多維的結構,則用一維數組存儲數組的數據元素就存在著次序約定的問題,所以就有了以列序為主序和以行序為主序的存儲方式。
(2)以列序為主序的存儲方式的存儲地址計算公式:
LOC(i,j) = LOC(0,0) + (m行數×(j-1)+(i-1))×L
LOC(i,j)是a(i,j)的存儲位置; LOC(0,0)是a(0,0)的存儲位置(即二維數組的起始存儲位置,為稱為基地址或基址);m是數組的總行數,L是單個數據元素占據的存儲單元。
(3)以行序為主序的存儲方式的存儲地址計算公式:
LOC(i,j) = LOC(0,0) + (n列數×(i-1)+(j-1))×L,下標從1開始
注意:下標從0開始a(i,j)處于第i+1行j+1列,其地址為LOC(0,0) +(i×n+j)×L
LOC(i,j)是a(i,j)的存儲位置; LOC(0,0)是a(0,0)的存儲位置(即二維數組的起始存儲位置,為稱為基地址或基址);n是數組的總列數,L是單個數據元素占據的存儲單元。

4.數據結構中常用的操作的效率表

通用數據結構

專用數據結構

5.數組指針和指針數組

(1)定義不同
數組指針是指向數組首元素的地址的指針,其本質為指針(這個指針存放的是數組首地址的地址,相當于2級指針,這個指針不可移動);
指針數組是數組元素為指針的數組,其本質為數組。
(2)所占存儲空間的區別
數組指針只是一個指針變量,是C語言里專門用來指向二維數組的,它占有內存中一個指針的存儲空間。如int (*p)[10],p即為指向數組的指針,又稱數組指針。
指針數組是多個指針變量,以數組形式存在內存當中,占有多個指針的存儲空間,如char *p[5] 系統至少會分配5個連續的空間用來存儲5個元素,表示p是一個5個元素的數組,每個元素是一個指向字符型數據的一個指針。
(3)應用上的區別
指針數組一般用于處理二維數組。指向一維數組的指針變量用于處理二維數組也是非常方便的。
數組指針和指針數組在處理同一個二維數組時,數組指針的元素個數和指針數組的數組長度不相同,數組指針的元素個數和二維數組的列長度相同。 而指針數組的數組長度和二維數組的行長度相同。
在處理字符串的問題上,使用指針數組處理就比使用數組指針方便多了。因為多個字符串比用二維字符數組處理字符串更加方便,更加的節省內存空間。

數組指針和指針數組對比圖

例如:
若有定義:

int c[4][5],( *pc)[5];pc=c;那么,下列對數組C的元素引用正確的是

pc是一個數組指針(指向數組的指針),指向列數為5的二維數組,pc = c,表示pc指向二維數組的第一行,pc+1偏移一行,一行5個元素。*pc得到二維數組c的第一行數組的首地址,+2偏移到c[0][2]的地址,解引用就得到數據2。c[4][5]可以理解為4個長度為5的一位數組,這四個一維數組的地址要用數組指針存放。

6.廣義表

如果廣義表LS=(a1,a2...an)非空,則a1是LS的表頭,其余元素組成的表(a2,a3,..an)是稱為LS的表尾。
根據定義,非空廣義表的表頭是一個元素,它可以是原子也可以是一個子表,而表尾則必定是子表。例如:LS=(a,b),表頭為a,表尾是(b)而不是b.另外:LS=(a)的表頭為a,表尾為空表()。
廣義表即我們通常所說的列表(lists)。它放松了對表元素的原子性限制,允許他們有自身結構。
廣義表的特性:
廣義表的元素可以是子表,而子表的元素還可以是子表。
廣義表可為其他廣義表所共享。
廣義表可以是一個遞歸的表,即廣義表也可以是其本身的一個子表
二維以上的數組其實是一種特殊的廣義表
廣義表的長度:最大括號中的逗號數+1,如 ( f , () , (e), (a,(b,c,d)) ) 長度是4
廣義表的深度:每個元素的括號匹配數加1,如 ( f , () , (e), (a,(b,c,d)) )
f沒有括號匹配,深度為0+1=1
()一個括號匹配,深度為1+1=2 (e)一個括號匹配,深度為1+1=2
(a,(b,c,d))一共有兩個括號形成匹配,深度為2+1=3
深度取最大的為3
非空廣義表,除表頭外,其余元素構成的表稱為表尾,所以非空廣義表尾一定是個表。

7.排序

數據結構八大排序

插入排序(直接插入排序,希爾排序)
選擇排序(簡單選擇排序,堆排序)
交換排序(冒泡排序,快速排序)
歸并排序
基數排序

(1)插入排序之直接插入排序
方法:對于給定的一組記錄,初始時假定第一個記錄自成一個有序的序列,其余的記錄為無序序列;接著從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直至最后一個記錄插入到有序序列為止。
將21,25,49,25,16,08由小到大排序

直接插入排序各趟排序后的結果

(2)插入排序之希爾排序
希爾排序是插入排序的一種又稱“縮小增量排序”,是直接插入排序算法的一種更高效的改進版本。基本思想是:先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄依次進行直接插入排序。
希爾排序過程

(3)選擇排序之簡單選擇排序
基本思想是在要排序的一組數中,選出最小(或者最大)的一個數與第1個位置的數交換;然后在剩下的數當中再找最小(或者最大)的與第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最后一個數)比較為止。
簡單選擇排序過程

操作方法:
第一趟,從n 個記錄中找出關鍵碼最小的記錄與第一個記錄交換;
第二趟,從第二個記錄開始的n-1 個記錄中再選出關鍵碼最小的記錄與第二個記錄交換;
以此類推.....
第i趟,則從第i 個記錄開始的n-i+1 個記錄中選出關鍵碼最小的記錄與第i 個記錄交換,直到整個序列按關鍵碼有序。
(4)選擇排序之堆排序
堆是具有以下性質的完全二叉樹:
每個結點的值都大于或等于其左右孩子結點的值,稱為大頂堆;
或者每個結點的值都小于或等于其左右孩子結點的值,稱為小頂堆。
基本思路:
a.將待排序序列構建成一個堆,根據升序降序需求選擇大頂堆或小頂堆,(一般升序采用大頂堆,降序采用小頂堆);
b.此時,整個序列的最大值就是堆頂的根節點,將堆頂元素與末尾元素交換,將最大元素"沉"到數組末端;
c.重新調整結構,使其滿足堆定義,然后繼續交換堆頂元素與當前末尾元素,反復執行調整+交換步驟,直到整個序列有序。

建立大頂堆過程

排序過程

圖片來自博客園

(5)交換排序之冒泡排序
冒泡排序,類似于水中冒泡,較大的數沉下去,較小的數慢慢冒起來。
基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素“浮”到頂端,最終達到完全有序。

第一輪完畢結果

圖片來自博客園
冒泡排序過程

(6)交換排序之快速排序
快速排序是對冒泡排序的一種改進。
基本思想:
1.在待排序的元素任取一個元素作為基準(通常選第一個元素,但最的選擇方法是從待排序元素中隨機選取一個作為基準),稱為基準元素;
2.將待排序的元素進行分區,比基準元素大的元素放在它的右邊,比其小的放在它的左邊;
3.對左右兩個分區重復以上步驟直到所有元素都是有序的。

圖片來自博客園文章

快速排序過程

(7)歸并排序
歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法的一個非常典型的應用。分治法將問題分成一些小的問題然后遞歸求解,而治的階段則將分階段得到的各答案"修補"在一起,即分而治之。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。歸并排序是一種穩定的排序方法。

圖片來自博客園文章

分而治之

治階段,需要將兩個已經有序的子序列合并成一個有序序列,比如上圖中的最后一次合并,要將[4,5,7,8]和[1,2,3,6]兩個已經有序的子序列,合并為最終序列[1,2,3,4,5,6,7,8]


實現步驟

(8)基數排序
基數排序基本原理是將整數按位數切割成不同的數字,然后按每個位數分別比較。基數排序法會使用到桶,通過將要比較的位(個位、十位、百位…),將要排序的元素分配至 0~9 個桶中,達到排序的作用,在某些時候,基數排序法的效率高于其它的比較性排序法。

圖片來自CSDN

排序過程

各種排序算法的總結

8.數組常用方法

Array方法

9.線性表,順序表,鏈表和數組的區別

一張圖表示它們的關系

在C語言中,數組和線性表的區別:數組長度不可變,線性表長度是動態可變的。
邏輯結構:結構定義中是對操作對象的數學描述,描述的是數據元素之間的邏輯關系。例如,線性結構,樹形結構,圖狀結構或網狀結構。它們都屬于邏輯結構。
物理結構:又稱存儲結構,是數據結構在計算機中的表示(又稱映像)。例如,數組,指針。
線性表:屬于邏輯結構中的線性結構,它包括順序表和鏈表。
順序表:線性表中的一種,它是用數組來實現的一種線性表,所以它的存儲結構(物理結構)是連續的。
鏈表:線性表中的一種,它的存儲結構是用任意一組存儲單元來存儲數據元素。所以它的存儲結構可以是連續的,也可以不是連續的。一般我們說的鏈表都是不連續的。有一種用數組來表示的鏈表,叫做靜態鏈表,它的存儲結構就是連續的。
數組:一種物理結構,它的存儲單元是連續的。

轉載簡書:http://www.lxweimin.com/p/2008e29c39e2

數組和鏈表的區別與聯系:

相同:兩種結構均可實現數據的順序存儲,構造出來的模型呈線性結構
不同:數組是順序的存儲結構,把所有元素按次序依次存儲。
數組從棧中分配空間,鏈表從堆中分配空間
鏈表是鏈式的存儲結構,通過指針來連接元素與元素,

數組的特點:

在內存中,數組是一塊連續的區域。
數組需要預留空間,在使用前要先申請占內存的大小,可能會浪費內存空間。
插入數據和刪除數據效率低,插入數據時,這個位置后面的數據在內存中都要向后移。刪除數據時,這個數據后面的數據都要往前移動。
隨機讀取效率很高。因為數組是連續的,知道每一個數據的內存地址,可以直接找到給地址的數據。
并且不利于擴展,數組定義的空間不夠時要重新定義數組

鏈表的特點:

在內存中可以存在任何地方,不要求連續。
每一個數據都保存了下一個數據的內存地址,通過這個地址找到下一個數據。
查找數據時效率低,因為不具有隨機訪問性,所以訪問某個位置的數據都要從第一個數據開始訪問,然后根據第一個數據保存的下一個數據的地址找到第二個數據,以此類推。
插入刪除速度快
不指定大小,擴展方便。鏈表大小不用定義,數據隨意增刪。

10.ArrayList和LinkedList的區別

1.ArrayList基于動態數組的數據結構,LinkedList基于鏈表的數據結構。
2.對于隨機訪問get和set,ArrayList優于LinkedList,因為LinkedList要移動指針。
3.對于新增和刪除操作add和remove,LinkedList比較占優勢,因為ArrayList要移動數據。
在一個長度為n的順序表中刪除第i個元素,要移動n-i個元素。如果要在第i個元素前插入一個元素,要后移n-i+1個元素。
向一個長度為n的向量的第i個元素(1≤i≤n+1)之前插入一個元素時,需向后移動n-i+1個元素。
從一個長度為n的順序表中刪除第i個元素(1≤i≤n)時,需向前移動n-i個元素

11.稀疏矩陣

原文鏈接:https://blog.csdn.net/qq_35733751/article/details/80843589

在矩陣中,若數值為0的元素數目遠遠多于非0元素的數目,并且非0元素分布沒有規律時,則稱該矩陣為稀疏矩陣
壓縮存儲方式:三元組
三元組方式存儲數據的策略是只存儲非零元素。但是稀疏矩陣中非零元素的分布是沒有任何規律的,在這種情況下,存儲方案是:
1.存儲非零元素
2.同時存儲該非零元素所對應的行下標和列下標
3.稀疏矩陣中的每一個非零元素需由一個三元組(i, j, aij)唯一確定,稀疏矩陣中的所有非零元素構成三元組線性表,三元組中的i就是行下標,j是列下標,aij是對應的元素值。

稀疏矩陣的壓縮存儲

當我們確定三元組的存儲策略后,下一步我們要做的就是如何把這樣的三元組存儲下來。我們在進行保存時,需要把矩陣中的行數,列數,非零元素個數,矩陣中的數據都保存在data數據域(數組),在data數據域中的每個數據元素都是以三元組(行號,列號,元素值)形式存儲,data域中表示的非零元素通常以行序為主序順序排列,下標按行有序的存儲結構。如圖2所示:
定義存儲結構

12.對稱矩陣的壓縮

在處理對稱矩陣的存儲的問題上,通常為多個值相同的元素分配一個存儲空間,也就是將n^2個元素壓縮存儲到n*(n+1)/2個元素的存儲空間中。一般情況下,以行序為主序存儲其下三角中的元素。
假設以一維數組M[n(n+1)/2]作為n階對稱矩陣A的存儲結構,則M[k]和矩陣中的元素aij之間存在著下述一一對應的關系:


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容