1. 程式人生 > >資料結構個人總結和程式框架

資料結構個人總結和程式框架


線性表
順序逆序  單向連結串列 雙向連結串列  迴圈連結串列 靜態連結串列  
順序儲存方式
地址計算方法
c語言中陣列從0開始第一個下標
所以知道某一點地址 ai=a1+(i-1)*c

順序儲存結構需要的演算法思路兩個
插入演算法思路
1 插入位置不合理丟擲異常
2線性表長度大於陣列長度,丟擲異常或者動態增加容量
3從最後一個元素向前遍歷到第i個位置,分別將他們向後移動一個位置
4將要插入的元素填到i處
5表長加1


刪除演算法思路
1刪除位置不合理  丟擲異常
2取出刪除元素
3從刪除元素位置開始遍歷到最後一個元素位置,分別將他們都向前移動一個位置
4表長減一


鏈式儲存結構 就是N個結點鏈結成一個連結串列

結點是  資料元素+指標

連結串列第一個結點的儲存位置叫頭指標  規定最後一個結點指標為空(NULL或^)

有時候會在單鏈表第一個結點前附設一個結點,稱為頭結點。  
頭結點的資料域可以不儲存任何資訊。

單鏈表獲取第i個數據的演算法

1宣告結點p指向連結串列第一個結點,初始化i從1開始
2 j<i時  遍歷連結串列,讓p指標向後移動,不斷指向下一結點,j累計加1
3到連結串列末尾p為空,說明第i個元素不存在
4否則查詢成功,返回結點p的資料


單鏈表的插入  
實現 p p->next   讓s插入

首先讓s的下一個結點成為p的下一個結點(後繼結點)
 s->next=p->next; 
然後再讓p的下一個結點變為s
p->next=s

刪除結點同理
p p->next p->next->next
刪掉中間的
首先讓結點q等於p的後繼結點
q=p->next
這時候q的後繼結點仍然是p->next->next
此時讓p的指向變為q的下個指向
p->next=q->next
然後釋放q結點  釋放記憶體


陣列描述的連結串列為靜態連結串列


雙向連結串列的插入

p p->next 

1  s->prior=p  插入點前驅
2  s->next=p->next  後繼給插入點
3  p->next->prior=s   p的後繼的前驅是s
4  p->next=s   p的後繼是s 

前驅後繼-前驅後繼的順序


雙向連結串列的刪除

p->prior  p   p->next
 
1 p->prior->next=p->next p的前驅的後繼變為p的後繼
2 p->next->prior=p->prior  p的後繼的前驅變為p的前驅

 


棧和佇列

棧是隻能在表尾進行插入和刪除操作的線性表 後進先出 LIFO 


比如 123依次進棧  不能讓3先進  不可以是 321  只按順序進出
插入刪除分別是  push  pop 
也叫進棧push 出棧pop

棧的鏈式儲存結構 鏈棧


佇列是先進先出的線性表 
刪除只能在隊頭進行  插入只能隊尾進行

(Q.rear-Q.front+MAXSIZE)%MAXSIZE
這個是求佇列是否滿


鏈佇列  是佇列的鏈式儲存結構,線性表的單鏈表,但他只能隊尾進頭出


串  又名字串  零個或多個字元組成的有限序列


KMP演算法  避免重複遍歷的演算法


next陣列中  
 前後綴n個字元相等k的值就是n+1


nextval是他的改良版
這個要和next陣列做比較 
如果字串Srt(1)!=Str(j)兩位不相等
那麼
next(j)=nextval(j)
如果Srt(1)=Str(j)
那麼更改nextval(j)=nextval(next(j))


樹的定義  n個結點的有限集。n=0為空樹,任意一顆非空樹中,有且僅有一個特定的稱為根的結點,n>1時,其餘結點可分為m個互不相交的有限集T1,T2,……,Tm,其中每一個集合本身又是一顆樹並且稱為根的子樹。

結點擁有的子樹稱為結點的度,度為0的結點稱為葉結點或者終端結點,度不為0的結點稱為非終端結點或分支結點。
除根結點之外,分支結點也稱為內部結點。樹的度是樹內各結點的度的最大值。

二叉樹每個節點最多有兩棵子樹,左子樹和右子樹是有順序的,即使樹的某結點只有一棵
子樹,也要區分他叔左子樹還是右子樹。


任意一個二叉樹,終端結點數(葉子結點數)n0,度為2的結點數為n2,那麼n2+1=n0


三種遍歷中(前序,中序,後續),必須知道中序遍歷加任意遍歷才可以推倒另一遍歷


赫夫曼編碼,最基本的壓縮編碼


圖,由頂點的有窮非空集合和頂點之間邊的集合組成。


任意兩個頂點都存在方向互為相反的兩條弧,為有向完全圖。

圖中的元素為頂點。


圖的鄰接矩陣儲存方式使用兩個陣列來表示圖,一個一維陣列儲存圖中的頂點資訊,一個二維陣列(稱為鄰接矩陣)儲存圖中的邊或者弧的資訊。


深度優先遍歷   DFS
廣度優先遍歷   BFS

找出最小生成樹  兩種演算法 
 
普里姆演算法prim
通過連結的最短頂點找最小權重


克魯斯卡Kruscal演算法
通過將各個邊和權重排序,再連線非環路的各個邊。


迪傑斯特拉演算法 
解決最短路徑的問題


弗洛瑞德演算法floyd

線性索引,將索引項集合組織為線性結構,也成為索引表
線性索引分為 稠密索引 分塊索引 
倒排索引 由屬性值確定記錄的位置

二叉排序樹也叫二叉查詢樹

平衡二叉樹是一種二叉排序樹 AVL樹

左子樹深度減去右子樹深度的值稱為平衡因子BF

多路查詢樹  B樹


2-3樹
2-3-4樹

上面分別是 3  4 階的B樹

 


雜湊技術,通過某種函式記錄位置資訊 
儲存位置=f(關鍵字)

雜湊函式也叫作雜湊函式
這種連續儲存空間稱為散列表或者雜湊表

雜湊方法

直接定址法
數字分析法
平方取中法
摺疊法
除留餘數法
隨機數法

如果散列表衝突 那麼有開放地址法 衝突後取尋找下個空的雜湊地址。
開放地址發也成為線性探測法

再雜湊函式法
鏈地址法
公共溢位區法


排序


內排序分為 插入排序 交換排序 選擇排序 歸併排序


簡單演算法  
氣泡排序 
簡單選擇排序  
直接插入排序

改進演算法  
希爾排序
(直接插入排序的一種改進)

堆排序 
其中堆是具有以下性質的完全二叉樹:每個結點的值都大於或者等於其左右孩子結點的值,稱為大頂堆;
或者每個節點的值都小於或等於其左右孩子結點的值,稱為小頂堆。
用到了完全二叉樹  深度 [log2(n)+1]特性

歸併排序 
如果是兩兩歸併  就是2路歸併序列


快速排序  

基本思路: 通過一趟排序將待排記錄分割成獨立的兩部分,穩重一部分記錄的關鍵字均比另一部分的記錄的關鍵字小,則可以分別對這兩部分記錄繼續進行排序以達到整個序列有序的目的。


插入排序類  直接插入排序 希爾排序
選擇排序類  簡單選擇排序  堆排序
交換排序類  氣泡排序   快速排序
歸併排序類  歸併排序