【发布时间】:2013-10-17 01:52:36
【问题描述】:
输入:一个字符串数组和一个字符串。
任务:查找数组中条目的任何子字符串与输入字符串匹配的所有条目。
输入数组可以以任何需要的方式进行准备或排序,并且可以构建任何需要的辅助数据结构。准备数据结构所需的时间(在理智范围内)并不重要。
目标是最大搜索速度。
你会使用什么算法而不是线性搜索?
【问题讨论】:
输入:一个字符串数组和一个字符串。
任务:查找数组中条目的任何子字符串与输入字符串匹配的所有条目。
输入数组可以以任何需要的方式进行准备或排序,并且可以构建任何需要的辅助数据结构。准备数据结构所需的时间(在理智范围内)并不重要。
目标是最大搜索速度。
你会使用什么算法而不是线性搜索?
【问题讨论】:
因为它说准备数据结构所需的时间并不重要,所以我会散列它。键是一个字符串(特别是子字符串),值是一个整数列表,对应于数组中的索引,其元素以键作为子字符串。
要构建,获取数组中的每个字符串并确定该字符串的所有可能子字符串,将每个这样的键值对插入到哈希表中。如果键已经存在,则将索引附加到列表中,而不是插入/创建新列表。
一旦你建立了这个哈希表,它就像 O(1) 根据输入字符串抓取列表并返回一样简单。
编辑:更仔细地查看问题,您似乎想要返回数组中的实际 字符串,而不是它们的索引。哈希表方法可以使用任何一种方式。
【讨论】:
您可能希望建立所有字符串后缀的索引。查看suffix trees 以了解如何做到这一点。维基百科的文章可能过于笼统,所以这里是一个改编的算法:
建筑索引
搜索
长度为 N 但只有 N 个后缀的字符串有 N²/2 个子字符串。所以基于后缀的数据结构应该比基于子字符串的内存更有效。
【讨论】: