查找技术
查找的基本概念
列表:由同一類型的數據元素組成的集合。
關鍵碼:數據元素中的某個數據項,可以標識列表中的一個或一組數據元素。
鍵值:關鍵碼的值。
主關鍵碼:可以唯一地標識一個記錄的關鍵碼。
次關鍵碼:不能唯一地標識一個記錄的關鍵碼。
查找 :在具有相同類型的記錄構成的集合中找出滿足給定條件的記錄。
查找的結果 :若在查找集合中找到了與給定值相匹配的記錄,則稱查找成功;否則,稱查找失敗。
靜態查找 :不涉及插入和刪除操作的查找 。
動態查找 :涉及插入和刪除操作的查找。
靜態查找適用于:查找集合一經生成,便只對其進行查找,而不進行插入和刪除操作; 或經過一段時間的查找之后,集中地進行插入和刪除等修改操作;
動態查找適用于:查找與插入和刪除操作在同一個階段進行,例如當查找成功時,要刪除查找到的記錄,當查找不成功時,要插入被查找的記錄。
查找結構 :面向查找操作的數據結構 ,即查找基于的數據結構。
本章討論的查找結構 :
線性表:適用于靜態查找,主要采用順序查找技術、折半查找技術。
樹表:適用于動態查找,主要采用二叉排序樹的查找技術。
散列表:靜態查找和動態查找均適用,主要采用散列技術。
平均查找長度:將查找算法進行的關鍵碼的比較次數的數學期望值定義為平均查找長度。計算公式為:
線性表的查找技術
順序查找
基本思想:
從線性表的一端向另一端逐個將關鍵碼與給定值進行比較,
若相等,則查找成功,給出該記錄在表中的位置;
若整個表檢測完仍未找到與給定值相等的關鍵碼,則查找失敗,給出失敗信息。
改進順序查找
基本思想:
設置“哨兵”。哨兵就是待查值,將哨兵放在查找方向的盡頭處,免去了在查找過程中每一次比較后都要判斷查找位置是否越界,從而提高查找速度。
順序查找的優點:
算法簡單而且使用面廣。
對表中記錄的存儲結構沒有任何要求,順序存儲和鏈接存儲均可;
對表中記錄的有序性也沒有要求,無論記錄是否按關鍵碼有序均可。
順序查找的缺點:
平均查找長度較大,特別是當待查找集合中元素較多時,查找效率較低。
折半查找
基本思想:
在有序表中(low, high,low<=high),
取中間記錄作為比較對象,
若給定值與中間記錄的關鍵碼相等,則查找成功;
若給定值小于中間記錄的關鍵碼,則在中間記錄的左半區繼續查找;
若給定值大于中間記錄的關鍵碼,則在中間記錄的右半區繼續查找。
不斷重復上述過程,直到查找成功,或所查找的區域無記錄,查找失敗。
折半查找判定樹
判定樹:折半查找的過程可以用二叉樹來描述,
樹中的每個結點對應有序表中的一個記錄,
結點的值為該記錄在表中的位置。
通常稱這個描述折半查找過程的二叉樹為折半查找判定樹,簡稱判定樹。
構造方法:
⑴ 當n=0時,折半查找判定樹為空;
⑵ 當n>0時,折半查找判定樹的根結點為mid=(n+1)/2,
根結點的左子樹是與有序表r[1] ~ r[mid-1]相對應的折半查找判定樹,
根結點的右子樹是與r[mid+1] ~ r[n]相對應的折半查找判定樹。
特點:
任意兩棵折半查找判定樹,若它們的結點個數相同,則它們的結構完全相同
具有n個結點的折半查找樹的高度為[log2n]+1。
性質:
任意結點的左右子樹中結點個數最多相差1
任意結點的左右子樹的高度最多相差1
任意兩個葉子所處的層次最多相差1
總結
- 上一篇: 【SpringBoot新手篇】Sprin
- 下一篇: “企业级零代码黑客马拉松”决赛圆满落幕