【问题标题】:Fast unanchored text search for an array快速非锚定文本搜索数组
【发布时间】:2013-10-17 01:52:36
【问题描述】:

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

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

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

目标是最大搜索速度。

你会使用什么算法而不是线性搜索?

【问题讨论】:

    标签: arrays string algorithm


    【解决方案1】:

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

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

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

    编辑:更仔细地查看问题,您似乎想要返回数组中的实际 字符串,而不是它们的索引。哈希表方法可以使用任何一种方式。

    【讨论】:

      【解决方案2】:

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

      建筑索引

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

      搜索

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

      长度为 N 但只有 N 个后缀的字符串有 N²/2 个子字符串。所以基于后缀的数据结构应该比基于子字符串的内存更有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多