按子词搜索字符串

Tod*_*XxX 8 algorithm search

什么样的算法+数据结构可以帮助我做到这一点?

使文件包含在有序集中的内存中加载10000~行的行.使用给定的搜索字符串,我希望能够获得所有具有搜索字符串中找到的单词前缀的单词的行.那么让我举一个例子来澄清这个:

行:

  1. "眉毛狐狸飞了."
  2. "盒子里装满了食物."
  3. "猫跑得慢"
  4. "狗讨厌老鹰"
  5. "海豚有眼睛和teath"

案例1:

search string ="fl b a"

"眉毛狐狸飞了."

  • 说明:搜索字符串有三个单词"fl","b"和"a",唯一的字符串中有一些以搜索字符串中的单词为前缀的单词是第1行.

案例2:

搜索字符串"e do ha"

"狗讨厌鹰","海豚有眼睛和teath"

(对我来说足够快,花了大约30ms~(包括对最终结果进行排序)在我的电脑上一组10k行每行3个字)

  • 我在回答中使用了trie.
  • 还有一些其他hacky方法可以过滤掉重复和误报结果(主要是为此使用哈希集).

And*_*nes 4

我想你可能想要的是一个trie。为文档中所有单词的集合构造一个,并让每个叶子指向一个哈希集,该哈希集包含叶子键出现的行的索引。

要执行搜索,您将使用搜索字符串的每个片段导航到树中的一个节点,并对该节点的子树中所有叶子的哈希集进行并集。然后,您将这些并集与片段集相交,以获得满足搜索字符串的行列表。

  • 修改你的方法来处理“aa a”情况并不困难。当您创建包含以特定前缀开头的单词的行列表时,请包含一个计数,以表明该行包含多少个匹配单词。因此,您的中间结构不仅仅是行号,而是行号加上每个前缀出现次数的计数。因此,在“aaa”情况下,您只需搜索 trie 一次,然后过滤掉那些计数不为 3 的行。 (3认同)
  • (初步想法)按字母顺序对输入片段和 trie 数据进行排序,并在每个匹配的子字符串上,沿着 trie 向下走,直到匹配下一个片段或遇到分支末尾。 (2认同)