国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

大展身手的字典樹

Anchorer / 1778人閱讀

摘要:原文地址在簡單字典樹的實現一文中,我們以單詞輸入自動提示為引子,簡單介紹了字典樹的實現。前綴匹配本文講述前綴匹配的字典樹實現方案。在簡單字典樹的實現一文中,我們已經實現了字典樹的基本操作,這里只需要再加上一個前綴匹配方法即可。

原文地址

在簡單字典樹(Trie)的實現一文中,我們以單詞輸入自動提示為引子,簡單介紹了字典樹的實現。那么,字典樹到底可以用于哪些場合呢?

前綴匹配:給定字典庫,輸入一段字符,返回以該字符串為前綴的所有單詞。

字頻統計:給出一段文本,統計其中指定單詞出現的頻數。

前綴匹配

本文講述前綴匹配的字典樹實現方案。仍然假設我們有以下單詞:apps apple cook cookie cold,當我們想獲得以co為前綴的單詞時,只需要在字典樹中依次找到c、o節點,然后搜索o節點的所有子樹,取出其中的單詞即可。

在簡單字典樹(Trie)的實現一文中,我們已經實現了字典樹的基本操作,這里只需要再加上一個前綴匹配方法即可。具體流程如下,將前綴字符串標記為當前前綴,將根節點標記為當前節點,執行操作1:

當前前綴為空,對當前節點執行操作2。否則,取出當前單詞的首字符,標記為X,遍歷當前節點的子節點,如果X存在于子節點N中,將N標記為當前節點,將剩余字符串標記為當前單詞,重復操作1;如果X不存在于子節點中,返回None。

以當前節點為根節點,進行深度優先搜索,取得當前節點所有子樹下的所有單詞。

實現的偽代碼如下:

def pre_match_op(current_word, current_node):
    if current_word not empty:
        X = current_word[0]
        if X in current_node.child_node:
            current_word = current_word[1:]
            current_node = child_node
            return pre_match_op(current_word, current_node)
        else:
            return None
    else:
        return pre_match_bfs("", current_node)
        
def pre_match_dfs(keep_char, current_node):
    match_word = []
    for child in current_node.child_node:
        current_pre = pre_str + keep_char
        if child.isword = True:
            word = current_pre + child.char
            match_word.append(word)
        else:
            pass

        pre_match_dfs(current_pre, child)

    return match_word

具體程序以及測試例子放在gist上,可以在這里找到。測試了一下,兩千多個單詞,尋找共同前綴的單詞,速度還是蠻快的。

字頻統計

有時候我們需要統計一篇文章中一些單詞出現的次數,這個時候用字典樹可以很方便的解決這個問題。

在字典樹的簡單實現中,我們設計的節點數據結構如下:


圖1. 用list實現字典樹

只要對這里節點的數據結構稍作修改,就可以用于統計字頻了。把原來數據結構中的標記位改為頻數位,即保存該單詞出現的次數。然后,再把原有字典樹實現中的插入操作和查找操作稍微改動,就可以實現字頻統計功能了。

插入操作:將單詞標記為當前單詞,將根節點標記為當前節點,執行操作1:

當前單詞為空,當前節點單詞出現頻數加1,終止操作;否則取出當前單詞的首字符記為X,遍歷當前節點的子節點:如果X存在于子節點N,將剩余字符標記為當前單詞,將N標記為當前節點,重復操作1,如果X不存在于當前節點的子節點中,那么進入操作2。

取出當前單詞的首字符記為X,新建一個節點M存儲X,M的父節點為當前節點。剩余字符串記為當前單詞,如果當前單詞為空,M節點單詞出現頻數加1,終止操作;否則,將M標記為當前節點,重復操作2。

查詢操作:將單詞標記為當前單詞,將根節點標記為當前節點,執行操作1:

當前單詞為空,返回當前節點字頻數,即為該單詞出現的次數。否則,取出當前單詞的首字符,標記為X,遍歷當前節點的子節點,如果X存在于子節點N中,將N標記為當前節點,將剩余字符串標記為當前單詞,重復操作1;如果X不存在于子節點中,返回0。

實現偽代碼如下,插入操作如下:

def insert(word):
    current_word = word
    current_node = root
    insert_operation_1(current_word, current_node)

def insert_operation_1(current_word, current_node):
    if current_word not empty:
        X = current_word[0]

        if X in current_node.child:
            current_word = current_word[1:]
            current_node = child_node
            insert_operation_1(current_word, current_node)
        else:
            insert_operation_2(current_word, current_node)

    else:
        current_node.count++

def insert_operation_2(current_word, current_node):
    X = current_word[0]
    M.value = x
    M.father = current_node
    current_node.child = M

    current_word = current_word[1:]
    if current_word not empty:
        current_node = M
        insert_operation_2(current_word, current_node)

    else:
        current_node.count++

查詢操作:

def count(word):
    current_word = word
    current_node = root
    return find_opration(current_word, current_node)

def count_opration(current_word, current_node):
    if current_word not empty:
        X = current_word[0]
        if X in current_node.child_node:
            current_word = current_word[1:]
            current_node = child_node
            return find_opration(current_word, current_node)
        else:
            return 0
    else:
        return current_node.count

具體程序以及測試例子放在gist上,可以在這里找到。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37340.html

相關文章

  • 簡單字典實現

    摘要:查找操作查詢指定單詞是否在字典樹中。將單詞標記為當前單詞,將根節點標記為當前節點,執行操作當前單詞為空,那么返回,即字典樹中存在該單詞。字典樹的簡單實現插入操作查找操作刪除操作具體實現放在上,可以在這里找到。 原文地址 字典樹介紹 我們經常會在網上輸入一些單詞,一般情況下,當我們輸入幾個字母時,輸入框中會自動彈出以這些字母開頭的單詞供我們選擇,用戶體驗非常好。 不過這種自動提示功能到底...

    MonoLog 評論0 收藏0
  • Trie php 實現敏感詞過濾

    摘要:在樹中,每個節點表示一個狀態,每條邊表示一個字符,從根節點到葉子節點經過的邊即表示一個詞條。查找一個詞條最多耗費的時間只受詞條長度影響,因此的查找性能是很高的,跟哈希算法的性能相當。 Last-Modified: 2019年5月10日15:25:35 參考文章 c++ 使用map實現Trie樹 關鍵詞過濾擴展,用于檢查一段文本中是否出現敏感詞,基于Double-Array Trie...

    王笑朝 評論0 收藏0
  • 一種字典結構高效實現

    摘要:另一種高效實現下面介紹另一種實現,它將字典樹用數組存儲起來,不僅壓縮了數組,而且不降低查找效率。這就是雙數組字典樹。 字典樹的心得體會 常見的字典樹實現方法 class Node{ uint node ; uint[] next; }; 或者類似如下結構 class Node{ uint node; map n...

    kycool 評論0 收藏0
  • 字典實現和介紹

    摘要:優化老代碼的時候,用到了字典樹。我用寫了一個字典樹。因為是多叉樹結構,可能這兩個單詞,,需要一個結束的標識位。但是應該有相關的文本搜索算法和字典樹相結合。如果字典樹更新不頻繁,比如地名,字典樹是可以化,保存到中。 優化老代碼的時候,用到了字典樹。我用Java寫了一個字典樹。分享一下。 先說一下常見的引用場景,單詞匹配,統計(敏感詞檢測,單詞檢測),還有輸入提示等等。 下面是代碼了nod...

    cheukyin 評論0 收藏0

發表評論

0條評論

Anchorer

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<