數據結果和算法------下
希爾排序:實現簡單 不快不慢 穩定
插入排序:復制的次數太多 極端情況下表現不好
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橋問題
數據結果和算法------下