一、查找的基本概念
查找(Searching)就是根據給定的某個值,在查找表中確定一個其關鍵字等於給定值得數據元素(或記錄)。
查找表(Search Table)是同一類型的數據元素(或記錄)構成的集合。
查找表按照操作方式分為兩大類:
靜態查找表:只作查找操作的查找表。
順序表查找、有序表查找、線性索引查找
動態查找表:在查找過程中同時插入查找表中不存在的數據元素,或者從查找表中刪除已經存在的某個元素。
二叉排序樹、平衡二叉樹(AVL樹)、多路查找樹(B樹)
二、順序表查詢
這是最簡單的一種,從表中的最后一個記錄開始,逐個進行記錄的關鍵字與給定值進行比較,若某個記錄的關鍵字與給定值相等,則查找成功,找到所查的記錄;反之,若直到第一個記錄,其關鍵字和給定值比較都不相等,則表明表中沒有所查的記錄,查找失敗。
平均的查找長度為(n+1)/2,最好的長度為1,最差的查找長度為n。時間復雜度o(n)
優化措施:
設置哨兵
設置a[0] 為關鍵字值,稱之為哨兵,當返回值為0則表示未找到。從尾部開始查找。
免去了查找過程中每一次比較后都要判斷查找位置是否越界的小技巧。
將查找概率大的記錄放到查找表的前面。
三、有序表查找
折半查找(二分法查找)
平均查找長度:log(n+1)-1,通過二分查找樹的判斷樹來推的。二分查找的最壞性能和平均性能非常接近。時間復雜度o(lgn)。
插值查找
這種方法是在二分查找基礎上改進的,核心是對mid的取值,公式為:
mid = low + (key - arr[low])*(high-low)/(arr[high]-arr[low])
至於為什么這么改進,因為key小的話,那么我趨向於在表中低地址端去查找,而key大的話那么我們趨向在表的高地址端去查找。
時間復雜度也是 o(lgn)。
斐波那契查找
不是采用二分,而是斐波拉契序列的值去縮小我們的范圍。時間復雜度o(lgn)。
四、線性索引查找
稠密索引
分塊索引
倒排索引
五、二叉排序樹
六、平衡查找樹(AVL樹)
由於二叉排序樹一般都不是平衡的,而二叉排序樹的查找性能取決於二叉排序樹的形狀,所以構造一種平衡的二叉樹。左右子樹高度相差不到1。所以此樹總是平衡的。提高了查找效率。
二叉樹上的結點的左子樹的深度減去右子樹的深度的值稱為平衡因子BF。只要二叉樹上有一個結點的平衡因子的絕對值大於1,則該二叉樹就是不平衡的。
平衡二叉樹的構建過程:
總之就是把不平衡消滅在最早的時刻。
查找時間復雜度為O(logn),而插入和刪除的時間復雜度也為O(logn)。
紅黑樹,二叉排序樹的另外一種平衡算法。
七、多路查找樹(B樹)
目的:為了降低對外存設備的訪問次數。
定義:多路查找書,其每一個結點的孩子樹可以多於兩個,且每一個結點處可以存儲多個元素。
堵路查找樹的形式:
2-3樹
2-3-4樹
B樹 平衡的多路查找樹
B+樹 為了解決所有元素遍歷的問題
結點最大的孩子數目稱為B樹的階,因此,2-3樹是3階B數。