快速未锚定的文本搜索数组

时间:2013-10-17 01:52:36

标签: arrays string algorithm

输入:一个字符串数组和一个字符串。

任务:查找数组中所有条目的所有条目,其中条目的任何子字符串与输入字符串匹配。

可以以任何所需的方式准备或排序输入数组,并且需要构建任何辅助数据结构。准备数据结构所需的时间(在理智范围内)并不重要。

目标是搜索的最高速度。

您使用的算法不仅仅是线性搜索吗?

2 个答案:

答案 0 :(得分:0)

因为它说准备数据结构所需的时间并不重要,所以我会哈希它。键是一个字符串(特别是一个子字符串),该值是与数组中索引相对应的整数列表,其中元素的键具有键作为子字符串。

要构建,请获取数组中的每个字符串并确定该字符串的所有可能的子字符串,将每个此类键值对插入到哈希表中。如果密钥已存在,请将索引附加到列表中,而不是插入/创建新列表。

一旦你构建了这个哈希表,它就像O(1)根据输入字符串获取列表一样容易并返回。

编辑:仔细观察这个问题,看起来你想要在数组中返回实际的字符串,而不是它们的索引。哈希表方法将以任何一种方式工作。

答案 1 :(得分:0)

您可能希望构建所有字符串后缀的索引。查看suffix trees以了解如何完成此操作。维基百科的文章可能过于笼统,所以这里是一个改编的算法:

构建索引

  • 表示数组中的每个字符串
    • 获取所有后缀(N长度为N的字符串后缀)并在有序关联容器中存储对字符串的引用(OrderedMap>(index)

<强>搜索

  • 在索引
  • 中找到搜索字词的下限
  • 从下限开始移动索引,直到索引键不会停止以搜索词为前缀
  • 您将找到的所有参考文献的总和是您的搜索结果

对于长度为N但仅有N个后缀的字符串,有N²/ 2个子串。因此,基于后缀的数据结构应该比基于子串的内存更有效。