轉(zhuǎn)載請(qǐng)注明出處:http://www.cnblogs.com/kirai/ 作者:Kirai
零.問(wèn)題的提出
最近希望在分布式平臺(tái)上實(shí)現(xiàn)一個(gè)AC自動(dòng)機(jī),但是如何在這樣的分布式平臺(tái)上表示這樣的非線性數(shù)據(jù)結(jié)構(gòu)就難住我了。因?yàn)橐恢痹谑褂肦DD提供的一些基本的操作,沒(méi)有需要什么復(fù)雜的操作。所以突然想到了在分布式的平臺(tái)上實(shí)現(xiàn)一個(gè)AC自動(dòng)機(jī)一定很有趣。網(wǎng)上搜了下,發(fā)現(xiàn)沒(méi)有人實(shí)現(xiàn),因此決定嘗試實(shí)現(xiàn)?;蛟S就是一個(gè)玩具,不過(guò)也是能幫助自己更深理解分布式平臺(tái)上進(jìn)行編程和普通編程的區(qū)別吧。
這個(gè)問(wèn)題對(duì)我來(lái)講還是有一定的難度的,加上課業(yè)、復(fù)習(xí)考研、競(jìng)賽三重壓力,對(duì)于這個(gè)問(wèn)題的研究時(shí)間可能會(huì)比較長(zhǎng),不過(guò)一定會(huì)抽出時(shí)間來(lái)考慮的。
文章僅僅是在記錄自己對(duì)問(wèn)題的思考過(guò)程和代碼,并不能保證每一步都是合理、有用、正確的。
一.實(shí)現(xiàn)可持久化字典樹(shù)
AC自動(dòng)機(jī)是個(gè)什么東西就不贅述了,我首先用python實(shí)現(xiàn)了一個(gè)比較樸素的版本,這里查詢(xún)是返回所有字典中出現(xiàn)的單詞的起始位置,每一個(gè)單詞一個(gè)list,最終組成一個(gè)dict。哈哈,也許有人看出來(lái)了這是去年的一道ICPC網(wǎng)賽題,沒(méi)錯(cuò)。但是我忘記是哪一道了,只記得當(dāng)時(shí)沒(méi)做出來(lái),所以用python寫(xiě)一個(gè)就當(dāng)是對(duì)自己的一個(gè)補(bǔ)償吧:)
1 # -*- coding: utf-8 -*- 2 class Node: 3 """ 4 A Trie's basic data structure. 5 """ 6 def __init__(self): 7 self.next_letter = {} 8 self.is_word = False 9 self.letter = '' 10 self.depth = -1 11 self.pre = None 12 self.fail = None 13 14 15 class Trie: 16 def __init__(self): 17 self.root = Node() 18 19 20 def insert(self, word): 21 """