我正在寻找算法,但我不知道问题的名称,所以我找不到任何东西。希望我对这个问题的解释是有道理的!
假设您有很长的短语列表,其中每个短语都是一组单词。用户输入单词列表,并且他们的列表“匹配”短语,短语中的每个单词都在其列表中找到。列表的“得分”是它匹配的短语数。目标是为用户提供最能提高其列表分数的单词列表。
这是一个简单的例子。我们有十个短语:
用户提供此列表:
我们匹配短语1和4,因此得分为2.但是如果用户将“舱”添加到他们的列表中,他们将匹配3个以上的短语并获得5分。“fire”将为得分增加2
使用简短的列表,没有任何复杂的问题,因为您几乎可以立即遍历选项。但随着列表增长到数十万,它开始花费数百毫秒。感觉应该有一种方法来构建索引以使流程更快,但我想不出索引的结构会是什么。
任何花时间阅读所有这些的人,谢谢!希望有人知道我在说什么。
答案 0 :(得分:0)
后缀树。
他们相当繁琐复杂的东西,但基本上我们为每个角色存储一个节点(26 * 2),然后我们为每个角色存储后缀,所以为th和an等条目存储,但可能是不适用于qj或其他不会发生的组合。然后你得到那些后缀(所以,thr,等等,但不允许三个字母的大量组合)。 它允许非常快速的搜索,这不是必须精确的。如果我们想匹配a * d,我们只需要跟随a的所有后缀,然后只有d后缀,那么我们坚持nul。
答案 1 :(得分:0)
您需要将单词映射到出现次数。如果您使用哈希表,您可以非常快速地完成(O(N) - N是短语中单词的数量) - 循环所有短语,将它们分成单词,如果单词已经在地图中增加了count,如果不是 - 将其添加到计数为1的地图中。
要计算输入的分数,只需循环输入单词并累计出现次数。 O(M) - 这次M是输入字的数量。
我怀疑你可以获得更好的复杂性(你需要至少扫描一次这些短语),并且通过适当的地图实现(几乎所有现代语言都可用) - 它也会很快。