Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 最有效的字符串搜索方法_String_Search - Fatal编程技术网

String 最有效的字符串搜索方法

String 最有效的字符串搜索方法,string,search,String,Search,假设我有数百万行独特的字符串分布在数百个文本文件(“数据集”)。现在我想检查这些文本文件是否包含在另一个文本文件(“tofind”)中列出的200万个唯一字符串中的任何一个。最有效的方法是什么?一些额外的特定于应用程序的信息: 必须区分大小写 要查找的字符串将与找到的字符串完全匹配(即,它不是子字符串) “数据集”中的每个文本文件包含约700K行,容量为50MB,但有些文本文件可能有几百MB 同样,“dataset”和“tofind”中的字符串都是唯一的。索引也没用 不需要能够实时搜索(即,当

假设我有数百万行独特的字符串分布在数百个文本文件(“数据集”)。现在我想检查这些文本文件是否包含在另一个文本文件(“tofind”)中列出的200万个唯一字符串中的任何一个。最有效的方法是什么?一些额外的特定于应用程序的信息:

  • 必须区分大小写
  • 要查找的字符串将与找到的字符串完全匹配(即,它不是子字符串)
  • “数据集”中的每个文本文件包含约700K行,容量为50MB,但有些文本文件可能有几百MB
  • 同样,“dataset”和“tofind”中的字符串都是唯一的。索引也没用
  • 不需要能够实时搜索(即,当有人开始键入时)。我只想将任何匹配项输出到一个文本文件,其中包含匹配项及其所在的文件
  • 我有32GB的RAM和一个i7 3930K

我的选择包括使用简单的命令行/批处理“findstr”等,或者可能用vbscript或c#(必要时用Java或Python编写搜索程序,但我对它们不太熟悉)。对于这个特定的应用程序,什么是最有效的解决方案?

如果您有足够的内存将tofind中的所有字符串加载到内存中,那么您可以创建一组对,键是字符串的长度,值是字符串的集合。通过基于长度存储将tofind中的所有字符串加载到此结构中:5个字符的字符串将存储在以5为键的对的值中,10个字符的字符串将存储在以10为键的对的值中(您可以使用与第一个字符相同的分组样式来进一步细化此内容,但我不会在这里描述此内容,因为我希望以最简单的方式分享此想法)

然后您可以加载其他字符串并搜索它们的出现处。例如,长度为10的字符串将在密钥为10的对中进行搜索


如果数据集的大小太大,那么您可以一次加载一批字符串,然后清除结构并用下一批重新构建它。因为您不必实时执行此操作,因此它在 设计一个搜索过程。我没有仔细考虑过这一点,但它似乎是 请告诉我,您可以通过几个步骤来完成此操作:

步骤1

从数据集中删除那些您知道与任何字符串都不匹配的字符串 在tofind字符串列表中,A是实现这一点的非常有效的方法。 它的假阴性率为零,也就是说,如果bloom过滤器没有命中的话 然后所有字符串都不匹配,可以消除该字符串

然后需要验证命中Bloom过滤器的字符串,以确保您没有 得到一个误报。布鲁姆过滤器容易出现误报。但是如果你付钱 密切注意选择好的散列函数并分配足够大的过滤器 假阳性率可能很低

对于每个命中Bloom过滤器的字符串,保存该字符串和中的位置 命中的字符串。此信息传递到步骤2

步骤2

验证命中Bloom筛选器的字符串。现在需要验证所有1M tofind字符串 使用一个有效的精确字符串匹配函数。A似乎是一个很好的选择 函数。将tofind字符串加载到Trie中,然后从位置开始搜索它 由Bloom过滤器找到。此时,您将获得命中,在这种情况下 找到匹配项或未命中,在这种情况下,布鲁姆过滤器报告为假阳性

注意:此过程假设步骤1可以从中删除大量字符串 数据集。如果您希望大多数数据集字符串在tofind中包含匹配项,则
这可能不值得付出努力。

不完全清楚这是关于(低级)字符串匹配的算法,还是关于可能的数据结构,还是关于(高级)技术(例如数据库)。来自脑尖的想法(例如“为“数据集”的每个文本文件中的每个字符串计算哈希值,并在实际扫描文件之前检查“tofind”字符串的散列值是否包含在相应的散列值集中”)可能太明显或不适用,具体取决于周围基础结构施加的确切约束。。。。