1.2 折半查詢
1.3 分塊查詢(索引查詢)
2、b樹和b+樹
**的方法:
2.2 b+樹的基本概念
3、雜湊表
4、串5、補充
思想:
從線性表的一端開始,與關鍵字逐個比較。
若已經比對到表的另一端還沒有匹配成功,則返回查詢失敗資訊
typedef
struct
sstable;
intsearch_seq
(sstable st , elemtype key)
引入哨兵目的是使得search_seq內的迴圈不必判斷陣列是否會越界,因為滿足i==0時, 迴圈一定跳出
前提:**
**僅適合有序的順序表**
**僅適合有序的順序表**
**僅適合有序的順序表
思想: 首先將給定值key與表中中間元素的關鍵字比較,若相等,則查詢成功,返回元素的儲存位置;
若不等,則所需查詢的元素只能在中間元素以外的前半部分或後半部分,然後在縮小的範圍內繼續進行同樣的查詢,如此往復,
直到查詢成功為止或在表中找不到這樣的元素,則查詢失敗,返回查詢失敗的原因。
int
binary_search
(seqlist l , elemkey key)
else
if(key > l.elem[mid]
)else
}
對於折半查詢:
如果是奇數個結點,則選取中間節點。
如果是偶數個結點,則從始至終用分界線靠左或靠右的結點。
前提:
「是順序查詢和折半查詢的綜合」
將查詢表分成若干個子塊。塊內元素可以無序,但塊之間是有序的(即第乙個子塊的最大關鍵字小於第二個字塊的最小關鍵字,以此類推)。
再建乙個索引表索引表中的每個元素含有各塊的最大關鍵字和各塊中的第乙個元素的位址。索引表按關鍵字(各塊最大元素)大小有序排列。
思想:第一步:在索引表中確定key所在的塊,可以順序查詢或折半查詢索引表;
第二部:在塊內順序查詢。
b樹的階 :所有結點樹孩子結點數的最大值,m來表示。
一棵m階b樹或為空樹
1)樹中每個結點至多有m棵子樹(即最多有m-1個關鍵字)
2)若根節點不是終端節點,則至少有兩棵子樹。(根節點至少有乙個關鍵字)
3)除根節點外的所有非葉節點至少有⌈m2
⌉\lceil \frac \rceil
⌈2m
⌉棵子樹(即至少含有⌈m2
−1⌉\lceil \frac -1\rceil
⌈2m−1
⌉個關鍵字)
4)所有非葉節點的結構如下: n
p0k1
p1k2
p2···
knpn
其中,n表示有多少個關鍵字ki(i = 1,2,···,n)為結點的關鍵字,且滿足 k1 < k2 < ···5)所有葉節點都出現在同一層次上,並且不帶資訊(實際指向這些結點的指標為空,即不存在)
b樹是所有結點的平衡因子都為0的多路查詢樹,上圖為3階b樹,其中最低層表示葉節點,在這些結點中,沒有存放任何資訊。
1)高度h
≥logm
n+1h\geq \log_m^
h≥logmn+
1(n個關鍵字、m階)
b樹的查詢與二叉樹查詢很相似,只是每個結點有多個關鍵字的有序表。
基本操作:
在b樹中找結點;
在節點中找關鍵字。
由於前乙個查詢操作在磁碟上進行的,而後乙個操作在記憶體中進行的,即在找到目標節點後應先將節點中的資訊讀入記憶體中
插入過程:
定位:利用查詢演算法找到插入該關鍵字的最低層中的某個非葉節點(b樹中的插入關鍵字一定插入在最低層中的某個非葉節點內)
在b樹中,每個非失敗結點的關鍵字個數都在區間[⌈m
2⌉,m
−1][ \lceil \frac \rceil , m-1]
[⌈2m⌉
,m−1
]內,知識點一
靜態查詢
動態查詢
順序查詢、折半查詢、雜湊查詢
二叉排序樹、雜湊查詢
知識點二
對線性的鍊錶只能進行順序查詢。
幾種合併查詢演算法
問題 實際中需要知道拓撲圖中的2點是否連通,比如電路板 地圖中不同的城市等等,這種問題可以轉化為合併查詢問題,相應的求解可以用合併查詢演算法。基本思想是轉化為長度為n的陣列和已知m對連通對,其值表示了兩個點是否連通。合併查詢演算法 union find 可以有以下幾種 1 快速查詢演算法 mark連...
幾種基本的排序演算法
1.氣泡排序 氣泡排序的目標就是通過第一次迴圈將最大 最小 的數找出來,第二次迴圈將次大 次小 的數找出來.氣泡排序在最壞情況下的時間複雜度為o n 2 平均時間複雜度 o n 2 最好情況下的時間複雜度是 o n 演算法穩定。氣泡排序 public class bunnlesort public ...
幾種查詢演算法的比較
1.堆的意義在於最快的找到最大最小值,在堆中插入乙個值,取走最大值或最小值重新構建堆結構,其時間複雜度為o log n 而其它方法至少為 o n 堆在實際中用途不在於排序,堆的應用 a.在於排程演算法中,比如優先順序排程,每次取優先順序最高的.b.可以採用堆構造優先順序佇列,優化dijstra 演算...