一、查找:
給定一個值K,在含有N個記錄的文件中進行搜索,尋找一個關鍵字等於K的記錄,如找到則輸出該記錄,否則輸出查找不成功的信息。
二、查找算法的優劣:
用比較次數的平均值來評估算法的優劣,稱爲平均查找長度ASL。
三、靜態查找表:
- 順序查找(線性查找)
- 折半查找(二分或對分查找)
- 分塊查找(索引順序查找)
四、順序查找:用逐一比較的辦法順序查找關鍵字
性能分析:平均查找長度爲:(N+1)/2,時間效率O(n)
優點:算法簡單、適用面廣,對查找表的結構沒有要求,無論記錄是否按關鍵字有序排列均可使用。
缺點:在N值較大時,平均查找長度較大,查找效率較低。
五、折半查找(二分查找)
先給數據排序,形成有序表,把待查數據值與查找範圍的中間元素值進行比較,會有四種情況出現。
- 待查找數值與中間元素值相等,返回中間元素值的索引。
- 待查找數值比中間元素值小,則以整個查找範圍的前半部分作爲新的查找範圍,執行第一種,直到找到相等的值。
- 待查找的數值比中間元素值大,則以整個查找範圍的後半部分作爲新的查找範圍,執行第一種,直到找到相等的值。
- 如果最後找不到相等的值,則返回錯誤提示信息。
平均查找長度:(n+1)/n log2(N+1)-1=log2(n-1)-1
折半查找比順序查找的效率要高,但它 要求查找表經行順序存儲並且按關鍵字有序列表,因此對錶經行元素的插入和刪除時,需要移動大量的元素,所以折半查找適用於表不易變動,且又經常經行查找的情況。
六、分塊查找:
又稱索引順序查找,是對順序查找方法的一種改進,其性能介於順序查找和折半查找之間。
在分塊查找過程中,首先把表分成若干塊,每一塊中的關鍵字不一定有序,但有塊之間是有序的,即後一塊中所有記錄的關鍵字均大於前一塊中最大的關鍵字,還建立了一個索引表,索引表按關鍵字有序。
七、查找步驟分兩步經行:
- 對索引表使用折半查找法(因爲索引表是有序表)
- 確定了待查關鍵字所在的子表後,在子表內採用順序查找法(因爲各子表內部是無序表)
八、哈希表
根據關鍵碼值而直接經行訪問的數據結構。由關鍵碼的值決定數據的這個存儲地址,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫坐散列表。
優點:查找速度極快(O(1)),查找效率與元素個數N無關。
九、哈希查找方法中,衝突(數值數量大於哈希值數量)是不可能避免的,只能可能減少。
- 構造好的哈希函數
所選函數儘可能簡單、以便提高轉換速度。
所選函數對關鍵碼計算除的地址,應在哈希地址內集中並大致均勻分佈,以減少空間浪費。 - 制定一個好的解決衝突的方案
查找時,如果哈希函數計算出的地址查不到關鍵碼,則應當一句解決衝突的規則,有規律地查詢其它相關單元。