1. 程式人生 > >查找->動態查找表->鍵樹(無代碼)

查找->動態查找表->鍵樹(無代碼)

找到 nbsp 順序查找 等於 line num 指向 alt 所有

文字描述

鍵樹定義

  鍵樹又叫數字查找樹,它是一棵度大於或等於2的樹,樹中的每個結點中不是包含一個或幾個關鍵字,而是只含有組成關鍵字的符號。例如,若關鍵字是數值,則結點中只包含一個數位;若關鍵字是單詞,則結點中只包含一個字母字符。從根到葉子結點的字符組成的字符串表示一個關鍵字,葉子結點中的特殊符號$表示字符串的結束。在葉子結點中還含有指向該關鍵字記錄的指針。

  為了查找和插入方便,可以約定鍵樹是有序樹,即同一層中兄弟結點之間依所含符號自左至右有序,並約定$小於任何字符。

鍵樹存儲結構

(1)雙鏈樹

  以樹的孩子兄弟鏈表示鍵樹,每個分支結點包含3個信息:symbol, 存儲關鍵字的一個字符;first,存儲指向第一顆子樹根的指針;next,存儲指向右兄弟的指針。同時,葉子結點的infoptr存儲指向該關鍵字記錄的指針。此時的鍵樹又稱為雙鏈樹。

  雙鏈樹的查找:假設給定值K.ch(0,…,num-1),其中K.ch[0]至K.ch[num-2]表示待查關鍵字中num-1個字符,K.ch[num-1]為結束符$,從雙鏈樹的根指針出發,順著根指針的first指針找到第一個子樹的根結點,以K.ch[0]和此結點的symbol值比較,若相等,則順first再比較下一個字符;若不相等,沿next順序查找。若直至”空”仍比較不等,則查找不成功。

  雙鏈樹的查找分析: 鍵樹中每個結點的最大度d和關鍵字的“基”有關,若關鍵字是單詞,則d=27;若關鍵字是數值,則d=11。鍵樹的深度h則取決於關鍵字中字符或數位的個數。假設關鍵字為隨機的(即關鍵字中每一位取基內任何值的概率相同),則在雙鏈樹中查找每一位的平均查找長度為(1+d)/2。又假設關鍵字中字符(或數位)的個數都相等,則在雙鏈樹中進行查找的平均查找長度為[h*(1+d)]/2

  雙鏈樹的插入或刪除: 雙鏈樹的插入或刪除一個關鍵字,相當於在樹中某個結點上插入或刪除一顆子樹。

(2)Trie樹(trie這個詞是從retrieve[檢索]中取中間四個字符而來的)

  以樹的多重鏈表表示鍵樹,則樹的每個結點中應含有d個指針域,此時的鍵樹又稱Trie樹。若從鍵樹中某個結點到葉子結點的路徑上每個結點都只有一個孩子,則可將該路徑上所有結點壓縮成一個“葉子結點”,且在該葉子結點中存儲關鍵字及指向記錄的指針等信息。由此,在Trie樹中只有兩種結點:分支結點(含有d個指針域和一個指示該結點中非空指針域的個數的整數域)和葉子結點(含有關鍵字域和指向記錄的指針域)。在分支結點中不設數據域,每個分支結點所表示的字符均由其雙親結點中(指向該結點)的指針所在位置決定。

  Trie樹的查找: 從根結點出發,沿和給定值相應的指針逐層向下,直到葉子結點,若葉子結點中的關鍵字和給定值相等,則查找成功,若分支結點中和給定值相應的指針為空,或葉子結點中的關鍵字和給定值不相等,則查找不成功。

  Trie樹的查找分析:從上述查找過程可知,在查找時走了一條從根到葉子結點的路徑。由此,查找的時間依賴於樹的深度。

示意圖

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

算法分析

代碼實現

查找->動態查找表->鍵樹(無代碼)