Trie樹:從基礎到實現的全面詳解

一、什麼是Trie樹

Trie樹,也稱為前綴樹,是一種高效的字符串存儲、查找數據結構。它的核心思想是把字符串分成一個一個單元,用樹形結構進行存儲。

這種數據結構的最大特點是可以快速地進行前綴匹配,所以常用於大規模字符串的查找、分類、排序等操作。

Trie樹的名字來源於retrieval,意為“檢索”、“找回”。Trie樹的最初設計是由Edward Fredkin在1960年代提出的。

二、Trie樹的基本概念

對於每個字符串,我們可以把它看成一個由若干個字符組成的序列,例如”hello”可以看成”{‘h’, ‘e’, ‘l’, ‘l’, ‘o’}”。

在Trie樹中,每個節點都對應一段字符串,節點的子節點代表了可能的下一步字符。對於每個節點,它的所有子節點代表的字符集合是互不重疊的,也就是說,從根節點到某個節點的路徑表示的字符串必須是唯一的。

三、如何構建Trie樹

首先我們需要在根節點處建立一個空的Trie樹。然後,我們依次把所有的字符串插入到Trie樹中。

插入一個字符串的方法如下:

  1. 從根節點開始,看第一個字符是否已經存在於Trie樹中。
  2. 如果存在,就跳到這個字符對應的子節點,繼續判斷下一個字符。
  3. 如果不存在,則新建一個節點作為當前節點的子節點,表示添加一個新的字符。
  4. 按照上述方法,一直添加到字符串的最後一個字符為止。
  5. 在字符串的最後一個節點打上一個標誌,表示這是一個字符串的結尾。

下面是Trie樹基本代碼實現:

class TrieNode(object):
    def __init__(self):
        self.children = {}
        self.is_end = False
 
class Trie(object):
    def __init__(self):
        self.root = TrieNode()
 
    def insert(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.is_end = True
 
    def search(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                return False
            node = node.children[char]
        return node.is_end
 
    def starts_with(self, prefix):
        node = self.root
        for char in prefix:
            if char not in node.children:
                return False
            node = node.children[char]
        return True

四、Trie樹的應用

1. 自動補全

利用Trie樹可以實現字符自動補全功能。具體實現方法是,從Trie樹的根節點開始,根據用戶輸入的前綴搜索Trie樹,找到以該前綴為前綴的字符串,將其推薦給用戶。

Trie樹可以實現快速的字符串的前綴查找,因此它比較適合用於實現自動補全功能。下面是基於Trie樹的自動補全代碼實現:

class TrieNode(object):
    def __init__(self):
        self.children = {}
        self.is_end = False
        self.word = None
 
class Trie(object):
    def __init__(self):
        self.root = TrieNode()
 
    def insert(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.is_end = True
        node.word = word
  
    def search(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                return False
            node = node.children[char]
        return node.is_end
 
    def starts_with(self, prefix):
        node = self.root
        for char in prefix:
            if char not in node.children:
                return None
            node = node.children[char]
        return node
      
    def dfs(self, node, words):
        if node:
            if node.is_end:
                words.append(node.word)
            for child in node.children.values():
                self.dfs(child, words)
                 
    def query(self, x):
        node = self.starts_with(x)
        words = []
        self.dfs(node, words)
        return words

2. 字符串排序

利用Trie樹可以實現字符串的快速排序功能。由於Trie樹存儲的是整個字符串集合,因此,對Trie樹進行前序遍歷,輸出每一個字符串即可得到一個有序字符串序列。即對Trie樹的DFS序遍歷結果進行排序。

下面是基於Trie樹實現字符串排序代碼:

class TrieNode(object):
    def __init__(self):
        self.children = {}
        self.is_end = False
 
class Trie(object):
    def __init__(self):
        self.root = TrieNode()
 
    def insert(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.is_end = True
 
    def dfs(self, node, word, res):
        if node.is_end:
            res.append(word)
        for char in node.children:
            self.dfs(node.children[char], word+char, res)
 
    def sort_words(self, words):
        trie = Trie()
        for word in words:
            trie.insert(word)
        res = []
        trie.dfs(trie.root, "", res)
        return res

3. 統計詞頻

由於Trie樹的每個節點代表一個字符串,因此可以通過記錄每個節點是否為字符串結尾來統計字符串出現的次數。具體實現方法是,在Trie樹的每個節點處設置一個計數器freq,每次遇到一個字符串結尾節點,就將對應的freq計數器加1。

下面是基於Trie樹實現統計詞頻的代碼:

class TrieNode(object):
    def __init__(self):
        self.children = {}
        self.is_end = False
        self.freq = 0
 
class Trie(object):
    def __init__(self):
        self.root = TrieNode()
 
    def insert(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.is_end = True
        node.freq += 1
 
    def search(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                return False
            node = node.children[char]
        return node.is_end
 
    def starts_with(self, prefix):
        node = self.root
        for char in prefix:
            if char not in node.children:
                return None
            node = node.children[char]
        return node
 
    def count_words(self, word):
        node = self.starts_with(word)
        if not node:
            return 0
        return node.freq

五、Trie樹的時間複雜度

Trie樹的時間複雜度與插入字符串的長度有關。將一個長度為L的字符串插入到Trie樹中,需要O(L)的時間。對於在Trie樹中搜索一個字符串或者進行前綴搜索,時間複雜度也與字符串長度有關,也是O(L)。

因此,Trie樹在處理字符串存儲和搜索方面非常高效。

六、總結

本文從Trie樹的基本概念、構建方法、應用場景以及時間複雜度方面進行了詳細的講解,並且給出了用Python實現的Trie樹代碼。除此之外,Trie樹還可以用於詞頻統計、字符串去重、最長公共前綴等問題。

有了Trie樹這種高效的數據結構,我們就可以更加方便地處理大規模的字符串問題。

原創文章,作者:UVEKI,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/371928.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
UVEKI的頭像UVEKI
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相關推薦

  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • Python zscore函數全面解析

    本文將介紹什麼是zscore函數,它在數據分析中的作用以及如何使用Python實現zscore函數,為讀者提供全面的指導。 一、zscore函數的概念 zscore函數是一種用於標…

    編程 2025-04-29
  • 樹莓派DIY無人機一:製作基礎

    本文將介紹如何使用樹莓派製作一個可飛行的小型無人機。本文將介紹樹莓派的選型、比例積木的使用、無線電通信以及如何控制飛行器的基本運動。 一、樹莓派的選型 在DIY無人機中,樹莓派是必…

    編程 2025-04-29
  • Python零基礎PDF下載

    本文將為大家介紹如何使用Python下載PDF文件,適合初學者上手實踐。 一、安裝必要的庫 在Python中,我們需要使用urllib和requests庫來獲取PDF文件的鏈接,並…

    編程 2025-04-29
  • Polyphone音頻編輯器基礎入門教程

    Polyphone是一款免費的音頻編輯器,可用於編輯.sf2和.sfz格式的音色庫。本文將詳細介紹Polyphone的基礎操作及使用方法。 一、安裝和簡介 首先,我們需要下載並安裝…

    編程 2025-04-29
  • 全面解讀數據屬性r/w

    數據屬性r/w是指數據屬性的可讀/可寫性,它在程序設計中扮演着非常重要的角色。下面我們從多個方面對數據屬性r/w進行詳細的闡述。 一、r/w的概念 數據屬性r/w即指數據屬性的可讀…

    編程 2025-04-29
  • Python計算機程序代碼全面介紹

    本文將從多個方面對Python計算機程序代碼進行詳細介紹,包括基礎語法、數據類型、控制語句、函數、模塊及面向對象編程等。 一、基礎語法 Python是一種解釋型、面向對象、動態數據…

    編程 2025-04-29
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28

發表回復

登錄後才能評論