这个算法的复杂性是什么?

时间:2013-09-15 16:06:48

标签: c++ algorithm complexity-theory

这是一个算法计算另一个(文本)中一个字符串(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)。他们说排序算法在计算复杂性时也很重要。

1 个答案:

答案 0 :(得分:1)

如果您只考虑长度为O(n)的字符串text作为输入,则

n

证明:您正在ix 3(可能是search_word.size(),不是吗?)到text.size(),因此渐渐地执行循环体{ {1}}次(因为循环体中没有nbreakcontinue的修改。)

循环体是ix独立。它对固定大小的队列进行排序,即n = m,在平均情况下为search_word.size()(最差情况O(m log(m)))。由于这与O(m^2)无关,我们总共使用了n

不是O(n) :如果您想要更精确一点,您可能会将长度为O(n)的{​​{1}}作为输入进行计算在最坏的情况下,平均search_word总共m