这个算法有多复杂?

What's the complexity of this algorithm?

本文关键字:复杂 算法      更新时间:2023-10-16

这是一个算法,计算一个字符串(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)

证明:你正在循环ix3(可能是search_word.size(),不是吗?)到text.size(),所以渐近地执行循环体n次(因为循环体中没有breakcontinue或修改ix)。

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

这不是

O(n):如果你想更精确一点,你可能会将长度msearch_word算作输入,这平均总共O(n m log(m))O(n m^2)最坏的情况下。