一、順序查找
順序查找又稱線性查找,主要用於在線性表中進行查找。
1.1 無序表的順序查找
對無序線性表進行順序查找,查找失敗時要遍歷整個線性表
int search_seq_u(int elems[], int key) {
int i;
for(i = elems.length-1; i >=0 && elems[i]!=key; i--);
return i;
}
同理,ASL失敗 = n
1.2 有序表的順序查找
對關鍵字有序線性表進行順序查找,查找失敗時不一定要遍歷整個線性表
在此我們引入二叉排序樹:
有n+1個失敗節點,查找成功的ASL依舊爲(n+1)/2
二、折半查找
折半查找又稱二分查找,僅適用於有序的順序表
算法思想:
首先將給定值key與表中中間位置元素的關鍵字比較,
若相等,則返回該元素的位置;
若不等,則在前半部分或者是後半部分進行查找.查找序列升序時,
若key小於中間元素,則查找前半部分;
若key大於中間元素,則查找後半部分。
重複該過程,直到找到查找的元素爲止;或查找失敗。
int binary_search(int sq[], int key) {
int low = 0, high = sq.length-1,mid;
while(low<=high) {
mid = (high+low) / 2;
if(sq[mid]==key)
return mid;
else if(sq[mid]>key)
high = mid-1;
else {
low = mid+1;
}
}
return -1;
}
折半查找判定樹(更像平衡二叉樹,查找效率更高):
上面這個例子的ASL成功爲:(1×1+2×2+3×4+4×4)/11 = 3【每個結點的查找次數加以來除以節點數】
ASL失敗爲(3×4+4×8)/12 = 11/3
三、分塊查找
分塊查找又稱索引順序查找,它吸取了順序查找和折半查找各自的優點,
既有動態結構,又適於快速查找。
如何分塊:
將查找表分爲若干子塊。塊內的元素可以無序,但塊間是有序的,即對於所有塊有第 i 塊的最大關鍵字小於第 i+ 1塊的所有記錄的關鍵字。
建立索引表,索引表中的每個元素含有各塊的最大關鍵字和各塊中的第一個元素的地址,索引表按關鍵字有序排列。
如何查找
- 在索引表中確定待查記錄所在的塊,可以順序查找或折半查找索引表。
- 在塊內進行順序查找