【发布时间】:2016-09-27 07:50:59
【问题描述】:
我有种子字符串列表,大约 100 个预定义字符串。所有字符串都只包含 ASCII 字符。
std::list<std::wstring> seeds{ L"google", L"yahoo", L"stackoverflow"};
我的应用不断收到大量可以包含任何字符的字符串。我需要检查每条收到的线并确定它是否包含任何种子。比较必须不区分大小写。
我需要最快的算法来测试收到的字符串。
现在我的应用使用这个算法:
std::wstring testedStr;
for (auto & seed : seeds)
{
if (boost::icontains(testedStr, seed))
{
return true;
}
}
return false;
效果很好,但我不确定这是不是最有效的方法。
如何实现算法以获得更好的性能?
这是一个 Windows 应用程序。应用接收到有效的std::wstring 字符串。
更新
对于这个任务,我实现了 Aho-Corasick 算法。如果有人可以查看我的代码,那就太好了——我对此类算法没有丰富的经验。实现链接:gist.github.com
【问题讨论】:
-
作为一个微小的改进,我建议将
std::list替换为一个数组(普通数组,std::array或std::vector)。它可能会稍微提高性能。另外,为什么你只在其中一个文字上有L前缀? -
它们包含种子还是种子?有区别
-
你试过
std::search发现不够快吗? -
种子列表是在编译时知道的,还是只在运行时才知道?
-
值得注意的是:您很可能不需要需要最快的算法。我们经常为“最快”的算法付出血和泪的代价,而“快”就足够了。 “最快”算法必须包括管理特定 CPU 上的缓存、不同操作码的运行速度等内容,并根据您正在查看的特定单词集以及单词出现的相对概率进行定制。这些细节很痛苦。使用下面的“快速”算法 =)
标签: c++ string windows algorithm