查找算法——javascript算法實現

查找表 search table

查找表相關概念

查找表是由同一類型的數據元素(或記錄)構成的集合。由於”集合”中的數據元素之間存在着完全鬆散的關係,因此查找表是一種非常靈便的數據結構。

靜態查找表 static search table

動態查找表 dynamic search table

關鍵字 key 關鍵字是數據元素中某個數據項的值,用它可以標識一個數據元素。

靜態查找表

順序表的查找

順序查找的過程:從表中的最後一個記錄開始,逐個進行記錄的關鍵字與給定的值進行比較,若某個記錄的關鍵字和給定值比較相等,則查找成功。

小技巧:監視哨 在查找表的第一個記錄中存儲在要查找的值,則可以避免查找過程中每一步都要檢測整個表是否查找完畢。
優點
算法簡單且適應面廣,對錶的結構無任何要求。
缺點
平均查找長度較大。特別是當n很大時,查找效率較低,爲(1+n)/2。

有序表的查找

  1. 折半查找
    先確定待查找記錄所在的範圍,然後逐步縮小範圍直到找到或找不到該記錄爲止。
    折半查找的效率比順序查找高,但折半查找只適用於有序表,且限於順序存儲結構(對線性鏈表無法有效地進行折半查找)
  2. 斐波那契查找
F0 =0
F1=1;
Fi=F(i-1)+F(i-2);

斐波那契查找的平均性能優於折半查找,但是最壞情況下的性能卻比折半查找差。O(logn),它還有一個優點就是分割時只進行加,減運算。
3. 插值查找
插值查找是根據給定值key來確定進行比較的關鍵字的查找方法。
令i=(key-ST[l].key)(h-l+1)/(ST[h].key-ST[l].key)。
其中ST[l].key和ST[h].key分別爲有序表中具有最小關鍵字和最大關鍵字的記錄。顯然這種插值查找只適於關鍵字分佈均勻的表,在這種情況下,對錶長較大的順序表,其平均性能比折半查找好。

靜態樹表的查找

前面對有序表的查找性能的討論是在“等概率”的前提下進行的。但有序表中各個記錄的查找概率不等式,則可以採用靜態樹表的查找。

如果只考慮查找成功的情況,則使查找性能達到最佳的判定樹是其帶權內路徑長度之和PH值取最小的二叉樹(靜態最優查找樹 static optimal search table)。
由於構建靜態最優查找樹花費的時間代價較高,因此僅介紹一種構造近似最優查找樹(nearly optimal search table)的有效算法。

索引順序表的查找

若以索引順序表表示靜態查找表,則查找可以用分塊查找
分塊查找又稱爲索引順序查找,這是順序查找的一種改進方法。在這種查找方法中,除表本身外,還需要建立一個“索引表”。將所有記錄劃分成多個子表,對每個子表建立一個索引項,其中包括兩項內容:關鍵字項(保存該子表內的最大關鍵字)和指針項(指示該子表的第一個記錄在表中的位置)。

動態查找表

動態查找表的特點是,表結構本身是在查找過程中動態生成的,即對於給定值key,若表中存在其關鍵字等於key的記錄,則查找成功返回,否則插入關鍵字等於key的記錄。

二叉排序樹 binary sort tree

定義
1. 若左子樹不爲空,則左子樹上所有結點的值(關鍵字)都小於根結點的值;
2. 若右子樹不爲空,則右子樹上所有結點的值(關鍵字)都大於根結點的值;
3. 左、右子樹都分別是二叉排序樹。

結論:若按中序遍歷一棵二叉排序樹,所得到的結點序列是一個遞增序列。

平衡二叉樹 AVL balanced binary tree

定義
它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。
1. 紅黑樹
2. AVL

B-和B+樹

鍵樹(數字查找樹)

哈希表

哈希表的構造方法

  1. 直接定址法:取關鍵字或關鍵字的某個線性函數值爲散列地址。即H(key)=key或H(key) = a·key + b,其中a和b爲常數(這種散列函數叫做自身函數)。若其中H(key)中已經有值了,就往下一個找,直到H(key)中沒有值了,就放進去。
  2. 數字分析法:分析一組數據,比如一組員工的出生年月日,這時我們發現出生年月日的前幾位數字大體相同,這樣的話,出現衝突的機率就會很大,但是我們發現年月日的後幾位表示月份和具體日期的數字差別很大,如果用後面的數字來構成散列地址,則衝突的機率會明顯降低。因此數字分析法就是找出數字的規律,儘可能利用這些數據來構造衝突機率較低的散列地址。
  3. 平方取中法:當無法確定關鍵字中哪幾位分佈較均勻時,可以先求出關鍵字的平方值,然後按需要取平方值的中間幾位作爲哈希地址。這是因爲:平方後中間幾位和關鍵字中每一位都相關,故不同關鍵字會以較高的概率產生不同的哈希地址。
  4. 摺疊法:將關鍵字分割成位數相同的幾部分,最後一部分位數可以不同,然後取這幾部分的疊加和(去除進位)作爲散列地址。數位疊加可以有移位疊加和間界疊加兩種方法。移位疊加是將分割後的每一部分的最低位對齊,然後相加;間界疊加是從一端向另一端沿分割界來回摺疊,然後對齊相加。
  5. 隨機數法:選擇一隨機函數,取關鍵字的隨機值作爲散列地址,通常用於關鍵字長度不同的場合。
  6. 除留餘數法:取關鍵字被某個不大於散列表表長m的數p除後所得的餘數爲散列地址。即 H(key) = key MOD p,p<=m。不僅可以對關鍵字直接取模,也可在摺疊、平方取中等運算之後取模。對p的選擇很重要,一般取素數或m,若p選的不好,容易產生同義詞。

處理衝突的方法

  1. 開放定址法:Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)爲散列函數,m爲散列表長,di爲增量序列,可有下列三種取法:
    1.1. di=1,2,3,…,m-1,稱線性探測再散列
    1.2. di=1^2,-1^2,2^2,-2^2,⑶^2,…,±(k)^2,(k<=m/2)稱二次探測再散列
    1.3. di=僞隨機數序列,稱僞隨機探測再散列
  2. 再哈希法:Hi=RHi(key),i=1,2,…,k RHi均是不同的散列函數,即在同義詞產生地址衝突時計算另一個散列函數地址,直到衝突不再發生,這種方法不易產生“聚集”,但增加了計算時間。
  3. 鏈地址法(拉鍊法)將所有關鍵字爲同義詞的記錄存儲在同一線性鏈表中
  4. 建立一個公共溢出區,一旦衝突全部填入溢出表

參考資料

  1. 動態查找–二叉排序樹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章