Actionscript 3 如何使用ByteArray访问包含100万片叶子的图形树?

Actionscript 3 如何使用ByteArray访问包含100万片叶子的图形树?,actionscript-3,flash,graph,actionscript,bytearray,Actionscript 3,Flash,Graph,Actionscript,Bytearray,我有一个单词字典,我想做一个搜索算法来确定字典中是否存在给定的字符串(长度至少为3,最大为10) 我想做的是一棵树,其中每个级别都是测试单词的一个连续字母。如果我试图为下一个字母找到一个孩子,但是没有,那么这个单词就不存在了 例如,单词“weed”的词根是w,是否有子单词“e”?对那有孩子“e”吗?对那有孩子“d”吗?不这个词不存在。对这个词是存在的 问题是这本词典太大了。从一个文本文件构建这棵巨大的树花费了太多的时间,以至于我的应用程序冻结了,并且花费了太多的时间(大约8秒,取决于pc),可能

我有一个单词字典,我想做一个搜索算法来确定字典中是否存在给定的字符串(长度至少为3,最大为10)

我想做的是一棵树,其中每个级别都是测试单词的一个连续字母。如果我试图为下一个字母找到一个孩子,但是没有,那么这个单词就不存在了

例如,单词“weed”的词根是w,是否有子单词“e”?对那有孩子“e”吗?对那有孩子“d”吗?不这个词不存在。对这个词是存在的

问题是这本词典太大了。从一个文本文件构建这棵巨大的树花费了太多的时间,以至于我的应用程序冻结了,并且花费了太多的时间(大约8秒,取决于pc),可能会触发浏览器“swf停止响应,停止它?”


我想要的是在空中预先构建树,然后将其保存为二进制文件。最后一步是以某种方式提取预构建的树。不使用readObject,因为这会用new构建巨树,我想将ByteArray转换为对象,并从内存中访问它,但我不知道如何开始这样做。

预先计算所有这些对象将花费大量时间,更重要的是,需要大量内存

如果要搜索特定单词(“weed”,并非所有以“wee”开头的单词)-绝对单词是一个简单的
对象
,如下所示:

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倍。它不需要是完美的,只要你得到想要的结果:)


祝你好运,我很想看看你是怎么做到的

我的第一个想法是,您可以使用
Worker
ByteArray
以及
sharable=true
来构建数据,而无需挂起UI。这并不会使过程变得更快,但会使UI正常工作

我想要的是在空中预先构建树,然后将其保存为二进制文件。 最后一步是以某种方式提取预构建的树。不使用 readObject,因为它用我想要的新代码构建了一棵巨树 将ByteArray转换为对象并从内存中访问它,但我 我不知道如何开始做这件事


我不确定我是否理解您关于
readObject()
的评论。你不能把一个
ByteArray
转换成其他东西。它只是一个原始二进制数据的API。
readObject()
正是您将AMF二进制数据解码为内存中AS3对象的方式。这几乎肯定是从二进制数据构建对象树的最快、最有效的方法

这并不能回答你的问题,但如果你还没有,我会调查现有的拼写检查库是如何工作的,比如使用。当然,拼写检查器要复杂得多,因为它们提供建议,但它们确实解决了大型词典检查的问题。例如,Squiggly的
拼写检查器/checkWord()
。将数据放在硬盘上并使用操作系统进行搜索是否足够快?