这是一个算法计算另一个(文本)中一个字符串(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)
。他们说排序算法在计算复杂性时也很重要。
答案 0 :(得分:1)
O(n)
的字符串text
作为输入,则 n
。
证明:您正在ix
3
(可能是search_word.size()
,不是吗?)到text.size()
,因此渐渐地执行循环体{ {1}}次(因为循环体中没有n
,break
或continue
的修改。)
循环体是ix
的独立。它对固定大小的队列进行排序,即n
= m
,在平均情况下为search_word.size()
(最差情况O(m log(m))
)。由于这与O(m^2)
无关,我们总共使用了n
。
不是O(n)
:如果您想要更精确一点,您可能会将长度为O(n)
的{{1}}作为输入进行计算在最坏的情况下,平均search_word
总共m
。