【问题标题】:Searching a substring in C在 C 中搜索子字符串
【发布时间】:2020-01-01 01:11:03
【问题描述】:

假设我有一个很长的字符串,比如一个文件路径,我想在其中搜索一些东西。例如,$ find 命令之类的东西。这似乎是这样的基本实现:

if(strstr(sent, word) != NULL) {
    return 1;
}

这样做与Boyer Moore 之类的操作之间会有什么性能差异吗?还是strstr 已经做了同样有效的事情?

基本上,我有大约十亿个非常长的字符串,我希望根据最有效的子字符串实现对它们进行快速(ish)查找(无需任何索引)。我应该使用什么?


更新:举一个更具体的例子,假设我有十亿个文件路径要搜索:

/archive/1002/myfile.txt
/archive/1002/newer.mov
/user/tom/local_2014version1.mov

然后我会搜索一个或多个字符串。示例示例是:

"1002" // would return the first two fileds
"mov version tom" // would return the first row

【问题讨论】:

  • 我发现了一个可能对你有用的帖子:stackoverflow.com/questions/3183582/…
  • 十亿个很长的字符串?比如,100 GB 的数据?你肯定需要比线性搜索更好的东西......
  • @ggorlen 当然,我已经看过了——这就是我获得上述链接的地方。我的问题更多是(重新)实现 Boyer-Moore 与使用 strstr - 我需要重新执行 Boyer-Moore 还是 strstr 已经这样做了?
  • "a filepath" 不是长字符串。在 Linux 上通常少于 4096 个字符(例如 PATH_MAX 字符),在 Windows 上是 512 个字符。在这样的字符串上调用 strstr 十亿次将与其他任何事情一样有效(而且比您自己编写的东西更不容易出错)

标签: c algorithm performance boyer-moore


【解决方案1】:

Boyer-Moore 和 Aho-Corasick 等高级搜索算法通过从要搜索的字符串中预先计算查找表来工作,这会导致大量的启动时间。搜索像路径名这样小的东西不太可能弥补如此高的开销。在这些算法显示其价值之前,您确实必须搜索多页文档之类的内容。

【讨论】:

  • 是的,我只会使用 strstr()——即使考虑其他任何事情都是严重过早的优化。当您的分析数据将其显示为瓶颈时,您可以考虑更改它,我非常怀疑它永远不会。
  • 没有。 Boyer-Moore 从您正在搜索 FOR 的字符串中预先计算其查找表,而不是您正在搜索 IN 的字符串。这就是在长度为n 的字符串中搜索长度为m 的字符串可能需要时间O(n/m)。因此,您确实可以使用它。它只是无法为您提供足够的千兆字节数据进行搜索。
  • 我说的很糟糕,我会改正的。但答案是成立的。例如,BM 查找表的大小就是字符集的大小,对于 8 位字符可能是 256 字节,对于 Unicode 可能更多。即使从要搜索的小字符串构建一个大小如此之大的表也是开销,它会压倒要搜索的路径名的微小大小。
  • 除了他在搜索多个字符串,所以初始化查找表的成本是摊销的。在十亿个字符串中,构建该查找表的每次搜索成本基本上为零。
  • 啊,那么这是 Boyer-Moore 的一个很好的候选人。这根本不是我第一次阅读问题的方式。
猜你喜欢
  • 2020-09-27
  • 2020-07-27
  • 2019-10-06
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多