【发布时间】:2013-03-01 06:55:07
【问题描述】:
我有点震惊,为什么 C++ STL 字符串查找子字符串的 find 方法比简单的 O(n) 传递字符串要快。这里有两个不同的功能:
为什么在str2 中找到str1 的第二个函数比第一个函数快(优化得很好)?
我知道第一个函数的任务略有不同,但它仍然只是通过str1 和str2 (O(n)),而第二个函数可能需要O(n^2) 才能在str2 中找到str1。
真的为什么?你们有什么想法吗?提前谢谢你。
P.S 这些功能是更大项目的一部分。它们在我的代码中被调用了很多次来比较两个字符串。如果我使用第二个函数,整个代码的运行时间几乎是一半(135 秒 VS 235 秒)!
bool Is_Included1(string str1, string str2)
{
size_t i,s;
s=str1.size();
if (s<=str2.size())
{
for (i=0;i<s;i++)
if (str1[i]!=str2[i])
return false;
return true;
}
return false;
}
bool Is_Included2(string str1, string str2)
{
size_t i;
if (str1.size()<=str2.size())
{
i=str2.find(str1);
if (i==0)
return true;
else
return false;
}
return false;
}
【问题讨论】:
-
“我知道第一个函数的任务稍有不同” ok....
-
第一个函数做了一个非常不同的事情。这在任何方面都不适合“轻微”......第一个只是检查第一个字符串是否是第二个字符串的前缀......
-
我知道它不一样,但是为什么当我使用第一个时,它会变慢。这是我的问题。
-
我在测试后确认 STL 是否比手工制作的快,不知何故,大量使用的库比自制代码快是更正常的。答案肯定在 STL 代码中......
-
fr.wikipedia.org/wiki/… (fr) Boyer Moore 算法的例子是 O(n+m) 而不是 O(n.m) ...
标签: c++ performance stl