【问题标题】:Searching substrings from a large set of strings从大量字符串中搜索子字符串
【发布时间】:2015-02-11 10:28:49
【问题描述】:

是否有一种节省空间的数据结构可以帮助回答以下问题:

假设我有一个包含大量字符串的数据库(在 百万)。如果给定的字符串是,我需要能够快速回答 数据库中这些字符串之一的子字符串。

请注意,在这种情况下,甚至不需要告诉它是哪个字符串的子字符串,只需知道它是一个的子字符串。

澄清一下,理想的情况是保持数据尽可能小,但查询速度确实是最重要的问题。最低要求是能够将查询数据结构保存在 RAM 中。

【问题讨论】:

  • Space 高效的将是存储字符串而不是其他任何东西 - 当然这不会使 搜索 高效。

标签: string search data-structures


【解决方案1】:

解决此问题的正确方法是避免使用您的 Java 应用程序来回答问题。如果你用 Java 解决问题,你的应用程序可以保证读取整个表,这是你必须在每条记录上运行的逻辑之外的。

更好的策略是使用您的数据库来回答问题。考虑以下 SQL 查询(假设您的数据库是某种 SQL 风格):

SELECT COUNT(*) FROM your_table WHERE column LIKE "%substring%"

此查询将返回“列”包含某些“子字符串”的行数。您可以从 Java 应用程序发出 JDBC 调用。作为一般规则,您应该将繁重的数据库工作留给您的 RDBMS;它就是为此而创建的。

我要给这篇 SO 帖子打个招呼,这是我回复的基础:http://www.stackoverflow.com/questions/4122193/how-to-search-for-rows-containing-a-substring

【讨论】:

  • 我没有说文本文件在 SQL 数据库中。有问题的应用程序是一个安全工具,在这里选择内部表示可以是任何有效的方法。查询是对实时数据包流中的数据进行的,因此不能选择使用具有延迟的数据库。哦,一切都是用 C++ 编写的。
【解决方案2】:

字符串是高度紧凑的结构,因此对于常规英文文本,您不太可能找到比字符串更节省空间的任何其他类型的结构。您可以使用位执行各种技巧,以使每个字符在内存中占用更少的空间(以支持其他语言为代价),但节省的空间将是线性的。

但是,如果您的字符串的变化程度非常低(重复程度非常高),那么您可以通过构建一个每个节点对应一个字母的树来节省空间。然后树中的每个节点路径形成一个可能的词,如下所示:

 [c]-+-[a]-+-[t]
           +
           +-[r]

因此,上面的树编码了以下单词:catcar。当然,这只会在您有大量大部分相似的字符串时才能节省。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-06
    • 2016-08-26
    • 1970-01-01
    • 2017-02-09
    • 2015-02-25
    • 1970-01-01
    • 2021-04-25
    相关资源
    最近更新 更多