从大量字符串中搜索子字符串

时间:2015-02-11 10:28:50

标签: string search data-structures

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

  

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

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

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

2 个答案:

答案 0 :(得分:0)

正确的方法是避免使用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

答案 1 :(得分:0)

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

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

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

因此,上面的树编码了以下单词:catcar。当然,如果你有大量相似的字符串,这只会节省成本。

相关问题