如何使用 ByteArray 访问 100 万片叶子的图树?

Posted

技术标签:

【中文标题】如何使用 ByteArray 访问 100 万片叶子的图树?【英文标题】:How can I use ByteArray to access a graph tree of 1 million leaves? 【发布时间】:2015-07-07 09:20:45 【问题描述】:

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

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

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

问题在于字典的大小。从我的应用程序冻结的文本文件构建那棵巨大的树需要很长时间,并且需要太多秒(大约 8 秒,取决于 pc)并且可能会触发浏览器“swf 停止响应,停止它?”

我想要的是在 AIR 中预先构建树,然后将其保存为二进制文件。最后一步是以某种方式提取预建树。不使用 readObject 因为那会用 new 构建巨树

【问题讨论】:

这不能回答您的问题,但如果您还没有回答,我会调查现有的拼写检查库是如何工作的,例如使用 Hunspell algorithm 的 Adobe Squiggly。当然,拼写检查器要复杂得多,因为它们提供建议,但它们确实解决了大型字典检查的问题。例如,Squiggly 的SpellChecker/checkWord() 把数据放到硬盘上用操作系统搜索会不会够快? 【参考方案1】:

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

如果你想搜索一个特定的词(“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)。

您总是可以自己做一些魔术(同样,仅当我们说的是搜索以特定文本开头的单词时;对于显式单词搜索 - 使用 Object)。例如 - 您可以将单词放在特定的数组中,具体取决于第一个字母。假设单词分布均匀,这意味着您将搜索大小减少了大约 30 倍。它不需要是完美的,只要你得到想要的结果:)

祝你好运,很想看看你是如何解决这个问题的!

【讨论】:

【参考方案2】:

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

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

我不确定我是否理解您对readObject() 的评论。您不能只是将ByteArray 投射到其他东西中。它只是原始二进制数据的 API。 readObject() 正是您将 AMF 二进制数据解码为内存中的 AS3 对象的方式。这几乎可以肯定是从二进制数据构建对象树的最快和最有效的方法。

【讨论】:

以上是关于如何使用 ByteArray 访问 100 万片叶子的图树?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Actionscript 3 卸载 ByteArray?

如何将 bytearray 转换为 image 或 image 转换为 bytearray ?

中国面板再获突破,给苹果供应的面板增五成至3000万片

[转帖]台积电近10万片晶圆报废,但7nm工艺将成2019营收主力

如何将 Int 转换为 ByteArray,然后使用 Kotlin 将其转换回 Int?

如何将 protobuf 对象转换为 ByteArray 并在 Swift 中使用 Base64 URL_SAFE 进行编码?