Вот алгоритм подсчета вхождений анаграмм одной строки (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
- это длина текста. Это связано с тем, что время, необходимое для выполнения цикла внутри цикла, не зависит от длины n
. Однако некоторые считают, что это не O(n)
. Говорят, что алгоритм сортировки также учитывается при вычислительной сложности.
Вы занимаетесь сортировкой внутри цикла, как это O (n)? – 0x90
@ 0x90 Возможно, потому, что он сортирует только слово, а не весь текст? Это сделает его «O (n * m)»? – Rotem
Невозможно, чтобы это было O (n), потому что любой алгоритм сортировки имел как минимум O (nlogn) сложность, и вы делаете это в теле цикла, поэтому сложность этого алгоритма O (n^2logn) не менее – Manu343726