查詢的基本概念:
查詢表:同一型別的資料元素(記錄)構成的集合。
靜態查詢表:對查詢表只進行查詢操作。動態查詢表:不僅進行查詢操作,而且在查詢過程中還伴隨著插入(查詢的資料元素不在表中時)、刪除某個資料元素的操作。
關鍵字(key):是資料元素(或記錄)的某個資料項的值,用它可標識(識別)乙個資料元素(或記錄)。
平均查詢長度(asl):需和給定值進行比較的關鍵字個數的期望。
asl=∑i=1npici
asl=∑i=1npici
n:表中記錄個數
pipi:查詢第i個記錄的概率
cici:找到第i個記錄需要進行的對比次數。
以下這張圖是一位大佬部落格(的知識框圖:
書上也總結了順序查詢、折半查詢和分塊查詢的比較:
折半查詢和二叉樹查詢的比較:
b樹
即二叉搜尋樹:
1.所有非葉子結點至多擁有兩個兒子(left和right);
2.所有結點儲存乙個關鍵字;
3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹;
b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中;否則,如果查詢關鍵字比結點關鍵字小,就進入左兒子;如果比結點關鍵字大,就進入右兒子;如果左兒子或右兒子的指標為空,則報告找不到相應的關鍵字;
如果b樹的所有非葉子結點的左右子樹的結點數目均保持差不多(平衡),那麼b樹的搜尋效能逼近二分查詢;但它比連續記憶體空間的二分查詢的優點是,改變b樹結構(插入與刪除結點)不需要移動大段的記憶體資料,甚至通常是常數開銷;
b-樹
b-tree,即b樹,而不要讀成b減樹,它是一種多路搜尋樹(並不是二叉的):
1.定義任意非葉子結點最多只有m個兒子;且m>2;
2.根結點的兒子數為[2, m];
3.除根結點以外的非葉子結點的兒子數為[m/2, m];
4.每個結點存放至少m/2-1(取上整)和至多m-1個關鍵字;(至少2個關鍵字)
5.非葉子結點的關鍵字個數=指向兒子的指標個數-1;
6.非葉子結點的關鍵字:k[1], k[2], …, k[m-1];且k[i] < k[i+1];
7.非葉子結點的指標:p[1], p[2], …, p[m];其中p[1]指向關鍵字小於k[1]的子樹,p[m]指向關鍵字大於k[m-1]的子樹,其它p[i]指向關鍵字屬於(k[i-1], k[i])的子樹;
8.所有葉子結點位於同一層;
b-樹的特性:
1.關鍵字集合分布在整顆樹中;
2.任何乙個關鍵字出現且只出現在乙個結點中;
3.搜尋有可能在非葉子結點結束;
4.其搜尋效能等價於在關鍵字全集內做一次二分查詢;
5.自動層次控制;
b+樹
b+樹是b-樹的變體,也是一種多路搜尋樹:
1.其定義基本與b-樹同,除了:
2.非葉子結點的子樹指標與關鍵字個數相同;
3.非葉子結點的子樹指標p[i],指向關鍵字值屬於[k[i], k[i+1])的子樹(b-樹是開區間);
5.為所有葉子結點增加乙個鏈指標;
6.所有關鍵字都在葉子結點出現;
b+的特性:
1.所有關鍵字都出現在葉子結點的鍊錶中(稠密索引),且鍊錶中的關鍵字恰好是有序的;
2.不可能在非葉子結點命中;
3.非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是儲存(關鍵字)資料的資料層;
4.更適合檔案索引系統;
原因: (2)增刪檔案(節點)時,效率更高,因為b+樹的葉子節點包含所有關鍵字,並以有序的鍊錶結構儲存,這樣可很好提高增刪效率。
而雜湊表的查詢主要是如何構造雜湊函式和如何處理衝突。
如何構造雜湊函式:
1、數字分析法
2、平方取中法
3、摺疊法
處理衝突的方法
1、開放位址法
2、鏈位址法
以下為開放位址和鏈位址之間的比較
二叉排序樹
二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:
(1)若左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;
(2)若右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;
(3)左、右子樹也分別為二叉排序樹;
(4)沒有鍵值相等的節點。
二叉排序樹的插入演算法:
struct bitree ;二叉排序樹的刪除演算法://在二叉排序樹中插入查詢關鍵字key
bitree* insertbst(bitree *t,int key)
if (key < t->data)
t->lchild = insertbst(t->lchild, key);
else
t->rchild = insertbst(t->rchild, key);
return t;}
//n個資料在陣列d中,tree為二叉排序樹根
bitree* createbitree(bitree *tree, int d, int n)
#define status boolstatus delete(bitree*);//必須先宣告
status deletebst(bitree &tparent,bitree &t, keytype key)//若二叉排序樹t中存在關鍵字等於key的資料元素時,則刪除該資料
//元素,並返回true;否則返回false
return true;
}status delete(bitree& fp , bitree&p)//從二叉排序樹中刪除結點p,並重接它的左或右子樹
else if(!p->lchild)//左子樹空只需重接它的右子樹
else//左右子樹均不空
//此時q是s的父結點
s->rchild=p->rchild; //將s的左子樹作為q的右子樹
delete(p);
}return true;
}
第七章學習小結
第七章的內容是查詢。查詢可以分為3種。分別是線性表查詢 樹表查詢 雜湊表查詢。1 線性表查詢 線性表查詢主要介紹了順序查詢和折半查詢這兩種方法。1 順序查詢區別於上學期學的方法,設定了哨兵,採用從後往前開始查詢的方法,將時間複雜度縮短了一倍。asl n 1 2 2 折半查詢,其實也叫二分查詢,原理是...
第七章小結
第七章我們主要是學習了查詢,是在前面的基礎上對查詢進行優化。一 基本概念 查詢表 由同一型別的資料元素或記錄構成的集合。完全鬆散 關鍵字 根據給定的某個值,在查詢表中確定乙個其關鍵字等於給定值的記錄或資料元素。動態查詢表和靜態查詢表 若在查詢的同時對錶做修改操作 如插入或刪除 則相應的表稱為動態查詢...
第七章 查詢 學習小結
一 本章思維導圖 線性表 樹表 雜湊表 二 pta實踐及作業 二分查詢變形 hashing 2 二分查詢變形 面試 變形方向 1 算大於key的最小值 小於key的最大值 2 形成分割線,一邊全部大於key值,一邊全部小於key值 3 hashing i 重要 1 判斷是否為素數 質數 若不是,則要...