第五章 單詞查找樹

我們可以利用字符串的性質來開發出比第三章更有效的查找算法。本節所討論的算法有以下性能:
  • 查找命中所需的時間與被查找的鍵的長度成正比
  • 查找未命中只需檢查若干個字符
此處我們可以擴展第三章的符號表的API,添加基於字符的用於處理字符串類型的鍵的操作。

擴展基於字符的符號表與普通符號表的區別爲
  • 將泛型的Key的類型換成了具體的類型String;
  • 添加了3個方法:longestPrefixOf()、keyWithPrefix()和keysThatMatch()。
 5.2.1 單詞查找樹

數據結構單詞查找樹:由字符串鍵中的所有字符構造而成,允許使用被查找鍵中的字符進行查找。
我們首先描述單詞查找樹的基本性質,包括查找和插入算法,然後詳細學習它的數據表示方法和java實現。

5.2.1.1 基本性質

單詞查找樹也是由鏈接的結點組成的數據結構,這些鏈接可能爲空,也可能指向其他結點。每個結點都只可能有一個指向它的結點,稱爲它的父結點。每個結點都含有R條鏈接,其中R爲字母表的大小。單詞查找樹一般都含有大量的空鏈接,因此在繪製一棵單詞查找樹時一般會忽略空鏈接。具體來說,我們將每個鍵所關聯的值保存在該鍵的最後一個字母所對應的的結點中。(值爲空的結點在符號表中沒有對應的鍵,它們的存在是爲了簡化單詞查找樹中的查找操作。)


5.2.1.2 單詞查找樹中的查找操作

在單詞查找樹中查找給定字符串鍵所對應的值是一個簡單的過程,它是以被查找鍵中的字符爲導向的。單詞查找樹中的每個結點都包含了下一個可能出現的所有字符的鏈接。從根結點開始,首先經過的是鍵的首字母所對應的鏈接;在下一個結點中沿着第二個字符所對應的鏈接繼續前進;在第二個結點中沿着第三個字符所對應的的鏈接向前,如此這般知道到達鍵的最後一個字母所指向的結點或是遇到了一條空鏈接。這可能出現三種情況:
  • 鍵的尾字符所對應的結點中的值非空。這是一次命中的查找----鍵所對應的值就是鍵的尾字符所對應的結點中保存的值。
  • 鍵的尾字符所對應的結點中的值非空。這是一次未命中的查找-----符號表中不存在被查找的鍵。
  • 查找結束與一條空鏈接。這是一次未命中的查找。
在所有的情況中,執行查找的方式就是單詞查找樹中從根結點開始檢查某條路徑上的所有結點。

5.2.1.3 單詞查找樹中的插入操作

和二叉查找樹一樣,在插入之前要進行一次查找:在單詞查找樹中意味着沿着被查找的鍵的所有字符到達樹中表示尾字符的結點或者一個空鏈接。此時可能會出現兩種情況。
  • 在到達鍵的尾字符之前就遇到了一個空鏈接。在這種情況下,字符查找樹中不存在與鍵的尾字符對應的結點,因此需要爲鍵中還未被檢查的每個字符創建一個對應的結點並將鍵的值保存到最後一個字符的結點中。
  • 在遇到空鏈接之前就到達了鍵的尾字符。在這種情況下,和關聯數組一樣,將該結點的值設爲鍵所對應的的值(無論該值是否爲空)。

5.2.1.4 結點的表示
在本節中開頭提到過的,我們爲單詞查找樹所繪出的圖像和在程序中構造的數據結構並不完全一致,因爲我們沒有畫出空鏈接。如果考慮空鏈接的話將會突出單詞查找樹的以下重要的性質:
  • 每個結點都含有R個鏈接,對應着每個可能出現的字符;
  • 字符和鍵均隱式地保存在數據結構中s


5.2.1.5 大小

size()方法的實現有3種顯而易見的選擇:
  • 即時實現:用一個實例變量N保存鍵的數量。
  • 更加即時的實現:用結點的實例變量保存子單詞查找樹中鍵的數量,在遞歸的put()和delete()方法調用之後更新它們。
  • 延時遞歸實現:如上頁框注“單詞查找樹的延時遞歸方法size()”所示。它會遍歷單詞查找樹中的所有結點並記錄非空值的總數。

5.2.1.6 查找所有鍵
因爲字符和鍵時被隱式地表示在單詞查找樹中,所以使用用例能夠遍歷符號表的所有鍵就變得有些困難。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章