心智圖資源庫 01資料結構
這是一個關於01資料結構的心智圖,包含邏輯結構、卡特蘭數、物理結構、 數據運算等。
編輯於2023-12-08 15:46:58Einhundert Jahre Einsamkeit ist das Meisterwerk von Gabriel Garcia Marquez. Die Lektüre dieses Buches beginnt mit der Klärung der Beziehungen zwischen den Figuren. Im Mittelpunkt steht die Familie Buendía, deren Wohlstand und Niedergang, interne Beziehungen und politische Kämpfe, Selbstvermischung und Wiedergeburt im Laufe von hundert Jahren erzählt werden.
Einhundert Jahre Einsamkeit ist das Meisterwerk von Gabriel Garcia Marquez. Die Lektüre dieses Buches beginnt mit der Klärung der Beziehungen zwischen den Figuren. Im Mittelpunkt steht die Familie Buendía, deren Wohlstand und Niedergang, interne Beziehungen und politische Kämpfe, Selbstvermischung und Wiedergeburt im Laufe von hundert Jahren erzählt werden.
Projektmanagement ist der Prozess der Anwendung von Fachwissen, Fähigkeiten, Werkzeugen und Methoden auf die Projektaktivitäten, so dass das Projekt die festgelegten Anforderungen und Erwartungen im Rahmen der begrenzten Ressourcen erreichen oder übertreffen kann. Dieses Diagramm bietet einen umfassenden Überblick über die 8 Komponenten des Projektmanagementprozesses und kann als generische Vorlage verwendet werden.
Einhundert Jahre Einsamkeit ist das Meisterwerk von Gabriel Garcia Marquez. Die Lektüre dieses Buches beginnt mit der Klärung der Beziehungen zwischen den Figuren. Im Mittelpunkt steht die Familie Buendía, deren Wohlstand und Niedergang, interne Beziehungen und politische Kämpfe, Selbstvermischung und Wiedergeburt im Laufe von hundert Jahren erzählt werden.
Einhundert Jahre Einsamkeit ist das Meisterwerk von Gabriel Garcia Marquez. Die Lektüre dieses Buches beginnt mit der Klärung der Beziehungen zwischen den Figuren. Im Mittelpunkt steht die Familie Buendía, deren Wohlstand und Niedergang, interne Beziehungen und politische Kämpfe, Selbstvermischung und Wiedergeburt im Laufe von hundert Jahren erzählt werden.
Projektmanagement ist der Prozess der Anwendung von Fachwissen, Fähigkeiten, Werkzeugen und Methoden auf die Projektaktivitäten, so dass das Projekt die festgelegten Anforderungen und Erwartungen im Rahmen der begrenzten Ressourcen erreichen oder übertreffen kann. Dieses Diagramm bietet einen umfassenden Überblick über die 8 Komponenten des Projektmanagementprozesses und kann als generische Vorlage verwendet werden.
資料結構 (存在關係的資料元素的集合)
邏輯結構
線性結構
一般線性表
順序表示
順序表
以位址連續的儲存單元儲存表中元素
特點
邏輯順序與物理順序一致
插入與刪除的代價極高
隨機存取
插入
最好情況:表尾插入O(n) 最壞情況:表頭插入,所有元素都要後移O(n)
for(int j=L. length; j>=i; j--)//將第1個元素及之後的元素後移 L. data[j]=L. data[j-1]; L. data[i-1]=e;//在位置i放入e L. length ;//線性表長度加1
刪除
最好情況,O(1) 最壞情況,O(n)
e=L. data[i-1];//將被刪除的元素賦值給e for(int j=i; j<L. length;j );//將第i個位置後的元素前移 L. data[j-1]=L. data[j]; L. length--;//線性表長度減1
按值查找
最好情況,O(1) 最壞情況,O(n)
for(i=0; i<L. length;i ) if(L. data[i]==e) return i 1;//因為表下標從0開始存儲,下標為i的元素值等於e,傳回其位元序i 1 return 0;//退出循環,說明查找失敗
鍊式表示
邏輯上相鄰,不要求物理上相鄰,透過鏈建立邏輯關係
優點
插入和刪除不需要移動元素,修改指標即可
缺點
無法隨機存取
主要分類
單鍊錶
儲存單元存放元素資訊以及一個指向後續的指針
定義法
type struct LNoed{ ElemType data; Struct LNoed *next; }LNode,*Llinklist;
插入
頭插法
S->data=x; S->next=L->next; //L為頭指針 L->next=S;
L為頭部指針
尾插法
S->data=x; r->next=S;. //r為表尾指針 r=S; //移動r到新的尾結點上,為下一次尾插做準備
刪除
p-q-x 刪除q
q=p->next; p->next=q->next; free(q);
按值查找
lnode *p=l->next;//指標p指向頭結點的下一個結點 while(p!=null&&p!=待查的值) p=p->next; return p;
雙鍊錶
與單鍊錶相比多了一個指向前一結點的pre指針
定義法
type struct LNoed{ ElemType data; Struct LNoed *pre,*next; }LNode,*Llinklist;
插入
① s->next=p->next; ② p->next->pre=s; ③ s->pre=p; ④ p->next=s;
①②必須在④之前
刪除
p→next=q→next; q→next→pre=p; free(q);
循環鍊錶
循環單鍊錶
循環雙鍊錶
靜態鍊錶
這裡的指標是指下一個元素的陣列下標
廣義表
head
取出位於表頭部的元素,或子表
tail
取出表尾的元素
受限的線性表
堆疊
特點
後進先出
只允許在堆疊頂部插入或刪除
不可以隨便讀取中間某個元素
分類
順序堆疊
基本操作
判棧空 bool StackEmpty(SqStack S){ if(S.top==-1) //棧空 return true; else //不空 return false; }
進堆疊 bool Push(SqStack &S,ElemType x){ if(S.top==MaxSize-1) //堆疊滿,報錯 return false; S. data[ S. top]=x; //指標先加1,再入棧 return true; }
出棧 bool Pop(SqStack &S,ElemType &x){ if(S.top==-1) //棧空,報錯 return false; x=S. data[S. top--]; //先出棧,指標再減1 return true; }
讀棧頂元素 bool GetTop(SqStack S,ElemType &x) { if(S.top==-1)//棧空,報錯 return false; x=S. data[S. top]; //x記錄棧頂元素 return true; }
共享堆疊
兩個順序棧共享一個堆疊空間,達到節約儲存空間的目的
棧A的指標top0指向棧頂,棧B的指標top1指向棧頂 元素入棧A:top0先加一再入棧 元素入棧B:top1先減一再入棧 top1-top0=1時棧滿 top0==-1時棧A空 top1==Maxsize時棧B空
鏈堆疊
沒有頭結點 Lhead指向棧頂元素 鏈棧便於插入與刪除
堆疊的應用
括號匹配
表達式求值
遞迴調用
佇列
特點
先進先出
不允許隨便讀取中間某個元素
分類
隊列的順序存儲
順序隊列
進隊
rear 1,再賦值
出隊
先出隊,再front 1
循環隊列
隊空
front==rear
隊滿
(rear 1)%Maxsize==front
目前元素個數
(rear-front maxsize)%maxsize
入隊
入隊 bool EnQueue(SqQueue &Q, ElemType x){ if((Q. rear 1)MaxSize==Q. front) return false; //隊滿則報錯 Q. data[Q. rear]=x; //沒空則插在尾部 Q. rear=(Q. rear 1)MaxSize; //隊尾指針加1取模 return true; }
出隊
出隊 bool DeQueue(SqQueue &Q, ElemType &x){ if(Q. rear==Q. front) return false; //隊空則報錯 x=Q. data[Q. front]; Q. front=(Q. front 1)%MaxSize; //隊頭指針加1取模 return true; }
隊列的鍊式存儲
本質是帶有隊頭指針和隊尾指針的單鍊錶
尾進頭出
判隊空 bool IsEmpty(LinkQueue Q){ if(Q.front==Q. rear) return true; else return false; }
入隊 void EnQueue(LinkQueue &Q, ElemType x){ LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode)); s->data=x; s->next=NULL; //建立新結點,插入到鏈尾 Q. rear->next=s; Q. rear=s; }
出隊 bool DeQueue(LinkQueue &Q, ElemType &x){ if(Q.front==Q. rear) return false;//空隊 LinkNode *p=Q. front->next; x=p->data; Q.front->next=p->next; if(Q.rear==p) Q. rear=Q. front; //若原隊列中只有一個結點,刪除後變空 free(p); return true; }
雙端佇列
輸出受限
只允許一端輸出
輸入受限
只允許一端輸入
隊列的應用
層次遍歷
緩衝區
字串
模式匹配
簡單匹配
kmp演算法
next值求法
① 前兩個next值為0,1
② 後續next值透過前綴,後綴匹配,取最長成功匹配的串長 1
kmp演算法的最佳化
nextval值求法
根據next值向前找編號相同的,其next值即為待求的nextval值,若已有nextval值則更新
線性表的推廣
陣列
儲存方式
行優先
列優先
特殊矩陣的壓縮存儲
上三角矩陣 下三角矩陣
對稱矩陣
三對角矩陣
行優先
存放在一維數組 k=2i j-3
稀疏矩陣
三元組儲存法
(行,列,data)
十字鍊錶儲存法
非線性結構
集合
元素同屬於一個集合
樹結構
樹
樹的性質
是一種遞歸的資料結構
是一種分層結構
① 樹的結點數 = 所有結點的度數總和 1
② 度為m的樹在第i層最多有 mⁱ⁻¹ 個結點
③ 高為h的m叉樹最多有(mʰ -1) / (m-1)個結點
④ 有n個結點的x叉樹的最小高度 ┍ logₓ (n(m-1) 1)┒
二元樹
性質
n₀=n₂ 1
n=n₀ n₁ n₂
n=1 n₁ 2n₂
高為h的二元樹最多有2ʰ-1個結點
分類
空二元樹
滿叉樹
完全二元樹
結點與編號一一對應
度為1的結點只能有一個或沒有
此結點決定了完全二元樹結點總數的奇偶性
具有n個結點的完全二元樹的樹高
┍ log₂(n 1)┒ 向上取整
┕ log₂n┙ 1 向下取整
二元排序樹
左小右大
平衡二元樹
左右子樹高度差不超過 1
二元樹的儲存結構
順序存儲
完全二元樹
滿叉樹
鍊式儲存
有n個結點的二元鍊錶 含有 n 1 個空鏈域
線索二元樹
線索二元樹是個物理結構
空鏈域用來存放指向前序或後續的線索
分類
中序線索二元樹
先序線索二元樹
後序線索二元樹
二元樹的遍歷
先序遍歷
根左右
中序遍歷
左根右
後序遍歷
左右根
樹的儲存結構
雙親表示法
孩子表示法
孩子兄弟表示法
二元樹表示法
易於找到結點的孩子
找雙親比較麻煩
type struct csnode{ elemtype data; struct csnode *liftchild,*rightbro;//定義孩子和右兄弟指針 }csnode,*cstree;
樹,森林,二元樹的轉換
左孩子右兄弟
根的左邊孩子結點作為新樹中根的孩子結點, 根的右兄弟變成新樹中根的孩子
樹與二元樹的應用
哈夫曼樹/哈樹
帶權路徑長度WPL最小的二元樹
特點
① 左小右大型 或 左大右小型
② 每次選取兩個權值最小的合併,其和作為新根的權值
③ 哈樹的形態不唯一,但是WPL值永遠是最小的
④ 哈樹中不存在度為1點結點
因為哈樹是兩兩合併出來的
哈夫曼編碼
變動長
二進位位元組長度可變
固定長
二進位位元組長度固定
並查集
是一種集合(邏輯結構)
順序儲存的雙親表示法的樹
並
查
並查集的應用
判斷圖的連通性
遍歷無向圖的所有邊, 每遍歷到一條邊,就將其兩頂點並到一個集合, 以此所有的連通的頂點都會在一個集合,而不連通的不在此集合裡
圖結構
圖的定義
頂點集V與邊集E構成
圖的分類
無向圖
無向圖的全部頂點的度的和=邊數×2
有向圖
弧尾 → 弧頭
有向圖的全部頂點的入度總和=出度總和
簡單圖
不存在重複的邊 不存在頂點到自身的邊
完全圖
無向完全圖
n(n-1)/2 條邊
有向完全圖
兩頂點間存在著方向相反的兩條弧
子圖
連通
無向圖中
任兩頂點都是連通的
極大連通子圖稱為連通分量
強連通
有向圖中
任兩點是強連通的
簡單路徑與簡單迴路
頂點不重複出現→簡單路徑
除了第一個與最後一點,其他的點不重複出現→簡單迴路
生成樹
包含全頂點的極小連通子圖
既要圖連通又要邊數最少
注意
非連通情況下邊數最多:
由n-個頂點構成一個完全圖,此時再加入一個點即為非連通圖
有向圖強連通情況下邊數最少:
至少n邊,構成環路
其他圖
稀疏圖
|E| = |V|*log|V|時
稠密圖
圖的存儲
鄰接矩陣法
儲存
無向圖
有向圖
空間複雜度O(n²) → n為頂點數
更適合存稠密圖
鄰接表法
儲存
無向圖
空間複雜度(V 2E)
因為邊會出現2次
有向圖
空間複雜度(V E)
十字鍊錶法
有向圖的鍊式存儲
多重表法
無向圖的鍊式存儲
圖的遍歷
廣度優先
類似層次遍歷
深度優先
對一個點一直深挖
對於無向圖,呼叫DFS或BFS的次數 = 此圖的連通分量個數
圖的應用
① 最小生成樹
① 包含所有頂點
② 包含盡可能少的邊
③ 權值和唯一
④ 邊數 = 頂點數-1
⑤ 樹形態不唯一
② Prim演算法
演算法過程
① 選擇性一點
② 尋找權值最小
③ 依序相連,含所有點,盡可能少的邊
適用於求解邊稠密的圖的最小生成樹
時間複雜度
O(V²)
③ 克魯斯卡爾演算法
在整個圖中找最小的邊,優先選取,並要求包含所有頂點
用到並查集
適用於邊少頂點多的圖
時間複雜度
Elog₂E
④ 最短路徑問題
① Dijkstra算法
演算法過程
每輪記錄
① 每一步的路徑以及路徑的總權值
② 最短路徑集合
解決單源路徑問題
無權圖,有權圖都可
時間複雜度
鄰接矩陣
O(V²)
鄰接表
O(V²)
② Floyd演算法
帶權圖
演算法過程
不斷更新矩陣
如:A,A²,A³…
A的角標代表中繼結點
時間複雜度
O(V³)
⑤ 關鍵路徑問題
手算過程
① 求事件Vk的最早發生時間
從前向後直接算
② 求事件Vl的最遲發生時間
從後向前算,減去最小的權值
③ 求活動的最早發生時間e
弧尾的事件的最早發生時間
④ 求活動的最晚發生時間l
弧頭的事件的最遲發生時間 - 此活動的權值
⑤ 以活動最遲l減去活動最早e,為0的活動即為關鍵活動,其所連頂點即為所求
卡特蘭數
適用於:
堆疊
n個元素入棧,求出棧序列個數
二元樹
n個結點能構成多少種不同形狀的二元樹
括號匹配
n對括號,有多少種括號匹配序列
使用卡特蘭數的前提
棧和二元樹不能有其他限制
例如要求:出棧第一個數為1,此時不能用卡特蘭數計算
兩大方法
尋找
順序查找
適用於
順序表
鍊錶
折半查找
適用於
有序的順序表
比較方法
一邊倒
要求線性表能隨機存儲 因此,僅適用於順序儲存結構
時間複雜度 O(log₂n)
分塊查找
塊內無序,塊間有序
長為n的表格分為b塊,每塊有s個記錄 s=√n,平均查找長度取最小值√n 1
平均查找長ASL = (S² 2S n)/2S
順序
樹形查找
二元排序樹
左小右大
構造
插入
刪除
平衡二元樹
左右子樹高度差不超過1 或為空樹
調整
LL型
右旋一次
RR型
左旋一次
LR型
先左旋再右旋
RL型
先右旋再左旋
操作
插入
刪除
尋找
紅黑樹
定義
① 左根右
② 根葉黑
③ 不紅紅
④ 黑路同
先調整再著色
找長
ASL成功 = (Σ笫幾層×結點數)/總數
ASL失敗 = (Σ第幾層×結點空鏈域數)/總數
B樹&B 樹
B樹
m叉B樹
支援隨機查找
特點
① 每結點至多有m個子樹, 至多m-1個關鍵字
③ 除了根結點外,所有非葉結點至少有┍ m/2 ┒棵子樹 至少有┍ m/2 ┒一1 個關鍵字
④ 葉子結點在同一層,即空鏈域層
② 若根結點不是葉子,則至少有2個子樹
樹高
尋找
結點內來用順序查找,折半查找
插入
刪除
① 直接刪
② 兄弟夠借
① 左兄弟夠借
用左兄弟最右的結點代替自己,自己補到缺位上
② 右兄弟夠借
用右兄弟最左的結點代替自己,自己補到缺位上
③ 兄弟不夠借
合併
B 樹
m叉B 樹 特點
① 每個關鍵字對應一棵子樹
② ┍ m/2 ┒≤ n ≤ m
③ 葉結點包含了全部關鍵字且包含訊息
④ 非葉僅起索引作用
⑤ 支援順序查找,隨機查找
散列表
尋找效率取決於比較次數
散列函數
①直接定址法
②除留餘數法
H(key)= key%P
P:不大於表長的最大質數
③數字分析法
④平方取中法
散列查找
裝填因子α =記錄數/表長
處理衝突的方法
開放尋址法
①線性探測
後移補位
手算線性探測
ASL失敗= 分子/分母
分子:將表序號後移,直到遇到空位,記錄後移的次數再 1 將P個元素內的所有記錄的(後移的次數再 1)以及空位數(若空位在P內)
分母:P
②平方探測
解決衝突
( 餘數 d¡ )%表長
d¡ = 0²,1²,-1²,2²,-2² ......
③雙散列
④偽隨機
拉鍊法
排序
大多數排序只適用於順序儲存的線性表
內部排序
插入排序
直接插入排序
適用於順序和鍊式儲存的線性表
選擇出一個作為哨兵
大元素放哨兵後面,小元素放哨兵前面
完成後選擇剛剛排好的那個元素作為新哨兵
時間複雜度
O(n²)
穩定
折半插入排序
適用於順序儲存的線性表
時間複雜度
O(n²)
希爾排序
適用於順序儲存的線性表
時間複雜度
O(n²)
不穩定
交換排序
冒泡排序
時間複雜度
O(n²)
穩定
快速排序
選取基準,①從後向前與基準比較,②由前向後與基準比較,①②交替進行
時間複雜度
最好 O(nlog₂n)
最壞 O(n²)
平均 O(nlog₂n)
不穩定
選擇排序
簡單選擇排序
時間複雜度 O(n²)
不穩定
堆排序
適用於關鍵字多的情況
堆可視為完全二元樹
建立過程
從最後一個非葉節點開始,判斷是否符合堆的要求
時間複雜度 O(nlog₂n)
不穩定
基數排序
時間效率與初始序列無關
最高位優先/最低優先
排序年月日
時間複雜度 O(d(n r))
穩定
歸併排序
時間複雜度 O(nlog₂n)
穩定
外部排序
外部排序總時間 = 內部排序時間 外存讀寫時間 內部歸併時間
對於r個初始歸併段,做x路歸併
樹高h - 1 = ┍ logₓr ┒= 歸併列數
敗者樹
可視為完全二元樹
每回合比較,勝者繼續向上,一直到根結點
k路歸併的敗者樹深度為:┍ log₂k ┒
置換選擇排序
演算法過程
①從待排序序列中選取一定數量元素,放入工作區
②在工作區中選擇最小數放入歸併段,且miniMax改為數量
③保證下次放入歸併段的數要比miniMax值大
④當工作區中沒有比miniMax更大的數時,則第一個歸併段生成
最佳歸併
數據運算
四則運算
加
減 -
乘 *
除 /
運算 (a為數據)
異或 ^ 相同為0,相異為1
邏輯與 && 同1為1,否則為0
邏輯或 || 全0才0,否則為1
先自增再賦值 a
先賦值再自增 a
先自減再賦值 --a
先賦值再自減 a--
取餘 %a
取反 !a
物理結構
索引存儲
不僅儲存元素,還要為其建立索引表,索引表包含多個索引項 修改資料的同時也要修改索引表
鍊式儲存
元素在邏輯上相鄰,但是在物理上不一定相鄰
順序存儲
邏輯上相鄰的元素在物理上儲存也是相鄰的
散列儲存 (哈希)
根據關鍵字直接計算儲存位址