【发布时间】:2011-12-15 09:31:45
【问题描述】:
我开始收集C 的目标集。每个集合都包含单词(或不带空格的字符串)。当我遍历句子时,我可以将句子视为一组观察到的单词D。我的问题是,对于每个句子,我想在C 中找到所有集合S,使得D 包含S。换句话说,我想在C 中找到所有单词都在句子中的单词集。
例如,考虑C的以下内容:
{fell, ate}
{cat, snail, tiger}
{tree, bush, jalepeno}
{pen, paperclip, stapler}
现在如果我看到句子“The tree fall over the bush because it ate a jalepeno.”,我想退回以下两组。
{fell, ate}
{tree, bush, jalepeno}
这似乎有点类似于 trie。但是,它只是相似的,因为我不是匹配句子中的所有单词,而是匹配任何子集。一个想法是在一个类似于 trie 的数据结构中表示集合 C,每个级别都有一个 Map[String, PseudoTrie],并在我按排序顺序遍历句子中的单词时遵循多个路径。
我知道这类似于搜索查询。但是,如果我需要遍历所有句子也没关系,只要每个句子的计算速度很快。遍历C 中的每个集合并执行包含太慢了。
更新
我认为人们可能会对我的一些结果感兴趣。这些时间是在 100000 个句子上进行的,D 中的每个目标集 C 大约有 4 或 5 个单词。
原始申请。遍历所有目标集,看看它们是否包含在句子中,其中句子由一组单词表示。 227 秒
按词汇过滤。与原始过程相同,除了句子由该句子中也在某个目标集中的单词集表示。优点是我们在进行比较时只需要考虑句子中单词的子集。 110 秒
字符串被转换为从 0 开始的整数键。这也包括必要的试验 #2 中的过滤。 86 秒
添加倒排索引。 4 秒
我还尝试了带有倒排索引的 BitSet。花了20秒,所以我没有坚持下去。我不确定为什么会变慢——我可能做错了什么。
另外,我认为我最初的想法很棒(许多层的倒排索引)但它相当复杂,而且我已经有了相当不错的加速!
【问题讨论】:
标签: algorithm scala set subset