摘要:原文地址在簡單字典樹的實現(xiàn)一文中,我們以單詞輸入自動提示為引子,簡單介紹了字典樹的實現(xiàn)。前綴匹配本文講述前綴匹配的字典樹實現(xiàn)方案。在簡單字典樹的實現(xiàn)一文中,我們已經(jīng)實現(xiàn)了字典樹的基本操作,這里只需要再加上一個前綴匹配方法即可。
原文地址
在簡單字典樹(Trie)的實現(xiàn)一文中,我們以單詞輸入自動提示為引子,簡單介紹了字典樹的實現(xiàn)。那么,字典樹到底可以用于哪些場合呢?
前綴匹配:給定字典庫,輸入一段字符,返回以該字符串為前綴的所有單詞。
字頻統(tǒng)計:給出一段文本,統(tǒng)計其中指定單詞出現(xiàn)的頻數(shù)。
前綴匹配本文講述前綴匹配的字典樹實現(xiàn)方案。仍然假設(shè)我們有以下單詞:apps apple cook cookie cold,當(dāng)我們想獲得以co為前綴的單詞時,只需要在字典樹中依次找到c、o節(jié)點,然后搜索o節(jié)點的所有子樹,取出其中的單詞即可。
在簡單字典樹(Trie)的實現(xiàn)一文中,我們已經(jīng)實現(xiàn)了字典樹的基本操作,這里只需要再加上一個前綴匹配方法即可。具體流程如下,將前綴字符串標(biāo)記為當(dāng)前前綴,將根節(jié)點標(biāo)記為當(dāng)前節(jié)點,執(zhí)行操作1:
當(dāng)前前綴為空,對當(dāng)前節(jié)點執(zhí)行操作2。否則,取出當(dāng)前單詞的首字符,標(biāo)記為X,遍歷當(dāng)前節(jié)點的子節(jié)點,如果X存在于子節(jié)點N中,將N標(biāo)記為當(dāng)前節(jié)點,將剩余字符串標(biāo)記為當(dāng)前單詞,重復(fù)操作1;如果X不存在于子節(jié)點中,返回None。
以當(dāng)前節(jié)點為根節(jié)點,進行深度優(yōu)先搜索,取得當(dāng)前節(jié)點所有子樹下的所有單詞。
實現(xiàn)的偽代碼如下:
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
具體程序以及測試?yán)臃旁趃ist上,可以在這里找到。測試了一下,兩千多個單詞,尋找共同前綴的單詞,速度還是蠻快的。
字頻統(tǒng)計有時候我們需要統(tǒng)計一篇文章中一些單詞出現(xiàn)的次數(shù),這個時候用字典樹可以很方便的解決這個問題。
在字典樹的簡單實現(xiàn)中,我們設(shè)計的節(jié)點數(shù)據(jù)結(jié)構(gòu)如下:
圖1. 用list實現(xiàn)字典樹
只要對這里節(jié)點的數(shù)據(jù)結(jié)構(gòu)稍作修改,就可以用于統(tǒng)計字頻了。把原來數(shù)據(jù)結(jié)構(gòu)中的標(biāo)記位改為頻數(shù)位,即保存該單詞出現(xiàn)的次數(shù)。然后,再把原有字典樹實現(xiàn)中的插入操作和查找操作稍微改動,就可以實現(xiàn)字頻統(tǒng)計功能了。
插入操作:將單詞標(biāo)記為當(dāng)前單詞,將根節(jié)點標(biāo)記為當(dāng)前節(jié)點,執(zhí)行操作1:
當(dāng)前單詞為空,當(dāng)前節(jié)點單詞出現(xiàn)頻數(shù)加1,終止操作;否則取出當(dāng)前單詞的首字符記為X,遍歷當(dāng)前節(jié)點的子節(jié)點:如果X存在于子節(jié)點N,將剩余字符標(biāo)記為當(dāng)前單詞,將N標(biāo)記為當(dāng)前節(jié)點,重復(fù)操作1,如果X不存在于當(dāng)前節(jié)點的子節(jié)點中,那么進入操作2。
取出當(dāng)前單詞的首字符記為X,新建一個節(jié)點M存儲X,M的父節(jié)點為當(dāng)前節(jié)點。剩余字符串記為當(dāng)前單詞,如果當(dāng)前單詞為空,M節(jié)點單詞出現(xiàn)頻數(shù)加1,終止操作;否則,將M標(biāo)記為當(dāng)前節(jié)點,重復(fù)操作2。
查詢操作:將單詞標(biāo)記為當(dāng)前單詞,將根節(jié)點標(biāo)記為當(dāng)前節(jié)點,執(zhí)行操作1:
當(dāng)前單詞為空,返回當(dāng)前節(jié)點字頻數(shù),即為該單詞出現(xiàn)的次數(shù)。否則,取出當(dāng)前單詞的首字符,標(biāo)記為X,遍歷當(dāng)前節(jié)點的子節(jié)點,如果X存在于子節(jié)點N中,將N標(biāo)記為當(dāng)前節(jié)點,將剩余字符串標(biāo)記為當(dāng)前單詞,重復(fù)操作1;如果X不存在于子節(jié)點中,返回0。
實現(xiàn)偽代碼如下,插入操作如下:
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
具體程序以及測試?yán)臃旁趃ist上,可以在這里找到。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://hztianpu.com/yun/37340.html
摘要:查找操作查詢指定單詞是否在字典樹中。將單詞標(biāo)記為當(dāng)前單詞,將根節(jié)點標(biāo)記為當(dāng)前節(jié)點,執(zhí)行操作當(dāng)前單詞為空,那么返回,即字典樹中存在該單詞。字典樹的簡單實現(xiàn)插入操作查找操作刪除操作具體實現(xiàn)放在上,可以在這里找到。 原文地址 字典樹介紹 我們經(jīng)常會在網(wǎng)上輸入一些單詞,一般情況下,當(dāng)我們輸入幾個字母時,輸入框中會自動彈出以這些字母開頭的單詞供我們選擇,用戶體驗非常好。 不過這種自動提示功能到底...
摘要:在樹中,每個節(jié)點表示一個狀態(tài),每條邊表示一個字符,從根節(jié)點到葉子節(jié)點經(jīng)過的邊即表示一個詞條。查找一個詞條最多耗費的時間只受詞條長度影響,因此的查找性能是很高的,跟哈希算法的性能相當(dāng)。 Last-Modified: 2019年5月10日15:25:35 參考文章 c++ 使用map實現(xiàn)Trie樹 關(guān)鍵詞過濾擴展,用于檢查一段文本中是否出現(xiàn)敏感詞,基于Double-Array Trie...
摘要:另一種高效實現(xiàn)下面介紹另一種實現(xiàn),它將字典樹用數(shù)組存儲起來,不僅壓縮了數(shù)組,而且不降低查找效率。這就是雙數(shù)組字典樹。 字典樹的心得體會 常見的字典樹實現(xiàn)方法 class Node{ uint node ; uint[] next; }; 或者類似如下結(jié)構(gòu) class Node{ uint node; map n...
摘要:優(yōu)化老代碼的時候,用到了字典樹。我用寫了一個字典樹。因為是多叉樹結(jié)構(gòu),可能這兩個單詞,,需要一個結(jié)束的標(biāo)識位。但是應(yīng)該有相關(guān)的文本搜索算法和字典樹相結(jié)合。如果字典樹更新不頻繁,比如地名,字典樹是可以化,保存到中。 優(yōu)化老代碼的時候,用到了字典樹。我用Java寫了一個字典樹。分享一下。 先說一下常見的引用場景,單詞匹配,統(tǒng)計(敏感詞檢測,單詞檢測),還有輸入提示等等。 下面是代碼了nod...
閱讀 1768·2019-08-30 12:51
閱讀 764·2019-08-29 17:30
閱讀 3819·2019-08-29 15:17
閱讀 932·2019-08-28 18:10
閱讀 1478·2019-08-26 17:08
閱讀 2295·2019-08-26 12:16
閱讀 3628·2019-08-26 11:47
閱讀 3611·2019-08-23 16:18