我有一个单词词典,我想制作一个搜索算法,以确定字典中是否存在给定字符串(长度至少为3,最大为10)。
我想要做的是一棵树,每个级别都是来自测试单词的连续字母。如果我试图让孩子接下一封信而没有,那么这个词就不存在了。
例如,对于单词" weed",根是w,是否有孩子" e" ?是?这是否有孩子" e" ?是?那个孩子有没有" d" ?没有? Word不存在。是? Word存在。
问题在于字典的庞大规模。从我的应用程序冻结的文本文件构建这个巨大的树需要花费很多时间,它需要太多秒(大约8,取决于PC)并且可能触发浏览器" swf停止响应,停止它? #34;
我想要的是在AIR中预构建树然后将其保存为二进制。最后一步是以某种方式提取预构建的树。不使用readObject因为用 new 构建巨树我不知何故想把bytearrary转换为Object并从内存中访问它,但我不知道如何开始这样做。
答案 0 :(得分:0)
预先计算所有这些对象会耗费大量时间,而且更重要 - 大量内存!
如果你想搜索一个特定的单词(“weed”,而不是所有以“wee”开头的单词) - 绝对单词是一个简单的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倍。只要你得到了预期的结果,它就不需要是完美的。)
祝你好运,很想知道你是如何成功的!答案 1 :(得分:0)
我的第一个想法是,您可以使用Worker
与ByteArray
sharable=true
来构建数据而不会挂起UI。这不会使过程完全更快,但它会使UI表现出来。
我想要的是在AIR中预构建树然后将其保存为二进制。 最后一步是以某种方式提取预构建的树。不使用 readObject因为用我想要的新东西构建巨树 将bytearrary转换为Object并从内存中访问它,但是我 不知道如何开始这样做。
我不确定我理解您对readObject()
的评论。您无法将ByteArray
投射到其他内容中。它只是原始二进制数据的API。 readObject()
正是您将AMF二进制数据解码为内存中AS3对象的方式。这几乎可以肯定是从二进制数据构建对象树的最快和最有效的方法。