字尾樹的實現形式

2021-09-20 06:29:06 字數 1231 閱讀 7515

————《高階資料結構》

上述字尾樹t是根據字串s的所有字尾構建的。有時候這個s可以是要給字串集合,所以字尾樹t是根據所欲字串的字尾構建的。這種字尾樹也叫做廣義字尾樹。

一種很自然的構建方式可以給每個字串加兩兩不同的結尾符,這些結尾符沒有在任何字串**現過。然後,我們將這些新增了結尾符的字串首尾相接作為乙個整體來構建其字尾樹。由於任何乙個字尾都不是其他字尾的字首,並且任意連個字串的結尾符不同,所以我們還是可以方便地找到所需要的字尾。不過,這種實現方式會多了許多沒有意義的字尾,在空間和**優美程度上都差強人意。

另外一種實現方式,是將每個字串加相同的結尾符後依次新增進書中。在第i+1次新增字串si+1時,我們像在單獨構建字尾樹時一樣,在原來樹基礎上逐步構建si+1的隱式樹。因為這種構建過程不會影響前i次的字尾,並且仍可以保證si+1的所有字尾都被新增進來。這種方式會導致乙個字尾屬於多個字串。所以在葉節點上,我們還需要開乙個列表來終止於此的那些字串編號。

6.**實現

在實現**之前,我們需要對字尾樹的儲存方式做乙個討論。主要原因是字尾樹中涉及的字元種類範圍不確定,可以是26個英文本母,可以是所有漢字,或者更糟糕。一下是常用的幾種儲存方式。

(1)陣列。用陣列儲存孩子節點是最常用的方法之一。如果我們事先知道字串**現的字符集的大小,假設為c,那麼字尾樹中每個節點都需要維護乙個包含c個元素的陣列。這種方式可以在o(1)的時間內執行查詢,插入操作,其主要缺點有空間浪費以及需要字符集固定。

(2)鍊錶。用鍊錶來維護孩子節點是,每個節點需要儲存自己的第乙個孩子節點,同時每個節點還要維護自己的相鄰兄弟節點,這樣就可以遍歷乙個節點的孩子了,不過這樣查詢和插入都需要o(c)的時間來定位了。乙個小優化是可以將孩子系欸但維護為有序的,這樣維護成本不會增加,但是會降低期望查詢時間。這種以時間換空間的方式使得字尾樹支援可變字符集,並且將空間節省到最小。

(3).平衡樹。用平衡樹來儲存孩子節點可以算是對鍊錶儲存的一種改進。這樣可以將每次查詢,插入操作的時間複雜度降到o(log2c)。不過鑑於平衡樹結合字尾樹的編碼複雜度,這種方法僅當c較大的時候比較合適。

(4)雜湊表。不論是用開雜湊還是閉雜湊的方式,這種儲存方式仍然需要找到乙個時間和空間的平衡點,並且線性時間複雜度對雜湊函式的要求也比較高。

綜上所述,不同的表示方式有各自的優點和缺點,沒有絕對優秀的方法。所以,具體的實方式還是要依據具體問題來定。有些時候甚至可以將幾種表示方式聯合起來在乙個字尾樹中使用。

以下的**將用鍊錶儲存結構儲存,並且我們直接構建廣義字尾樹,單個字串的字尾樹可以看作廣義字尾樹的特例。

ruby迴圈的實現形式

ruby迴圈的實現形式 關鍵字 ruby ruby語言的用法非常的靈活。我們來舉個簡單的例子 如我們有個陣列 array w a b c d e f 現在我們要遍歷該陣列,並列印出每個元素 ruby 1.2.方法一 3.length array.list 4.length.times do t 5....

迭代器多種實現形式

1.首先我們看下ienumerable介面定義 namespace system.collections 這個介面是重中之重,迭代器就是實現這個介面才能使之迭代的。2.c 的yield關鍵字您也必須知道 yield在迭代器塊中用於向列舉數物件提供值或發出迭代結束訊號。它有兩種表現形式 yield r...

資料去重的幾種實現形式

對資料庫進行操作,得到的結果有重複值,這是個不可避免的問題。從源頭上分析,分兩種情況 一是使用者執行了sql語句,此時得到的結果就已經包含重複值 另一種就是返回的物件是執行多條sql語句後得到了,每條sql語句返回的物件沒有重複值,但彼此之間存在重複現象,此時進行彙總操作就會出現重複值的情況。例如如...