这个算法有多复杂?
What's the complexity of this algorithm?
这是一个算法,计算一个字符串(search_word)在另一个字符串(文本)中的字谜的出现次数:
#include<iostream>
#include<algorithm>
#include<string>
#include<deque>
using namespace std;
int main()
{
string text = "forxxorfxdofr";
string search_word = "for";
deque<char> word;
word.insert(word.begin(), text.begin(), text.begin() + search_word.size());
int ana_cnt = 0;
for (int ix = 3; ix <= text.size(); ++ix)
{
deque<char> temp = word;
sort(word.begin(), word.end());
if (string(word.begin(), word.end()) == search_word)
++ana_cnt;
word = temp;
word.pop_front();
word.push_back(text[ix]);
}
cout << ana_cnt << endl;
}
这个算法有多复杂?
我认为这是O(n)
算法,其中n
是文本的长度。这是因为执行 for 循环内部内容所需的时间与 n
的长度无关。但是,有些人认为这不是O(n)
.他们说,排序算法在计算复杂性时也很重要。
如果您只将长度为n
的字符串text
视为输入,则O(n)
。
证明:你正在循环ix
从3
(可能是search_word.size()
,不是吗?)到text.size()
,所以渐近地执行循环体n
次(因为循环体中没有break
、continue
或修改ix
)。
环体独立于n
。它对固定大小的队列进行排序,即 m
= search_word.size()
,在平均情况下(最坏情况O(m^2)
)是O(m log(m))
的。由于这与n
无关,因此我们总共完成了O(n)
。
O(n)
:如果你想更精确一点,你可能会将长度m
的search_word
算作输入,这平均总共O(n m log(m))
,O(n m^2)
最坏的情况下。
相关文章:
- 如何为指向复杂值的迭代器专门化算法?
- 为什么一种算法在相同的时间复杂度下比另一种算法更快?
- 如何在复杂的算法中处理goto函数?
- 如何降低 c++ 中算法的时间复杂度?
- 这个算法的运行时间复杂度是多少?你是如何分析的
- 如何证明以下算法具有 O(nlogn) 时间复杂度
- 三和算法的时间复杂度是多少
- 关于算法的时间复杂度
- 从QTcpSocket上的数据流中连续运行复杂算法的最佳Qt线程解决方案是什么
- 迭代算法的时间复杂度
- 气泡排序算法的空间复杂度.
- 阵列调试不正确的输出,复杂算法
- 最短路径的dijkstra算法的时间复杂度是否取决于所使用的数据结构?
- 这个算法的时间复杂度是多少
- 下面代码的算法复杂度是多少
- malloc()/free()/new/delete/delete[] 的算法复杂度是多少?
- 俄罗斯农民乘法算法的时间复杂度.
- 从字符串中提取数字/数字范围的复杂算法
- 用Ruby on Rails实现复杂算法
- 如何从复杂算法中提取活动代码路径