Я пытаюсь получить алгоритм до сложности по крайней мере O (n^(3/2)). Вот алгоритм:Простой алгоритм анализа
function(string s, int n)
{
bool result = false;
int position = 0;
for(int i = 0; i < n/2; i++)
{
position = 0;
for(int j = i+1; j < n; j++)
{
if(s[j] != s[position]) break;
if(j == n) result = true;
if(position == i) position = 0;
else position++;
}
if(result) break;
}
return result;
}
Первый для цикла будет итерации N/2 раза, что О (п) сложность. Мне нужно, чтобы внутри for-loop было не более O (sqrt (n)), тем самым придавая целому алгоритму сложность O (n^(3/2)). Я с трудом пытаюсь понять, нужна ли мне вложенная петля для нужной сложности.
Примечание:n
- размер строки. Функция в основном проверяет, существует ли повторяющийся шаблон в строке s. Единственными символами в s являются "0"
и "1"
. Например, если строка равна "001001"
, тогда шаблон равен "001"
и встречается дважды. Строка также четная. При этом синтаксис и функциональность не имеют отношения к этому вопросу. Считается, что все базовые действия принимают O (1) (постоянное) время, которое в значительной степени соответствует всему этому коду.
Примечание2:
Я делаю это для выполнения домашних заданий. Но вопрос о домашнем задании состоял в том, чтобы заставить работать алгоритм, который я сделал. Устранение сложности - это просто дополнительная работа для практики.
Любая помощь или руководство будут оценены!
Что делает алгоритм? –
Я объяснил это в «Примечание:» под кодом. Он определяет, состоит ли строка s из повторяющегося шаблона. Например, «001001» состоит из «001» дважды. «000000» составлен «0» 6 раз. «010100» будет примером того, который не состоит из шаблона. – Tesla
Это работа O (N). Вам нужен слегка измененный алгоритм строкового поиска. –