亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解字典樹Trie結構及其Python代碼實現

 更新時間:2016年06月03日 16:48:41   作者:hackbuteer1  
Trie多被用來查找和統(tǒng)計字符串,利用公共前綴來減少搜索時間,下面我們就來詳解字典樹Trie結構及其Python代碼實現

字典樹(Trie)可以保存一些字符串->值的對應關系?;旧希?Java 的 HashMap 功能相同,都是 key-value 映射,只不過 Trie 的 key 只能是字符串。
Trie 的強大之處就在于它的時間復雜度。它的插入和查詢時間復雜度都為 O(k) ,其中 k 為 key 的長度,與 Trie 中保存了多少個元素無關。Hash 表號稱是 O(1) 的,但在計算 hash 的時候就肯定會是 O(k) ,而且還有碰撞之類的問題;Trie 的缺點是空間消耗很高。
至于Trie樹的實現,可以用數組,也可以用指針動態(tài)分配,我做題時為了方便就用了數組,靜態(tài)分配空間。
Trie樹,又稱單詞查找樹或鍵樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用于統(tǒng)計和排序大量的字符串(但不僅限于字符串),所以經常被搜索引擎系統(tǒng)用于文本詞頻統(tǒng)計。它的優(yōu)點是:最大限度地減少無謂的字符串比較,查詢效率比哈希表高。
Trie的核心思想是空間換時間。利用字符串的公共前綴來降低查詢時間的開銷以達到提高效率的目的。
Trie樹中每個單詞都是通過character by character方法進行存儲,相同前綴單詞共享前綴節(jié)點.
可以看到,每條路徑組成一個單詞.上面這顆樹存了to/tea/ted/ten/inn這些詞.

Trie樹的基本性質可以歸納為:
(1)根節(jié)點不包含字符,除根節(jié)點意外每個節(jié)點只包含一個字符。
(2)從根節(jié)點到某一個節(jié)點,路徑上經過的字符連接起來,為該節(jié)點對應的字符串。
(3)每個節(jié)點的所有子節(jié)點包含的字符串不相同。

性質
(1)根節(jié)點不包含字符,除根節(jié)點外的每個節(jié)點只包含一個字符。
(2)從根節(jié)點到某一個節(jié)點,路徑上經過的字符連接起來,為該節(jié)點對應的字符串。
(3)每個節(jié)點的所有子節(jié)點包含的字符串不相同。

基本思想(以字母樹為例):
1、插入過程
對于一個單詞,從根開始,沿著單詞的各個字母所對應的樹中的節(jié)點分支向下走,直到單詞遍歷完,將最后的節(jié)點標記為紅色,表示該單詞已插入Trie樹。
2、查詢過程
同樣的,從根開始按照單詞的字母順序向下遍歷trie樹,一旦發(fā)現某個節(jié)點標記不存在或者單詞遍歷完成而最后的節(jié)點未標記為紅色,則表示該單詞不存在,若最后的節(jié)點標記為紅色,表示該單詞存在。

應用
(1)詞頻統(tǒng)計
比直接用hash節(jié)省空間
(2)搜索提示
輸入前綴的時候提示可以構成的詞
(3)作為輔助結構
如后綴樹,AC自動機等的輔助結構

實現
雖然Python沒有指針,但是可以用嵌套字典來實現樹結構.對于非ascii的單詞,統(tǒng)一用unicode編碼來插入與搜索.

#coding=utf-8 
class Trie: 
  root = {} 
  END = '/' 
  def add(self, word): 
    #從根節(jié)點遍歷單詞,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 

相關文章

  • Python3正則匹配re.split,re.finditer及re.findall函數用法詳解

    Python3正則匹配re.split,re.finditer及re.findall函數用法詳解

    這篇文章主要介紹了Python3正則匹配re.split,re.finditer及re.findall函數用法,結合實例形式詳細分析了正則匹配re.split,re.finditer及re.findall函數的概念、參數、用法及操作注意事項,需要的朋友可以參考下
    2018-06-06
  • OpenCV物體跟蹤樹莓派視覺小車實現過程學習

    OpenCV物體跟蹤樹莓派視覺小車實現過程學習

    這篇文章主要介紹了OpenCV物體跟蹤樹莓派視覺小車的實現過程學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • python 二分查找和快速排序實例詳解

    python 二分查找和快速排序實例詳解

    本文通過實例代碼給大家詳細介紹了python 二分查找和快速排序,的相關知識,需要的朋友可以參考下
    2017-10-10
  • 利用Python實現一個簡單的Web匯率計算器

    利用Python實現一個簡單的Web匯率計算器

    Dash?是一個用于構建基于?Web?的應用程序的?Python?庫,無需?JavaScript?。本文將利用Dash編寫一個簡單的Web匯率計算器,感興趣的可以了解一下
    2022-08-08
  • python3?字符串str和bytes相互轉換

    python3?字符串str和bytes相互轉換

    這篇文章主要介紹了python3?字符串str和bytes相互轉換,在文件傳輸過程中,通常使用bytes格式的數據流,而代碼中通常用str類型,因此str和bytes的相互轉換就尤為重要,下文詳細介紹需要的小伙伴可以參考一下
    2022-03-03
  • python3.6使用SMTP協議發(fā)送郵件

    python3.6使用SMTP協議發(fā)送郵件

    這篇文章主要為大家詳細介紹了python3.6使用SMTP協議發(fā)送郵件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Python圖像處理之圖像的縮放、旋轉與翻轉實現方法示例

    Python圖像處理之圖像的縮放、旋轉與翻轉實現方法示例

    這篇文章主要介紹了Python圖像處理之圖像的縮放、旋轉與翻轉實現方法,結合實例形式分析了Python使用resize()、rotate()及transpose()等函數進行圖像的縮放、旋轉及翻轉相關操作技巧,需要的朋友可以參考下
    2019-01-01
  • Tensorflow2.10使用BERT從文本中抽取答案實現詳解

    Tensorflow2.10使用BERT從文本中抽取答案實現詳解

    這篇文章主要為大家介紹了Tensorflow2.10使用BERT從文本中抽取答案實現詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • python實現時間o(1)的最小棧的實例代碼

    python實現時間o(1)的最小棧的實例代碼

    這篇文章主要介紹了python實現時間o(1)的最小棧的實例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Python之自動獲取公網IP的實例講解

    Python之自動獲取公網IP的實例講解

    下面小編就為大家?guī)硪黄狿ython之自動獲取公網IP的實例講解。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論