1. 程式人生 > >數據結果和算法------下

數據結果和算法------下

數據結構和算法 讀書筆記

7.高級排序:

希爾排序:實現簡單 不快不慢 穩定

插入排序:復制的次數太多 極端情況下表現不好

n-增量排序 :逐漸減小增量 計算間隔的公式h=3*h+1 Knuth

0 1 2 3 4 5 6 7 8 9 10 11 12

第一小的肯定在第一組

第二小的肯定在第二組、第一組

h=4,8

h=4

outer=4

temp = array[4]

innner=4

0和4進行比較

0 和 4交換位置

outer =5

temp = array[5]

inner =5

4和0

5和1

6和2

7和3

8和4

9和5

算法不會重復比較嗎?

逐漸減小間隔,最後一定等於1 最後一趟排序是一次普通的插入排序


劃分:樞紐

保證比樞紐值小的在左邊、比樞紐值大的在右邊

極端:所有數據都比樞紐值小或者大,徒勞操作

劃分的效率:O(N)


快速排序:

樞紐的選擇:具體的數據項 任意數據項

實質:找到樞紐的最終目的 交換一次位置

理想:應該選擇數據項的中值 最壞的情況O(N2)

選擇合適的樞紐成為關鍵:全部數據計算no 隨機計算no 三數據項取中

處理小劃分:對於小劃分使用插入排序

消除遞歸:現在的系統可以更為有效的處理方法的調用


基數排序:不需要比較的排序 利用計算機高速位運算

第一趟子排序 第二趟排序 。。。。

基數排序的效率:




8.二叉樹:有序數組(查詢快,騰空間費時)、鏈表(插入快)

有序鏈表

常用的術語:路徑、根(根到任意節點的路徑有且只有一條)、父節點、子節點、葉節點、子樹、訪問(執行某種操作)、遍歷、層、關鍵字、

樹解決問題:邊(引用) 節點(對象)。多路樹 ---->特例、二叉樹

二叉樹:一個節點的左子節點的關鍵值小、右子節點大

一個類比:分級文件結構


二叉搜索樹工作:

非平衡樹:缺少左、右子節點,插入順序是升序或者降序時將出現非平衡樹

節點類概念,數據項抽象出來

Tree類:根節點

節點類:數據項、左子節點、右子節點

增刪改查

樹大查詢效率:log2N,查找節點的時間取決於節點所在的層數

樹的插入:

遍歷:前序、中序、後序 遞歸遍歷 前綴表達式、後綴表達式

查找最大值最小值:最左邊的節點最小值、最右邊的節點最大值

樹結構的本質規律:每棵樹最左邊節點為最小值,最右邊節點為最大值,只要滿足這個要求即可

刪除節點:1.刪除葉節點,從樹中移除即可、

2.刪除包含一個子節點的節點,改變父節點的引用指向子節點

3.刪除有兩個子節點的節點 平衡被打破了。 需要填補上。 太聰明了

二叉樹效率:大O表示法,log2N 一顆滿樹大部分節點都在底層

使用數組表示樹:位置 2*index+1 不允許刪除的操作

重復關鍵字的問題




壓縮、解壓原理:

哈夫曼編碼:原理減少表示最常用字符的位數量 每個代碼都不能是其他代碼的前綴

頻率表 出現次數最多的字符所占位數應該最少

創建哈夫曼樹解碼:

創建哈夫曼編碼




9.紅黑樹:遵守一定規則的插入,目的保持平衡

二叉樹的問題:有序插入表現不太好 存在不平衡樹 插入效率lon2N到N

平衡的補救:紅黑樹 特征:節點都有顏色

紅黑規則:每個節點不是紅色就是黑色

根總是黑色

如果節點是紅色的,則子節點必須黑色

從根到葉節點的每條路徑,必須包含相同數目的黑色節點,即黑色高度必須相同

重復關鍵字的平衡:

修正違規的情況:改變節點的顏色 執行旋轉操作

非平衡樹

總之達到的目的樹相對平衡,過程相當繁瑣

其他平衡樹:AVL樹左子樹和右子樹高度差不能超出1




10.2-3-4樹和外部存儲

每個節點最多有4個節點、3個數據項 所有葉節點總是在同一層

非葉節點存在的情況:子節點的個數比節點的數據項個數多一

空節點不會存在的

child1子樹的所有子節點的關鍵字小於key0並且大於key1

child2的子樹所有子節點的關鍵字值大於key1並且小於key2

搜索2-3-4樹:

插入:

節點分裂:向下尋找插入位置時,節點已經滿了,為了保持平衡,就必須分裂

將數據向上和向右移動

在下行路中分裂:任何分裂節點的父節點肯定不是滿的

什麽時候分裂:滿了就分裂

2-3-4樹可以轉變為紅黑樹:旋轉和變色 等價於 分裂

存儲需求:只是利用了5/7的可用空間 紅-黑樹在存儲上比2-3-4樹利用更高

2-3樹:節點分裂:2-3-4數載所有分裂完成之後才會插入新數據,2-3樹中新的數據項必須參加分裂過程

分裂的目的還是保持平衡


外部存儲:數據存儲在RAM,磁盤存儲

快速查找、插入、和刪除

主存:一秒的百萬分之一訪問一個字節

磁盤:1秒的千分之一 10毫秒 讀寫頭移到正確磁道、讀寫頭旋轉到正確的位置 每分鐘10000圈,

數據按照數據塊來存儲 一次訪問一個數據塊

順序有序排列:按照某個關鍵字為所有記錄排序

查找:2分查找

插入:移動太頻繁 數據塊的頻繁讀取和寫入操作 關鍵字的問題


B-樹:多叉樹 紀念我們的偉人R.Bayer和E.M.McCreight外部存儲的數據結構

每節點一個數據塊 在磁盤中鏈接是文件中的塊的編號int型

17階B樹

B樹的效率:讀取的效率log9N 刪除、插入5+6<500000



索引:關鍵字---數據塊組成列表 索引比文件實際記錄小的多,完全可以放在內存

查找:

插入:插入

多級索引

對內存來說索引太大:在磁盤中存儲成B樹結構 數據項保存關鍵字和指向主文件中的一個塊指針

組合搜索條件:順序查找

外部文件排序:塊內部有序 讀取兩塊合為一塊有序 歸並排序


11.哈希表

哈希表的速度快於樹

缺點:基於數組、難於擴展、哈希表被基本填滿時,性能下降的非常嚴重

哈希化:關鍵字直接用於數組下標、哈希函數

關鍵字作為索引、數組

字典:字典、編譯器(哈希表保存符號表、符號表)

單詞和數組下標建立聯系 數字相加

50000個單詞 沒辦法把單詞分的足夠開 27的冪 產生的數組下標太多

哈希化:取余數。

哈希函數:把一個大範圍的數字哈希轉化成小範圍的數字

取中:每兩個數組單元、就有個單詞、這些單元沒有單詞

沖突:沒有太多的單詞有同樣的數組下標

解決沖突的方案:開放地址法 通過增加空位、減少沖突 鏈地址法:


開發地址法:尋找空白單元(線性探測、二次探測、再哈希法)

線性探測:聚集、導致較長的探測長度,意味著存取序列最後的單元非常耗時。裝填因子:已填入哈希表的數據項和表長的比率叫做裝填因子

二次探測:探測相隔較遠的單元 步驟是步數的平方 問題:二次聚集

再哈希法:依賴關鍵字的探測序列 stepSize = constant * (key % constant)

鏈地址法:

哈希函數:快速計算、隨機關鍵字

折疊:關鍵字分組

哈希化的效率:哈希函數的常量時間+探測長度

線性探測:成功的查詢P=(1+1)/(1-L2)/2 失敗的查詢P=(1+1)/(1-L)/2

鏈表地址法:成功1+loadFactor/2 失敗1+loadFactor

二次探測和再哈希法:成功log2(1-loadFactory)/loadFactory 失敗1/(1-loadFactory)

開放地址法和鏈地址法的比較:容量已知、裝填因子低於0.5 未知鏈地址法較好

哈希化和外部存儲:索引



12.堆

優先級隊列 插入和刪除的時間復雜度都是logN 完全二叉樹 每個節點的關鍵字都大於這個節點的子節點

弱序:不支持遍歷 不支持查找關鍵字

移除:移走根 最後一個節點移動到根的位置 一直向下篩選

插入:向上篩選

不是真的交換 減少復制的次數

堆的效率:log2N

堆排序:復制次數比快速排序多、時間復雜度O(logN)



13.圖

邊和頂點

交叉點間的連通性 鄰接 路徑

連通圖和非連通圖

無向圖

歐拉7橋問題


















數據結果和算法------下