資料結構知識框架
先概覽一下思維導圖
初識資料結構
概念
-
資料
- 描述客觀事物的符號,是計算機中可以操作的物件,能被計算機識別,並輸入給計算機處理的符號集合
-
資料元素
- 是組成資料的、有一定意義的基本單位,在計算機通常作為整體處理,也被稱為記錄
-
資料項
- 一個資料元素可以由若干個資料項組成。資料項是資料不可分隔的最小單位
資料結構形式
-
資料結構
-
是相互之間存在一種或多種特定關係的資料元素的集合
-
分類
-
邏輯結構
- 集合結構
- 線性結構
- 樹形結構
- 圖形結構
-
物理結構
- 順序儲存結構
- 鏈式儲存結構
-
-
-
具體概念
-
邏輯結構
- 資料物件中資料元素之間的相互關係
-
集合結構
- 集合中的資料元素除了同屬一個集合外,它們之間沒有其他關係
-
線性結構
- 資料元素之間是一對一的關係
-
樹形結構
- 資料元素之間存在的一種一對多的層次關係
-
圖形結構
- 資料元素是多對多的關係
-
物理結構
- 資料的邏輯結構在計算機中的儲存形式
-
順序儲存結構
- 資料元素存放在地址連續的儲存單元裡,其資料間的邏輯關係和物理關係是一致的
-
鏈式儲存結構
- 資料元素存放在任意的儲存單元裡,儲存單元可以是連續的,也可以是不連續的
-
邏輯結構是面向問題的,物理結構是面向計算機的,其基本的目標就是將資料及其邏輯關係儲存到計算機的記憶體中
程式
- 演算法
- 資料結構
演算法
-
解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作
-
演算法特性
-
輸入
- 演算法有零個或多個輸入
-
輸出
- 至少有一個或多個輸出
-
有窮性
- 演算法在執行有限的步驟之後,自動結束而不會出現無限迴圈,並且一個步驟在可接受的時間內完成
-
確定性
- 演算法的每一個步驟都有確定含義,不會出現二義性
-
可行性
- 演算法的每一步都必須是可行的,也就是說,每一步都能夠通過執行有限次數完成
-
-
設計演算法要求
- 正確性
- 可讀性
- 健壯性
- 時間效率高
- 且空間使用率低
- 簡單性
演算法的複雜度
時間複雜度
空間複雜度
演算法分析的分類
-
平均情況
- 任意輸入規模的期望執行次數
-
最壞情況
- 任意輸入規模的最大執行次數
-
最好情況
- 任意輸入規模的最小執行次數,通常最好情況不會出現
時間複雜度--O漸進表示法
-
一般演算法O(n)計演算法
- 用常數1取代執行時間中的所有加法常數
- 在修改後的執行次數函式中,只保留最高階項
- 如果最高階項係數存在且不是1,則去除與這個項相乘的常數
-
分治演算法的時間複雜度計算
- 二分搜尋演算法的時間複雜度是lgN
- M分搜尋演算法的時間複雜度為logM^N
-
遞迴演算法的時間複雜度計算
- 遞迴總次數*每次遞迴次數
-
遞迴演算法空間複雜度演算法
- N*每次遞迴空間大小
遞迴
遞迴定義
- 若一個物件部分的包含它自己或者用它自己給自己定義,則稱這個物件是遞迴的
遞迴的過程
- 一個過程直接或間接的呼叫自己
遞迴的思想
- 把問題分解成規模更小的具有與原來問題具有相同解法的小問題
遞迴條件
- 縮小問題規模,使新問題與原問題具有相同的解決方式
- 設定遞迴的出口
遞迴分類
-
資料結構遞迴
-
問題解法遞迴
-
遞迴呼叫棧
-
尾遞迴
-
遞迴呼叫返回的結果總被直接返回
-
尾遞迴的本質
- 將單次計算的結果快取起來,傳遞給下一次呼叫,相當於自動累積
-
-
時間複雜度
- 遞迴總次數*每次遞迴次數
-
回溯法
- 基本思想
- 迷宮演算法
遞迴的優缺點
-
優點
- 遞迴在解決某些問題的時候使得我們思考的方式的以簡化,程式碼也更加簡練,容易閱讀
-
缺點
- 遞迴的實質就是自己呼叫自己,而函式的呼叫開銷是很大的,系統要為每次函式呼叫分配空間儲存空間,並將呼叫點資訊壓棧,而在函式的呼叫結束後,還要釋放空間,彈棧恢復斷點,如果遞迴方案的複雜度
棧
棧的概念
- 一種特殊的線性表,只允許從一端插入和刪除資料
特點:後進先出
順序棧
- 順序堆疊和書序表資料成員相同 ,不同之處,順序堆疊的入棧和出棧操作只允許對當前棧頂進行
共享棧
-
一個陣列實現兩個棧
-
原理
- 既然是兩個棧共享一段空間,向中間靠攏,陣列兩端表示兩個棧的棧底,棧頂一直向中間靠近
-
應用場景
- 兩個棧空間需求有相反的關係,也就是一個增長一個縮短的場景
鏈式棧
- 頭插頭刪
棧的應用
- 括號匹配
- 逆波蘭表示式
- 迷宮演算法
佇列
只允許在一端插入資料,在另一端刪除資料的特殊線性表
順序佇列
-
實現方式一
- 隊頭不動出佇列時所有元素向前移動
-
實現方式二
- 出佇列時,隊頭向後移動一個位置
-
假溢位現象
- 多次入佇列、出佇列操作後出現的尚有儲存空間但不能進行入佇列操作的溢位
-
真溢位現象
- 最大儲存空間已經儲存滿,繼續進行入佇列操作
迴圈佇列
-
頭尾相接的順序儲存佇列就是迴圈佇列
-
佇列滿佇列空的判斷
-
少用一個儲存空間
- 隊尾指標加一等於隊頭指標就是佇列滿的判斷條件
- 判空條件是尾和頭相等
-
設計一個標記flag
- 初始flag置為0,入佇列成功flag=1,出佇列成功flag置為0
- 隊空條件rearfront&&flag0,
- 堆滿條件rear==front&&flag=1
-
設定一個計數器
- 初始時count=0,入佇列成功,count+1,出佇列成功count-1
- 佇列空的條件count==0
- 佇列滿的條件count>0&&rear==front或者count == MaxSize
-
鏈式佇列
- 佇列的鏈式儲存結構,其實就是線性表的單連結串列,只不過它只能尾進,頭出而已
優先順序佇列
-
帶有優先順序的佇列
- 優先順序高的先出佇列,優先順序相同的遵守先進先出規則
佇列的應用
- 生產者消費者模型
- 訊息佇列
- 排隊現象
- 網路資料傳輸
矩陣
特殊矩陣
- 有很多值相同的元素或有許多零元素,且值相同的元素或零元素的分佈有一定規律的矩陣
對稱矩陣
-
一個N*N矩陣,任意Aij = Aji
-
對稱矩陣壓縮儲存
- 由於對稱矩陣上三角和下三角是相同的所以只需存一半即可
-
對稱矩陣和對稱壓縮儲存的關係
-
下三角
- i>jSymmetricMatrix[i][j] == Array[i*(i+1)/2+j]
-
稀疏矩陣
-
M*N矩陣,矩陣有效值的個數遠小於無效值的個數,分佈沒有規律
-
稀疏矩陣壓縮儲存
-
只儲存少量的有效值
- 使用{row,col,value}三元組按照陣列中的位置,以行優先順序先後順序一次存放
-
矩陣逆置
- 行列互換
- 快速逆置
初識樹
樹的基本概念
-
由N個節點(N>=0)構成的集合
- 有一個特殊的節點,稱為根節點,根節點沒有前驅節點
- 除過根節點外,其餘節點別分成M個(M>0)個互不相交的集合T1、T2...Tn,其中每一個集合又是一棵與樹結構類似的子樹
- 樹是遞迴定義的
名詞解釋
-
結點
- 結點包括一個資料元素及若干指向其他子樹的分支(指標(索引))
-
結點的度
- 結點所擁有的的子樹的個數
-
度為0的結點
- 又稱終端節點
-
分支結點
-
度不為零的結點
- 非終端結點
-
-
祖先結點
- 從根結點到該結點所經分支上的所有結點
-
子孫結點
- 以某結點為根結點的子樹中的所有結點
-
雙親結點
- 樹中某結點有孩子節點,該結點稱為它孩子節點的雙親結點
-
孩子結點
- 樹中一個結點的子樹的根結點稱為該結點的孩子結點
-
兄弟結點
- 具有相同雙親結點的結點
-
樹的度
- 樹中所有結點的度的最大值
-
結點的層次
- 從根結點到樹中某結點所經路徑上的分支數
-
樹的深度
- 樹中所有結點的層次的最大值
-
有序樹
- 樹中結點的各棵子樹T0,T1...是有序的
-
無序樹
- 樹中結點的各棵子樹之間的次序不重要,可以相互交換位置
-
森林
- 樹m棵樹的集合
樹的表示方法
- 目錄結構
- 集合文氏圖
樹的儲存結構
-
雙親表示法
-
用指標表示出每個結點的雙親結點
-
優點
- 尋找一個結點的雙親結點操作實現很方便
-
缺點
- 尋找一個結點的孩子結點很不方便
-
-
-
孩子表示法
-
用指標指出每個結點的孩子結點
-
優點
- 尋找一個結點的孩子結點比較方便
-
缺點
- 尋找一個結點的雙親結點很不方便
-
-
-
雙親孩子表示法
- 用指標既表示出每個結點的雙親結點,也表示出每個結點的孩子結點
-
孩子兄弟表示法
- 表示出第一個結點的第一個孩子結點,也表示出每個結點的下一個兄弟結點
樹的應用
- 電腦的目錄
樹之二叉樹
概念
- 一棵二叉樹是結點的一個有限集合,該集合或者為空,或者是由一個根節點加上兩棵分別稱為左子樹和右子樹的二叉樹組成
特點
- 每個結點最多有兩棵子樹
- 二叉樹的子樹有左右之分,其次序不能顛倒
滿二叉樹
- 所有分支結點都存在左子樹和右子樹,並且所有葉子結點都在同一層上
完全二叉樹
- 如果一棵具有N個結點的二叉樹的結構與滿二叉樹的前N個節點 的結構相同,稱為完全二叉樹
二叉樹的性質、
-
若規定根節點的層次為1,則一棵非空二叉樹第i層上最多有2^(i-1)(i>=1)個結點
-
若規定只有根節點的二叉樹的深度為1,則深度為K的二叉樹的最大結點數是2^k-1 (k>=0)
-
對任何一棵二叉樹,如果其葉結點個數為n0,度為2的非葉結點個數為n2,則有n0 = n2+1
-
具有n個結點的完全二叉樹,如果按照從上至下從左到右的順序對所有結點從0開始編號,則對於序號為i的結點有:
- 如果i>0,則序號為i的結點的雙親結點的序號為(i-1)/2,如果i==0,則序號為i的結點為根節點,無雙親結點
- 如果2i+1<n,則序號為i的雙親結點的左孩子序號是(i-1)/2,如果(2i+1)>=n,則序號為i結點無右孩子結點
- 如果2i+2<n,則序號為i結點的右孩子結點的序號為2i+2,如果2i+2>=n,則序號為i結點無右孩子結點
二叉樹的儲存結構
-
順序儲存
-
優點、
- 儲存完全二叉樹,簡單省空間
-
缺點
- 對一般二叉樹尤其單支樹,儲存空間利用不理想
-
-
鏈式儲存
- 子主題 1
-
模擬指標(靜態連結串列)
二叉樹的基本操作
-
二叉樹的建立
-
二叉樹的遍歷
-
前序
-
中序
-
後序
-
層序
-
初始化一個佇列
-
把根節點的指標入佇列
-
當佇列非空時迴圈執行
- 出佇列取一個節點
- 若該結點的左子樹非空,將該節點的左子樹指標入佇列
- 若該節點的右子樹非空將該節點的右子樹入佇列
-
結束
-
-
線索化二叉樹
線索化概念
- 按照二叉樹的遍歷將二叉樹導成一個線性序列
普通二叉樹可能存在的問題
- 遞迴遍歷有可能導致棧溢位
- 非遞迴版本可能會降低程式的效率
- 想要找到某種遍歷形式下某個節點的前驅還是後繼比較難
- 樹中有大量的空指標域造成浪費,
線索化過程
- 當某結點的左指為空時,令該指標指向按照某種方式遍歷二叉樹時得到該結點的前驅節點
- 當某結點的右指標為空時,令該指標指向按照某種遍歷方式遍歷二叉樹時得到該結點的後繼結點
線索標誌位
-
作用區分是孩子結點還是前驅或者後繼
-
leftThread
-
0
- leftChild
-
1
- leftThread
-
-
rightThread
-
0
- rightChild
-
1
- rightThread
-
線索
- 結點中指向前驅或者後繼結點的指標
線索二叉樹
- 二叉樹的結點加上線索的二叉樹
對二叉樹按照某種方式(前序、中序、後序)遍歷使其稱為線索二叉樹的過程稱為按照什麼方法對二叉樹進行線索化
堆
堆的概念
- 把所有的元素按照完全二叉樹的方式儲存在一個一維陣列中並滿足Ki<=K2i+1且Ki<=K2i+2(Ki>=K2i+1且Ki>=K2i+2),這個堆稱為最小堆(最大堆)
堆的分類
-
小堆
- 任一節點的關鍵碼均小於它左右孩子的關鍵碼,位於堆頂結點的關鍵碼最小
-
大堆
- 任一結點的關鍵碼均大於它左右孩子的關鍵碼,位於堆頂結點的關鍵碼最大
堆的性質
- 如果i=0,結點i是根結點,沒有雙親結點,否則結點i的雙親結點為(i-1)/2
- 如果2i+1>n-1,則結點i無左孩子,否則結點i的左孩子為節點2i+1
- 如果2i+1>n-1,則結點i無左孩子,否則結點i的左孩子為節點2i+2
堆的建立
- 從上向下調整
堆的插入
堆的刪除
堆的應用
- 優先順序佇列
Huffman樹
概念
- 路徑
- 路徑長度
- 把帶權路徑長度最小的樹叫做Huffman樹
構造huffman樹
-
構造n棵只有根結點的二叉樹森林,每棵二叉樹都只有一個帶有權值的根結點
-
重複以下步驟,直到F中只剩下一棵樹
- 在二叉樹森林中選最小的兩個,作為左右子樹構建一棵新的二叉樹,新二叉樹的根結點的權值為左右子樹根結點的權值之和
- 在原來二叉樹森林裡刪除這兩棵二叉樹
- 把新的二叉樹加入二叉樹森林
huffman編碼
-
編碼
- 在資料通訊中經常把傳輸的文字轉換成二進位制字元0和1組成的二進位制串,這叫做編碼
- 等長編碼
- 不等長編碼
檔案壓縮
二叉搜尋樹
性質
- 如果左子樹不為空,則左子樹上所有節點的值都小於根結點的值
- 它的右子樹不為空,則右子樹上所有節點的值都大於根結點的值
- 它的左右子樹也分別為二叉搜尋樹
操作
-
搜尋
-
若根結點不為空
- 根結點key==要查詢的key,返回true
- 根結點key>查詢key,在其左子樹查詢
- 根結點key<查詢key,在其右子樹查詢
- 否則返回false
-
-
插入
- 首先檢測這個節點是不是已經存在,要是存在不插入
- 否則將元素插入到找到的位置
-
刪除
-
首先判斷是否在樹中,沒有直接返回
-
有的情況
-
要刪除的節點沒有孩子節點
- 直接刪除該結點
-
要刪除的節點只有左孩子
- 刪除該結點並使被刪除結點的雙親結點指向被刪除結點的左孩子結點
-
要刪除的節點只有右孩子
- 刪除該結點並使被刪除結點的雙親結點指向被刪除結點的右孩子結點
-
要刪除的節點有左、右孩子結點
- 在它的右子樹中尋找中序下的第一個結點(關鍵碼最小),用它的值填補到被刪除節點中,再來處理該結點的刪除問題
-
-
-
二叉搜尋樹效能分析
- 最壞情況下,平均查詢長度為O(n)一般情況下平均長度為O(lgn)
AVL樹
AVL樹性質
- 它的左右子樹都是AVL樹
- 左子樹和右子樹高度之差(簡稱平衡因子)的絕對值不超過1(-1、0、1)
- 如果一棵樹是高度平衡的,它就是AVL樹。如果它有n個節點,其高度可保持在0(lgn),平均搜尋複雜度O(lgn)
平衡化旋轉
- 左單旋
- 右單旋
- 左右雙旋
- 右左雙旋
AVL樹的插入
- 如果是空樹,插入後即為根結點,插入後直接返回true
- 如果樹不空,尋找插入位置,若在查詢過程中找到key,則插入失敗直接返回false
- 插入節點
- 更新平衡因子,對樹進行調整
AVL樹的刪除
-
被刪除結點只有左孩子
- parent的平衡因子為1或者-1,parent高度不變,則從parent到根所有結點高度均不變,不用調整
-
被刪除結點只有右孩子
- parent的平衡因子變成0,雖然以parent為根的子樹平衡,其高度減1,但需要檢查parent的雙親結點的平衡性
-
被刪除結點左右孩子都有
-
變為刪除中序遍歷下的第一個結點q
- 結點parent的平衡因子為2或者-2,則較矮子數縮短,parent發生不平衡,需要進行平衡化旋轉
-
-
parent較高子樹的根為q
- 如果q的平衡因子為0,執行單迴圈恢復parent
- 如果q的平衡因子與parent平衡因子(正負)號相同,則執行一個單迴圈恢復parent
- 如果q的平衡因子與parent平衡因子(正負)號相反,則執行一個雙旋轉恢復parent
紅黑樹
概念
- 紅黑樹是一棵二叉搜尋樹,它在每個節點上增加了一個儲存位來表示結點的顏色,保證最長路徑不超過最短路徑的兩倍,近似平衡
性質
- 每個結點不是紅色就是黑色
- 樹的根結點是黑色
- 如果一個結點是紅色的,則它的兩個孩子結點是黑色的(沒有連續的兩個紅色結點)
- 對於每個節點,從該結點到其所有後代葉節點的簡單路徑上,均包含相同數目的黑色結點(每條路徑上黑色結點的數量相等)
- 每個葉子節點都是黑色的(此處的葉子結點指的是空節點)
插入實現
- 若樹為空,插入後需將新節點改成黑色
- 插入結點的父節點為黑色,不違反任何性質,直接插入
- 情況三
- 情況四
- 情況五
刪除
運用
- C++STL庫--map/set multimap multiset
- Java庫
- linux 核心
- 其他一些庫
紅黑樹和AVL樹的比較
B樹
平衡的多叉樹
性質
- 根結點至少有兩個孩子
- 每個非根結點至少有M/2(上取整)個孩子,至多有M個孩子
- 每個非根結點至少有M/2-1(上取整)個關鍵字,並且以升序排列
- key[i]和key[i+1]之間的孩子結點的值介於key[i]、key[i+1]之間
- 所有的葉子結點都在同一層
B+樹
-
性質
- 其定義基本與B樹相同
- 非葉子節點的子樹指標與關鍵字個數相同
- 非葉子結點的子樹指標P[i],指向關鍵字值屬於[k[i],k[i+1])的子樹
- 為所有葉子節點增加一個鏈指標
- 所有關鍵字都在葉子節點出現
-
搜尋
- 和B樹基本相同
-
特性
- 所有關鍵字都出現在葉子節點的連結串列中(稠密索引),且連結串列中的關鍵字恰好是有序的
- 不可能在葉子結點命中
- 非葉子節點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是儲存(關鍵字)資料的資料層
- 更適合檔案索引系統
B*樹
- 在B+樹的非根和非葉子結點之間再增加指向兄弟的指標
- 子主題 2
雜湊
搜尋(檢索)
-
在資料元素集合中查詢是否存在關鍵字等於某個給定關鍵字資料元素的過程
-
結果
- 成功
- 失敗
-
搜尋結構
- 用於搜尋的資料集合
-
搜尋的環境
-
靜態環境
- 在執行插入和刪除等操作的前後搜尋結構不會發生改變
-
動態環境
- 為保持較高的搜尋效率,搜尋結構在執行插入和刪除等操作的前後將自動調整,結構可能會發生改變
-
查詢
-
靜態查詢
-
順序表
- 從前往後依次遍歷O(n)
-
有序順序表
- 二分查詢O(log(n))
-
索引順序表
-
-
動態查詢
-
二叉樹結構
- 二叉排序樹
- 平衡二叉樹
-
樹結構
- B樹
- B+樹
-
-
雜湊查詢
-
每個元素的關鍵碼和結構中一個唯一的結儲存位置相對應
-
雜湊方法
- 插入和查詢資料利用雜湊函式求出儲存位置再存放或者查詢
-
-
雜湊衝突
- 對於兩個資料Ki和Kj(i!=j),Ki!=Kj,但是有Hash(Ki)==Hash(Kj)
-
雜湊函式
- 雜湊函式的定義域必須包括需要儲存的全部關鍵碼,而如果雜湊表允許有m個地址時,其值域必須在0-m-1之間
- 雜湊函式計算出來的地址能均勻的分佈在整個空間中
- 雜湊函式應該比較簡單
-
常見雜湊函式
-
直接定址法
-
取關鍵字的某個線性函式為雜湊地址
- 優點:簡單均勻
- 缺點:需要事先直到關鍵字的分佈情況
-
使用場景:適合查詢比較小且連續的情況
-
-
除留餘數法
- 設雜湊中允許的地址數為m,取一個不大於m,但最接近或者等於m的質數p作為除數,按照雜湊函式:Hash(key)=key%p,p<=m;將關鍵碼轉換成雜湊地址
-
平方取中法
- 假設關鍵字是1234,平方就是1522756,再抽取中間的三位數227作為雜湊地址
-
摺疊法
- 將關鍵字從左到右分成位數相等的幾部分,然後將這幾部分疊加求和,並按雜湊表長,取後幾位作為雜湊地址
-
隨機數法
- 選擇一個隨機函式,取關鍵字的隨機函式值為它的雜湊地址
-
數學分析法
- 設有n個d位數,每一位肯能有r種不同的符號,這r種不同的符號在各位上出現的頻率不一定相同,可能在某些位上分佈比較均勻,可將分佈均勻的幾位根據開雜湊的方式作為雜湊地址
-
雜湊衝突處理方法
-
閉雜湊法
-
一旦發生衝突,就去尋找下一個空的雜湊表地址,只要雜湊表足夠大,空的雜湊地址總能知道
-
線性探查
- 插入時發現該位置的資料和要插入資料相等,不插入
- 產生衝突,依次檢視其後的下一個桶,如果有空位置插入資料
-
二次探查
- 使用二次探查法,在表中尋找下一個空位置的公式是H(i)=(H0+i^2)%m,H(i)=(H0-i^2)%m
- 當表的長度為質數且轉載因子不超過0.5時,新的表項一定能插入
-
雙雜湊法
- 需要兩個雜湊函式,當一個發生衝突時,利用下一個雜湊函式計算偏移量
-
-
載荷因子
-
a=填入表中的元素個數/雜湊表的長度
- 控制在0.7-0.8以下,超過0.8,查表時CPU快取指數上升
-
-
-
開雜湊法
- 首先對關鍵碼集合用雜湊函式計算雜湊地址,具有相同地址的關鍵碼歸於同一子集合,每個子集合稱為一個桶,各個桶中的元素通過一個單鏈錶連結起來,各連結串列的頭結點組成一個向量,向量的元素個數與可能的桶數相同
布隆過濾器
- 當一個元素被加入集合時,通過k個雜湊函式將這個元素對映成一個位陣列中的k個點,將它們置為1,檢索時只要看是不是都是1,就可以,只要有一個零就不是,全是1,可能是
排序
概念
-
就是將一組雜亂無章的資料按照一定的規律(升序或降序)組織起來
-
資料表
- 待排序資料元素的有限集合
-
排序碼
- 通常資料元素有多個屬性域,其中有一個資料域可用來區分元素,作為排序依據,該域即為排序碼
- 如果在資料表中各個元素的排序碼互不相同,這種排序碼稱為主排序碼
排序演算法的穩定性
- 兩個元素R[i]R[j],它們排序碼K[i]==K[j],且在排序之前,元素R[i]在R[j]之前,元素在R[i]和R[j]的順序不變
常見排序演算法
-
插入排序
-
直接插入排序
- 插入到已排序序列中,先找位置,然後將位置之後得元素後移
- 穩定
-
希爾排序
- 縮小增量排序
-
-
選擇排序
-
選擇排序
-
每次把最小的元素換在最前面
-
錦標賽排序
- 一直兩兩比較找出獲勝者,將這個不再比較,其他繼續兩兩比較,取得獲勝者,一直迴圈
-
不穩定
-
-
堆排序
- 升序建立大堆,否則建立小堆
- 不穩定
-
-
交換排序
-
氣泡排序
- 穩定
- 依次比較相鄰兩個元素,不滿足條件交換
-
快速排序
- 取一個基準值將比它小得放在左側,大的放在右側。左右兩部分遞迴取基準值繼續分
-
-
歸併排序
-
歸併排序
- 將待排序的序列分成兩個等長的子序列,然後將它們合併成一個序列
-
-
非比較排序
- 計數排序
- 基數排序
圖
由頂點集合及頂點間關係組成的一種資料結構
頂點和邊
-
頂點
- 圖中結點稱為結點
-
邊
- 頂點與頂點之間有一條邊
圖的分類
-
有向圖
- 在有向圖中,頂點對<x,y>是有序的<x,y><y,x>是不同的兩條邊
-
無向圖
- (x,y)(y,x)是一條邊
完全圖
- 在有n個頂點的無向圖中,若有n*(n-1)/2條邊,即任意兩個兩個頂點之間有且只有一條邊
- 在n個頂點的有向圖中,若有n*(n-1)條邊,即任意兩個頂點之間有且僅有方向相反的邊
鄰接結點
- 在無向圖中G中,若(u,v)是E(G)中的一條邊,則稱u和v互為鄰接頂點,並稱(u,v)依附於頂點u和v
- 在有向圖G中,若<u,v>是E(G)中的一條邊,則稱頂點u鄰接到v,頂點v鄰接自頂點u,並稱邊<u,v>與頂點u和v相關聯
頂點的度
-
與它相關聯的邊的條數
- 在有向圖中,頂點的度等於該頂點的入度與出度之和,其中頂點v的入度是以v為終點的有向邊的條數,記做indev(v)頂點v的出度是以v為起始點的有向邊的條數記做outdev(v)
- 無向圖的度等於入度和出度 dev(v) = indev(v) = outdev(v)
路徑
- 在圖G=(V,E)中,若從頂點vi出發有一組邊使其可到達頂點vj,則稱頂點vi到vj的頂點序列為從頂點vi到頂點vj的路徑
權
- 邊附帶的資料資訊
路徑長度
- 對於不帶權的圖,一條邊的路徑長度是指該路徑上的邊的條數
- 對於帶權的圖,一條路徑的長度是指一條路徑的路徑長度是指該路徑上各個邊權值的總和
簡單路徑與迴路
- 如路徑上各個頂點 均不重複,則稱這樣的路徑是簡單路徑,若路徑上第一個頂點v1和最後一個頂點vm重合,則稱這樣的路徑為迴路或環
子圖
- 設圖G={V,E}和圖G1={V1.E1},若V1屬於V且E1屬於E,則稱G1是G的子圖
連通圖
- 無向圖中,兩個頂點之間有路徑就是連通的,任一對頂點之間都是連通的則稱這個圖是連通圖
強連通圖
- 在有向圖中,任意一對頂點vi和vj之間都存在一條從vi到vj的路徑,也存在一條從vj到vi的一條路徑
生成樹
- 一個連通圖的最小連通子圖稱作該圖的生成樹,有n個頂點的連通圖的生成樹有n個頂點和n-1條邊
圖的儲存結構
-
鄰接矩陣
-
鄰接表
- 無向圖
- 有向圖
圖的遍歷
- 深度優先
- 廣度優先
連通分量
- 當無向圖為非連通圖時,從圖中某一頂點出發,利用深度優先搜尋或廣度優先搜尋演算法無法遍歷圖的所有頂點,而只能訪問到該節點所在的最大連通子圖的所有頂點,這些頂點構成一個連通分量
最小生成樹
-
準則
- 只能使用圖中的邊來構造最小生成樹
- 只能使用恰好n-1條邊來連線圖中的n個頂點
- 選用的n-1條邊不能構成迴路
貪心演算法
- 在問題求解時,總是做出當前看起來最好的選擇,也就是區域性最優解
Kruskal演算法
- 每次找一條具有最短權值且不再同一連通分量上的邊加入生成樹
prime演算法
- 挨著找
單元最短路徑
- 從在帶權圖的某一頂點出發,找出一條通往另一個頂點的最短路徑,最短也即是沿路徑各邊的權值和最小