在txt文件中查找长度为L的特定字符串的出现次数

时间:2012-09-24 11:03:52

标签: c++ string

假设我有一个长度为N y的十六进制字符串y{N}y{N-1}...y{1}。 然后给出另一个长度为L(L小于N)的十六进制字符串x,我想检查这个字符串在y中出现的次数(如果有的话)...比如{{1} }。 哪种在C ++中最有效的方法?...我需要一个非常有效的实现,因为我想为大型数据库运行它

3 个答案:

答案 0 :(得分:1)

您的请求很简单string search algorithm。 有很多算法可以做到这一点。 他们中的大多数会给你一个很好的答案O(L + N)与预处理。

您还可以使用suffix tree,它将在O(L + Z)中提供更快的答案,其中Z是y中出现的x的数量。 后缀树占用了大量的内存空间(O(N²)),可能不是这里的理想选择。

答案 1 :(得分:1)

“Hexadecimal”在这里并不意味着什么。 C ++是一种计算机语言,可以用于比特。 “十六进制”只是将4位组合在一起供人食用的便捷方式。

同样,C ++不会像y{N}y{N-1}...y{1}那样索引字符串。它将它们编入索引为y[0],y[1],y[N-1]。 (没有y[N]。)

在正常情况下,std::string::find会比你的磁盘更快,这意味着它足够快。

答案 2 :(得分:1)

  

在C ++中执行此操作的最有效方法是什么?

std::search输入文件中尝试std::istream_iterator,如下所示:

#include <string>
#include <iterator>
#include <iostream>
#include <algorithm>

int main () {
  // std::ifstream input("input.txt");
  std::istream& input(std::cin);
  std::string search_for("1234");

  std::istream_iterator<char> last;
  std::istream_iterator<char> it(input);
  int count(0);

  while((it = std::search(it, last, search_for.begin(), search_for.end())) != last) {
    count++;
  }

  std::cout << count << "\n";

}

如果速度不够快,您可以尝试std::istreambuf_iterator

如果 不够快,你可以尝试对文件进行内存映射,并使用初始和最终指针作为迭代器。