2015-04-28 65 views
0

我有一個單詞詞典,我想做一個搜索算法來確定給定的字符串(長度至少3,最大10)是否存在於字典中。如何使用ByteArray訪問一百萬片樹葉的圖樹?

我想要做的是一棵樹,每個級別都是來自被測試單詞的連續字母。如果我爲下一封信得到一個孩子而沒有,那麼這個單詞就不存在了。

例如,對於單詞「雜草」,根是w,是否有孩子「e」?是?那有一個孩子「e」嗎?是?那個孩子有「d」嗎?沒有? Word不存在。是? Word存在。

問題在於字典的龐大。從文本文件構建巨大的樹需要花費很多時間,我的應用程序凍結並需要太多時間(大約8,取決於個人電腦),並可能觸發瀏覽器「swf停止響應,停止它?」

我想要的是在AIR中預先構建樹,然後將其保存爲二進制文件。最後一步是以某種方式提取預先構建的樹。不使用readObject,因爲它構建了巨大的樹我想以某種方式將bytearrary轉換爲Object並從內存中訪問它,但我不知道如何開始這樣做。

+1

這並不回答你的問題,但如果你還沒有,我會調查現有的拼寫檢查庫如何工作,如[Adobe Squiggly](http://labs.adobe.com/technologies/squiggly/)使用[Hunspell算法](http://hunspell.sourceforge.net/)。當然,拼寫檢查器要複雜得多,因爲它們提供了建議,但它們確實解決了大字典檢查的問題。例如,Squiggly的'SpellChecker/checkWord()'。 – Aaron

+0

不會將數據放在硬盤上,並使用操作系統進行搜索足夠快嗎? – moot

回答

0

預先計算所有這些對象會花費很多時間,而且更重要 - 大量的內存!

如果你要搜索一個特定的詞(「野草」,不是所有的話開始與「凌晨」) - 這是絕對的是一個簡單的Object這樣的:

var dictionary = { 
    'weed': 1, 
    'other_word': 1 
} 

所以,你的「搜索」將是:

var search:String = 'weed'; 
if (dictionary[search]) 
    trace('exists'); 
else 
    trace('does not exist'); 

現在,如果你想搜索與特定符號開頭的詞,有幾個選擇:1)可以遍歷這個數組中的屬性,並收集所有與你的搜索開始模式分成一個單獨的數組; 2)根據查詢構建一些數據結構

第一個是微不足道的,大部分時間都會完成這項工作,特別是當您不想獲取以「wee」開始的所有單詞時,只是一個固定的數字(打破循環)。 第二個類似於你的想法,但你應該優化它。將它保存爲二進制文件不會有太大幫助,我甚至認爲它會使事情惡化。這是因爲這些對象不存在於內存中,所以無論如何 - 您都需要創建它們(即使它來自BA)。

你總是可以自己做一些魔術(同樣,只有當我們說話是爲了搜索以特定文本開始的單詞;對於明確的單詞搜索 - 使用對象)。例如 - 您可以將這些單詞放在特定數組中,具體取決於第一個字母。假設這些單詞的分佈相同,這意味着您將縮短搜索大小約30次。它不需要是完美的,只要你得到預期的結果:)

祝你好運,希望看到你已經設法解決它!

0

我的第一個想法是,您可以使用WorkerByteArraysharable=true來構建數據而不掛用戶界面。這不會讓這個過程更準確,但它會使UI的行爲。

我想要的是在AIR中預先構建樹,然後將其保存爲二進制文件。 最後一步是以某種方式提取預建樹。不使用 readObject,因爲它構建了新的巨樹,我不知何故想 將bytearrary作爲Object並從內存中訪問它,但我不知道如何開始這樣做。

我不確定我是否理解您對readObject()的評論。你不能只把ByteArray投入其他東西。它只是一個原始二進制數據的API。 readObject()正是如何將AMF二進制數據解碼到內存中的AS3對象。這幾乎肯定是從二進制數據構建對象樹的最快和最有效的方法。