假设我有一个长度为N y
的十六进制字符串y{N}y{N-1}...y{1}
。
然后给出另一个长度为L(L小于N)的十六进制字符串x
,我想检查这个字符串在y
中出现的次数(如果有的话)...比如{{1} }。
哪种在C ++中最有效的方法?...我需要一个非常有效的实现,因为我想为大型数据库运行它
答案 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
。
如果 不够快,你可以尝试对文件进行内存映射,并使用初始和最终指针作为迭代器。