詳解用Python程式實作字典樹Trie的結構技巧
字典樹(Trie)可以保存一些字串->值的對應關係。基本上,它跟 Java 的 HashMap 功能相同,都是 key-value 映射,只不過 Trie 的 key 只能是字串。
Trie 的強大之處就在於它的時間複雜度。它的插入和查詢時間複雜度都為 O(k) ,其中 k 為 key 的長度,與 Trie 中保存了多少個元素無關。 Hash 表號稱是 O(1) 的,但在計算 hash 的時候就肯定會是 O(k) ,而且還有碰撞之類的問題;Trie 的缺點是空間消耗很高。
至於Trie樹的實現,可以用數組,也可以用指針動態分配,我做題時為了方便就用了數組,靜態分配空間。
Trie樹,又稱單字找出樹或鍵樹,是一種樹狀結構,是一種哈希樹的變種。典型應用是用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:最大限度地減少無謂的字串比較,查詢效率比哈希表高。
Trie的核心思想是空間換時間。利用字串的公共前綴來降低查詢時間的開銷以達到提高效率的目的。
Trie樹中每個單字都是透過character by character方法進行存儲,相同前綴單字共用前綴節點.
可以看到,每條路徑組成一個單字.上面這顆樹存了to/tea/ ted/ten/inn這些字.
Trie樹的基本性質可以歸納為:
(1)根節點不包含字符,除根節點意外每個節點只包含一個字元。
(2)從根節點到某一個節點,路徑上經過的字元連接起來,為該節點對應的字串。
(3)每個節點的所有子節點包含的字串不相同。
性質
(1)根節點不包含字符,除根節點外的每個節點只包含一個字符。
(2)從根節點到某一個節點,路徑上經過的字元連接起來,為該節點對應的字串。
(3)每個節點的所有子節點包含的字串不相同。
基本思想(以字母樹為例):
1、插入過程
#對於一個單詞,從根開始,沿著單字的各個字母所對應的樹中的節點分支向下走,直到單字遍歷完,將最後的節點標記為紅色,表示該單字已插入Trie樹。
2、查詢過程
同樣的,從根開始按照單字的字母順序向下遍歷trie樹,一旦發現某個節點標記不存在或單字遍歷完成而最後的節點未標記為紅色,則表示該單字不存在,若最後的節點標記為紅色,表示該單字存在。
應用
(1)詞頻統計
比直接用hash節省空間
(2)搜尋提示
#輸入前綴的時候提示可以構成的字
(3)作為輔助結構
如字尾樹,AC自動機等的輔助結構
##實作
雖然Python沒有指標,但是可以用嵌套字典來實現樹結構.對於非ascii的單字,統一用unicode編碼來插入與搜尋.
#coding=utf-8 class Trie: root = {} END = '/' def add(self, word): #从根节点遍历单词,char by char,如果不存在则新增,最后加上一个单词结束标志 node = self.root for c in word: node=node.setdefault(c,{}) node[self.END] = None def find(self, word): node = self.root for c in word: if c not in node: return False node = node[c] return self.END in node

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

在使用Python的pandas庫時,如何在兩個結構不同的DataFrame之間進行整列複製是一個常見的問題。假設我們有兩個Dat...

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Uvicorn是如何持續監聽HTTP請求的? Uvicorn是一個基於ASGI的輕量級Web服務器,其核心功能之一便是監聽HTTP請求並進�...

在Python中,如何通過字符串動態創建對象並調用其方法?這是一個常見的編程需求,尤其在需要根據配置或運行...

本文討論了諸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和請求等流行的Python庫,並詳細介紹了它們在科學計算,數據分析,可視化,機器學習,網絡開發和H中的用途
