数据结构知识点
- 第一章 基本概念
- 1.1 數據關系
- 1.2 邏輯結構和物理結構
- 第二章 算法
- 2.1 算法特性
- 2.2 算法設計的要求:
- 2.3 算法時間復雜度
- 2.4 算法時間復雜度
- 2.5 總結
- 第三章、線性表
- 3.1 線性表的抽象數據類型
- 3.2 線性表的順序存儲結構
- 3.2.1 數組計算方法
- 3.2.2 順序存儲結構的插入與刪除
- 3.3 線性表的鏈式存儲結構
- 3.3.1 順序存儲結構不足的解決方法
- 3.3.2 線性表鏈式存儲結構定義
- 3.3 線性表的鏈式存儲結構
- 3.4 單鏈表的讀取、插入與刪除
- 3.5 單鏈表結構與順序存儲結構的優缺點
- 3.6 靜態鏈表
- 3.7 循環鏈表
- 3.8 循環鏈表
- 第四章 棧與隊列
- 4.1 棧的定義
- 4.2 棧的抽象數據類型
- 4.3 隊列(queue)的定義
- 第五章 串
- 第六章 樹
- 6.1 樹的定義
- 6.2 二叉樹的定義
- 6.2.1 特殊二叉樹
- 6.2.2 二叉樹的性質
- 6.2.3 二叉樹的存儲結構
- 6.3 二叉樹的遍歷
- 6.4 樹、森林、二叉樹的轉換
- 6.4.1 樹轉換為二叉樹
- 6.4.2 森林轉換為二叉樹
- 6.4.3 二叉樹轉換為樹
- 6.4.4 二叉樹轉換為森林
- 6.5 樹與森林的遍歷
- 6.6 哈夫曼樹
- 第七章 圖
- 7.1 圖的定義
- 7.2 圖的存儲結構
- 7.2.1 鄰接矩陣
- 7.2.2 鄰接表
- 7.2.3 十字鏈表
- 7.2.4 鄰接多重表
- 7.2.5 邊集數組
- 7.3 圖的遍歷
- 7.3.1 深度優先遍歷(深度優先搜索Depth_First_Search,DFS)
- 7.3.2 廣度優先遍歷(廣度優先搜索,Breadth_First_Search,BFS)
- 7.4 最小生成樹
- 7.5 最短路徑
- 第八章 查找
- 8.1 查找的方法
- 8.2 二叉樹排序
- 第九章 排序
- 9.1 排序的穩定性
- 9.2 冒泡排序
- 9.3 簡單選擇排序法
- 9.4 直接插入排序
- 9.5 希爾排序
- 9.6堆排序
- 9.7 歸并排序
- 9.8 快速排序
- 第一章 基本概念
第一章 基本概念
1.1 數據關系
數據項→→數據元素→→數據對象→→數據
數據項:數據項組成數據元素,數據項是不可分割的最小單位
數據元素:組成數據的基本單位
數據對象:性質相同的數據元素的集合
數據:描述客觀事物的符合
數據結構:相互之間存在一種或多種特定關系的數據元素的集合
1.2 邏輯結構和物理結構
邏輯結構:數據對象中數據元素的相互關系
- 邏輯結構包括:集合結構、線性結構、樹形結構、圖形結構
物理結構:數據的邏輯結構在計算機中的存儲形式,也就是將數據元素存儲到存儲器
物理結構包括:順序存儲結構、鏈式存儲結構
順序存儲結構:把數據元素存放在地址連續的存儲單元,數據間邏輯關系和物理關系是一樣的
鏈式存儲結構:把數據元素存儲到任意存儲單元中,這些單元可以是連續的也可以是不連續的
鏈式存儲很靈活,不用在意存儲的位置,只要有一個存放地址的指針就好了。
第二章 算法
算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,且每條指令表示一個或多個操作。
2.1 算法特性
輸入、輸出、有窮性、確定性、可行性
- 輸入輸出:算法具有輸入和輸出
- 有窮性:算法不會出現無限循環,并且每個步驟可在可接受時間內完成
- 確定性:每個步驟都有確定的含義
- 可行性:算法的每一步都是可行的,也就是每一步都能夠通過執行的有限次完成
2.2 算法設計的要求:
- 正確性
- 可讀性
- 健壯性
- 時間效率高、存儲量低
2.3 算法時間復雜度
在進行算法分析時,語句總的執行次數T(n)是關于問題規模n的函數,進而分析T(n)隨著n的變化情況而確定T(n)的數量級。
時間復雜度,也就是算法的時間度量,表示歲問題規模n的增大,算法執行時間的增長率和f(n)的增長率相同。
一般情況下,隨著n的增大,T(n)增大最慢的方法是最優算法
用大寫的O()來體現算法復雜度的記法,稱為大O法。
如何推導時間復雜度:
1、常數階:O(1)
2、線性階:O(n)
關鍵在于分析循環結構內部情況,下面程序復雜度為O(n)
int i for (i=0;i<n;i++) {//時間復雜度為O(1)的程序 }3、對數階:O(log n)
int count=1; while(count<n) {count=count*2 //時間復雜度為O(1)的程序 }由于每次count*2以后,就距離n更近了,也就是說有多少個2相乘后大于n,則會退出循環,2x=n?>x=log2n2x=n?>x=log2n,所以時間復雜度為O(log n)
4、平方階:O(n^2)
int i,j; for(i=0;i<n;i++) {for(j=0;j<n;j++){//時間復雜度為O(1)的程序} }相當于循環了n*n次,時間復雜度為O(n^2),如果外部循環m次,時間復雜度為O(n^m)
總結:時間復雜度為循環體的復雜度乘以該循環運行次數
2.4 算法時間復雜度
2.5 總結
第三章、線性表
線性表(List):零個或多個數據元素的有限序列
元素之間是有順序的:第一個元素無前驅,最后一個元素無后繼,其他元素都有前驅和后繼
線性表強調是有限的
數學表達:
3.1 線性表的抽象數據類型
3.2 線性表的順序存儲結構
順序存儲結構:用一段地址連續的存儲單元一次存儲線性表的數據元素
線性表存儲結構代碼:
順序存儲結構的三個屬性:
- 存儲空間的起始位置:數組data,它的存儲位置就是存儲空間的存儲位置
- 線性表的最大存儲容量:數組長度MaxSize
- 線性表的當前長度:length
3.2.1 數組計算方法
數據元素的序號和存放它的數組下標之間的對應關系:
第i+1個數據元素和第i個數據元素存儲位置的關系:LOC(ai+1)=LOC(ai)+cLOC(ai+1)=LOC(ai)+c(c為每個數據元素所占存儲單元)
第i個數據元素可以由a1推出:LOC(ai)=LOC(a1)+(i?1)?cLOC(ai)=LOC(a1)+(i?1)?c
線性表的存取時間性能為:O(1)
3.2.2 順序存儲結構的插入與刪除
(1)獲取元素
時間復雜度為O(1)O(1)
(2)插入
(3)刪除
(4)時間復雜度
如果插入最后一個位置,或刪除最后一個位置,時間復雜度為O(1)O(1)
如果插入第一個位置,或刪除第一個元素,時間復雜度為O(n)O(n)
平均的情況:插入第i個位置,或刪除第i個元素,需要移動n-i個元素,根據概率原理,每個位置插入或刪除可概率是相同的,所以最終平均移動次數和最中間那個元素的移動次數相等為n?1nn?1n,所以時間復雜度還是O(n)O(n)
總結:讀取的時候,復雜度為O(1)O(1),插入或刪除復雜度為O(n)O(n),說明其適合元素個數不太變換,而存儲操作更多的數據。
(5)線性表順序存儲結構的優缺點
3.3 線性表的鏈式存儲結構
3.3.1 順序存儲結構不足的解決方法
3.3.2 線性表鏈式存儲結構定義
鏈式結構:元素信息+后繼元素的地址
結點Node:存儲數據元素信息的域(數據域)+存儲后繼元素的地址的域(指針域)
單鏈表:每個結點只包含一個指針域的線性鏈表
頭指針:鏈表第一個結點的存儲位置
最后一個結點的后繼不存在,即最后一個結點的指針為空(NULL)
頭結點:第一個結點前設一個結點,可以不存儲任何信息,也可以存儲長度等附加信息
頭結點與頭指針的異同:
3.3 線性表的鏈式存儲結構
帶有頭結點的單鏈表:
空鏈表:
設p是指向線性表第i個元素的指針,節點ai的指針域可以用p->data來表示,p->data的值是一個數據元素,節點ai的指針域可以用p->next來表示,p->next的值是一個指針,指向第i+1個元素,也就是ai+1的指針。
也就是,p->data=ai,p->next->data=ai+1
3.4 單鏈表的讀取、插入與刪除
1、讀取
2、插入
不用改變其他結點,只需要讓s->next和p->next的指針做一點改變即可
s->next=p->next; p->next=s;也就是讓p的后繼結點變為s的后繼節點,再把s變為p的后繼結點
3、刪除
q=p->next; p->next=q->next;也就是讓p的后繼的后繼結點,改為p的后繼結點。
4、對比
3.5 單鏈表結構與順序存儲結構的優缺點
3.6 靜態鏈表
用數組描述的鏈表叫做靜態鏈表
數組的元素=兩個數據域組成(數據域data+游標cur)
數組的第一個和最后一個元素作為特殊處理單元,不存數據
3.7 循環鏈表
單鏈表的終端結點的指針端原本為空指針,之后改為指向頭結點,使整個單鏈表形成一個環,稱為單循環鏈表,簡稱循環鏈表。
解決的問題:可以從當前一個結點出發,訪問到列表的全部結點
3.8 循環鏈表
在單鏈表的每個結點中,再設置一個指向前驅結點的指針域,所有每個結點都有兩個指針域,一個指向后繼,一個指向前驅。
第四章 棧與隊列
棧是限定僅在表尾進行插入和刪除操作的線性表
隊列是只允許在一端進行插入操作、而在另一端進行刪除操作的線性表
4.1 棧的定義
棧是限定僅在表尾進行插入和刪除操作的線性表
棧頂:允許插入和刪除的一端
棧底:不允許任何操作
規則:先進后出(線性表)
進棧:插入
出棧:刪除
4.2 棧的抽象數據類型
進棧:插入,push
出棧:刪除(彈棧),pop
4.3 隊列(queue)的定義
隊列是只允許在一端進行插入操作、而在另一端進行刪除操作的線性表
隊列是一種先進先出的線性表(First in first out)的線性表,FIFO。
隊尾:允許插入的一端
對頭:允許刪除的一端
第五章 串
由零個或多個字符組成的有限序列,又叫字符串
第六章 樹
樹是n個結點的有限集,n=0時,稱為空樹,在任意一顆非空樹中:
- 有且僅有一個特定的稱為根的結點(Root)
- 當n>1時,其余結點可分為m個互不相交的有限集合(T1,T2,…,Tn),其中每個集合本身又是一棵樹,并且車管我根的子樹(Subtree)
6.1 樹的定義
樹的結點包含一個數據元素及若干個指向其子樹的分支,結點擁有的子樹數量稱為結點的度。
結點的分類:
- 葉結點/終端結點:度為0的結點
- 分支結點/非終端結點:度不為0的結點
樹的度:樹內各個結點的度的最大值
上圖的樹的度為3
結點間的關系:
結點的子樹的根稱為該結點的孩子,該結點稱為孩子的雙親,同一個雙親的孩子稱為兄弟,結點的祖先是從根節點到該結點所經分支上的所有結點。
結點的層次:
層次(Level)從根開始定義,樹中結點的最大層次稱為樹的深度(Depth)或高度。
有序樹:樹中結點的各個子樹看成是從左至右有次序的,不能互換
無序樹:可以互換
6.2 二叉樹的定義
二叉樹(Binary tree)是n個結點的有限集合,該集合或者為空集(空二叉樹),或者由一個根節點和兩顆互不相交、分別稱為根節點的左子樹和右子樹的二叉樹組成。
二叉樹的特點:
二叉樹的五種形態:
6.2.1 特殊二叉樹
1、斜樹
所有結點都只有左子樹的二叉樹叫左斜樹
所有結點都只有右子樹的二叉樹叫右斜樹
2、滿二叉樹
所有分支節點都存在左子樹和右子樹,并且所有葉子都在同一層上的二叉樹。
3、完全二叉樹
對一棵有n個結點的二叉樹按層序編號,如果編號為i的結點與同樣深度的蠻二叉樹中編號為i的節點在二叉樹中的位置完全相同,則成全完全二叉樹。
滿二叉樹一定是完全二叉樹,完全二叉樹不一定是滿二叉樹。
完全二叉樹特點:
6.2.2 二叉樹的性質
1、在二叉樹的第i層,至多有2i?12i?1個結點
2、深度為k的二叉樹最多有2k?1個結點2k?1個結點
3、對任何一棵二叉樹T,如果其終端結點數為n0n0,度為2的結點數為n2n2,則n0=n2+1n0=n2+1
4、具有n個結點的完全二叉樹的深度為[log2n]+1([x]表示不大于x的最大整數)[log2n]+1([x]表示不大于x的最大整數)
5、對完全二叉樹的任意結點i:
6.2.3 二叉樹的存儲結構
1、二叉樹的順序存儲結構
用一維數組存儲二叉樹中的結點,并且結點的存儲位置,也就是數組的下標要能體現結點之間的邏輯關系。
完全二叉樹:
一般二叉樹:
可以將其按完全二叉樹來編號,不過把不存在的結點設置為空而已:
但是這樣一來會對存儲空間浪費,所以順序存儲結構一般只用于完全二叉樹
2、二叉鏈表
data->數據域,lchile和rchile->左孩子和右孩子的指針
6.3 二叉樹的遍歷
從根節點出發,按照某種次序依次訪問二叉樹中所有結點,使得每個借點被訪問一次,且僅被訪問一次。
1、前序遍歷
若二叉樹為空,則空操作返回,否則先訪問根節點,然后前序遍歷左子樹,再前序遍歷右子樹,下圖遍歷順序為:ABDGHCEIF
2、中序遍歷
若二叉樹為空,則空操作返回,否則從根節點開始(并不訪問),中序遍歷左子樹,然后訪問根節點,最后中序遍歷右子樹,下圖遍歷順序為:GDHBAEICF
3、后序遍歷
若二叉樹為空,則空操作返回,否則從左到右,先葉子后結點的方式遍歷訪問左右子樹,最后訪問根節點,,下圖遍歷順序為:GHDBIEFCA
4、層序遍歷
若二叉樹為空,則空操作返回,否則從樹的第一層,也就是根結點開始訪問,從上而下逐層遍歷,同一層中,按從左到右的順序對結點逐個訪問,遍歷順序為:ABCDEFGHI
上述四種方法其實都是在把樹中的結點變成某種意義的線性序列,給程序實現帶來好處。
6.4 樹、森林、二叉樹的轉換
6.4.1 樹轉換為二叉樹
6.4.2 森林轉換為二叉樹
6.4.3 二叉樹轉換為樹
6.4.4 二叉樹轉換為森林
6.5 樹與森林的遍歷
6.6 哈夫曼樹
結點的帶權路徑:該結點到樹根之間的路徑長度與結點上權的乘積
樹的帶權路徑:樹中所有結點的帶權路徑長度之和
哈夫曼樹:帶權路徑長度WPL最小的二叉樹,稱為哈夫曼樹,也叫最優二叉樹
構造哈夫曼樹的過程:
構造哈夫曼樹:
第七章 圖
7.1 圖的定義
1、無向邊:頂點之間沒有方向,稱這條邊為無向邊,用無序偶對(vi,vj)(vi,vj)來表示
2、有向邊:頂點之間有方向,稱這條邊為有向邊,也稱為弧,用有序偶對<vi,vj><vi,vj><script type="math/tex" id="MathJax-Element-21"></script>來表示,如果圖中任意兩個頂點的邊都是有向邊,則稱該圖為有向圖,要區分開弧尾vj和弧頭vi
無向圖中,如果任意兩個頂點之間都存在邊,則稱該圖為無向完全圖,含有n個頂點的無向完全圖有n(n?1)2n(n?1)2條邊。
有向圖中,如果任意兩個頂點間都存在方向互為相反的兩條弧,則稱為有向完全圖。含有n個頂點的有向完全圖有n(n?1)n(n?1)條邊。
3、連通圖:無向圖中,如果兩個頂點之間有路徑,說明兩頂點是連通的,如果對于圖中任意兩個頂點都是連通的,則稱該無向圖是連通圖。
圖1不是連通圖,圖2是連通圖
4、極大連通子圖稱為連通分量
圖7-2-12的圖1是一個無向非連通圖,但是他有兩個連通分量,即圖2 和圖3,而圖4雖然是圖1的子圖,但是不滿足連通子圖的極大頂點數,所以不是圖1的無向圖的連通分量。
有向圖中,如果對于每一對vi,vj(vi不等于vj),從vi到vj都存在路徑,稱其為強連通圖。
圖的定義的總結:
7.2 圖的存儲結構
圖的結構比較復雜,任意兩個頂點之間都可能存在聯系,所以不可能用簡單的順序存儲結構來表示,所以用下面的五種方法來存儲圖。
7.2.1 鄰接矩陣
鄰接矩陣的存儲方式:兩個數組來表示圖,一個一維數組存儲圖中頂點的信息,一個二維數組(稱為鄰接矩陣)存儲圖中的邊或弧的信息。
7.2.2 鄰接表
臨近矩陣的問題:對邊數相對頂點數較少的圖,這種結構是對存儲空間的極大浪費,太稀疏。
鄰接表:將數組與鏈表結合起來
7.2.3 十字鏈表
7.2.4 鄰接多重表
7.2.5 邊集數組
7.3 圖的遍歷
從圖中某一頂點出發訪問圖中其余頂點,且使每一個頂點僅被訪問一次,該過程叫圖的遍歷。
7.3.1 深度優先遍歷(深度優先搜索Depth_First_Search,DFS)
從圖中某個頂點v出發,訪問此頂點,然后從v的未被訪問的鄰接點出發,深度優先遍歷,直到圖中所有和v有路徑相通的頂點都被訪問到。
深度優先遍歷類似于樹的前序遍歷
7.3.2 廣度優先遍歷(廣度優先搜索,Breadth_First_Search,BFS)
廣度優先遍歷類似于樹的層序遍歷
深度和廣度優先遍歷在時間復雜度上是一致的,沒有優劣之分,只是視情況選擇而已。
深度優先更適合目標比較明確,以找到目標為主的情況,廣度優先更適合在不斷擴大遍歷訪問時找到最優解的情況。
7.4 最小生成樹
我們將構成連通網的最小代價生成樹稱為最小生成樹。
7.5 最短路徑
最短路徑是兩頂點之間經過的邊上權值之和最少的路徑,并且成第一個頂點是源點,最后一個頂點是終點。
1、迪杰斯特拉(Dijkstra)算法
一步步求出他們之間頂點的最短路徑,過程都是基于已經求出的最短路徑的基礎上,求得更遠頂點的最短路徑。
2、弗洛伊德(Floyd)算法
第八章 查找
根據給定的某個值,在查找表中確定一個其關鍵字等于給定值的數據元素。
靜態查找和動態查找:
8.1 查找的方法
1、順序查找
順序查找的優化:
2、有序表查找
a、折半查找
將每次取中間記錄查找的方法叫做折半查找,如果示:
折半查找也叫二分查找,前提是線性表中的記錄必須是關鍵碼有序(通常從小到大有序),線性表必須采用順序存儲。
折半查找的思想:在有序表中,若給定值小于中間記錄的關鍵字,則在中間記錄的左半邊繼續查找,若給定的值大于中間記錄的關鍵字,則在中間記錄的右半邊繼續查找,不斷重復,直到查找成功,或查找區域無記錄,查找失敗為止。
b、插值查找
3、線性索引查找
8.2 二叉樹排序
第九章 排序
9.1 排序的穩定性
內排序與外排序:
根據排序過程中,待排序記錄是否全部被放置在內存中,排序分為:內排序和外排序
- 內排序:排序過程中,待排序的所有記錄全部被放置在內存中(主要介紹內排序)
- 外排序:排序過程中,待排序的記錄個數太多,不能同時放置在內存,整個排序過程需要在內外存之間多次進行數據交換才可以。
9.2 冒泡排序
兩兩比較相鄰記錄的關鍵字,如果反序則交換,如直到沒有反序的記錄為止。
冒泡排序優化:
復雜度分析:
9.3 簡單選擇排序法
通過n-i次關鍵字間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,并和第i個記錄交換。
復雜度分析:
9.4 直接插入排序
將一個記錄插入已經排好序的有序表中,從而得到一個新的,記錄數增1的有序表。
復雜度分析:
9.5 希爾排序
突破前面的時間復雜度為O(n^2)的第一批算法之一
直接插入排序在什么時候有優勢:
- 記錄本身就是基本有序的
- 記錄數量比較少時
但是上述要求在現實中過于嚴苛,所以希爾研究出的方法對直接插入排序改進后,可以增加效率。
希爾排序:采取跳躍分割的策略,將相距某個“增量(gap)”的記錄組成一個子序列,這樣才能保證在子序列內分別進行直接插入排序后的結果是基本有序的,而不是局部有序的。
初始序列:
第一輪:
① i=5,第1位和第5位比較,gap=4,將第5位的3和第1位的9交換了位置,變為:
② i=6,第2位和第6位比較,第二位>第六位,不交換
③i=7, 第三位和第七位比較,第三位>第七位,交換,變為
④ i=8,第四位和第八位比較,第四位>第八位,交換,變為
⑤ i=9,第五位和第九位比較,第五位>第九位,交換,變為
下標:0 1 2 3 4 5 6 7 8 9
數值:2 3 1 4 6 2 7 5 8 9
還要比較第五位和第1位的數據,最終變為2 1 4 6 3 7 5 8 9
第二輪:
① increment=4/3+1=2,i從2+1=3開始,到9結束,
9.6堆排序
將上圖利用層序遍歷存入數組,滿足下列結構:
第一個for循環:將整個待排序序列構成一個大頂錐
第二個for循環:逐步將每個最大的值的根節點與末尾元素交換,并調整其成為大頂錐
堆排序的時間復雜度為O(nlogn)O(nlogn)
9.7 歸并排序
利用歸并的思想實現,原理是假設初始序列含有n個記錄,則可以看成n個有序的子序列,每個子序列的長度為1,然后兩兩歸并,得到[n/2](表示除了之后的最大整數)個長度為2或1的有序子序列,再兩兩歸并,如此重復,得到一個長度為n的有序序列為止,稱為3路歸并排序。
9.8 快速排序
通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。
時間/空間復雜度:O(logn)O(logn)
總結
- 上一篇: 密室逃脱24第5关怎么玩
- 下一篇: 25个神经网络模型