數據結構與算法-學習筆記(22)

Trie樹(字典樹)

如何實現相似搜索引擎的搜索關鍵詞提示?

它是一種專門處理字符串匹配的數據結構,用來解決在一組字符串集合中快速查找某個字符串的問題。bash

它的本質,就是利用字符串之間的公共前綴,將重複的前綴合並在一塊兒。數據結構

如如下6個字符串:how、hi、her、hello、so、seeui

其中,根節點不包含任何信息。每一個節點表示一個字符串中的字符,從根節點到紅色節點(不必定都是葉子節點)的一條路徑表示一個字符串。this

Trie樹的構造過程:構造的每一步,都至關於往Trie樹中插入一個字符串。當全部字符串都插入完成後,Trie樹就構造好了。搜索引擎

代碼實現

public class Trie {
  private TrieNode root = new TrieNode('/'); // 存儲無心義字符

  // 往 Trie 樹中插入一個字符串
  public void insert(char[] text) {
    TrieNode p = root;
    for (int i = 0; i < text.length; ++i) {
      int index = text[i] - 'a';
      if (p.children[index] == null) {
        TrieNode newNode = new TrieNode(text[i]);
        p.children[index] = newNode;
      }
      p = p.children[index];
    }
    p.isEndingChar = true;
  }

  // 在 Trie 樹中查找一個字符串
  public boolean find(char[] pattern) {
    TrieNode p = root;
    for (int i = 0; i < pattern.length; ++i) {
      int index = pattern[i] - 'a';
      if (p.children[index] == null) {
        return false; // 不存在 pattern
      }
      p = p.children[index];
    }
    if (p.isEndingChar == false) return false; // 不能徹底匹配,只是前綴
    else return true; // 找到 pattern
  }

  public class TrieNode {
    public char data;
    public TrieNode[] children = new TrieNode[26];
    public boolean isEndingChar = false;
    public TrieNode(char data) {
      this.data = data;
    }
  }
}
複製代碼

時間複雜度

插入時間複雜度O(n)(n表示全部字符串的長度和)。spa

查找時間複雜度O(k)(k表示要查找的字符串的長度)。3d

以上的數據結構形成空間複雜度很大。code

相關文章
相關標籤/搜索