Arrays 数组的快速无编排文本搜索

Arrays 数组的快速无编排文本搜索,arrays,string,algorithm,Arrays,String,Algorithm,输入:字符串数组和单个字符串 任务:查找数组中条目的任何子字符串与输入字符串匹配的所有条目 输入数组可以根据需要以任何方式准备或排序,并可以构建所需的任何辅助数据结构。准备数据结构所需的时间(在正常范围内)并不重要 目标是搜索的最大速度 除了线性搜索,您会使用什么算法呢?因为它说准备数据结构所需的时间不重要,所以我会对它进行哈希运算。键是一个字符串(特别是一个子字符串),值是一个整数列表,对应于数组中的索引,其元素将键作为子字符串 构建时,获取数组中的每个字符串并确定该字符串的所有可能子字符串,

输入:字符串数组和单个字符串

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

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

目标是搜索的最大速度


除了线性搜索,您会使用什么算法呢?

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

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

构建此哈希表后,只要O(1)根据输入字符串抓取列表并返回即可


编辑:仔细看这个问题,您似乎希望返回数组中的实际字符串,而不是它们的索引。哈希表方法将以任何一种方式工作。

您可能希望构建所有字符串后缀的索引。调查以了解如何做到这一点。Wikipedia的文章可能过于笼统,因此这里有一个经过调整的算法:

建筑指数

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

  • 在索引中查找搜索词的下限
  • 从下界开始移动索引,直到索引键不再以搜索词作为前缀
  • 您将找到的所有引用的总和就是您的搜索结果
长度为N的字符串有N²/2个子字符串,但只有N个后缀。因此,基于后缀的数据结构应该比基于子字符串的数据结构更有效