我需要计算一些表达式(单词串,可以是任意长度和任意数量的单词)出现在大文本输入中的次数。可能有数十万个这些表达式(以及更多),它们都预先保存在数据库中。
实现这一目标的有效方法是什么?我更喜欢将它实现为"异步"尽可能。
我目前的想法是使用尽可能多的表达式创建一个大的正则表达式作为模式(用|运算符分隔) - 然后简单地运行它并计算匹配。 还有其他选择吗?如果是这样,他们有什么优势? 也许在我可以运行的SQL级别中存在某个查询,我错过了吗?
答案 0 :(得分:0)
我认为你应该使用哈希表。与简单的哈希表相比,这种情况的正则表达式将是麻烦且计算上昂贵的。哈希表是一个保存键值对的关联数组。您可以将一个键(在您的示例中为一个字符串)与一个数字(它接下来在输入中出现的次数)相匹配。只需将数据库中的所有字符串作为键值放入哈希表中,其值为零。检查输入文本中的每个字符串,看它是否在哈希表中。如果是,则递增该值,如果不是,则不执行任何操作。 C ++,Java,C#,Python和大多数其他通用语言都有哈希表的实现。我用C ++编写了一个简单的程序来演示这个功能:
#include<iostream>
#include<unordered_map>
#include<string>
#include<fstream>
int main()
{
std::unordered_map<std::string, int> map;
std::ifstream matches("matches.txt");
std::ifstream input("input.txt");
std::string in;
while(matches>>in){
map[in] = 0;
}
while(input>>in){
if(map.find(in) != map.end())
++map[in];
}
for(auto i : map)
std::cout<<i.first<<" "<<i.second<<std::endl;
return 0;
}
此C ++代码创建一个哈希表(称为unordered_map)。然后它读入&#34;匹配&#34;,它代表数据库中的模式,并将它们添加到表中,初始键为零。它读取来自&#34;输入的输入&#34;流,并检查它们是否在哈希表中。如果是,则递增键值。然后程序打印表格的元素,每个元素以键值顺序出现。