我想要一個算法至少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;
}
第一個for循環會迭代n/2次,這是O(n)複雜度。我需要讓內部for-loop最多爲O(sqrt(n)),從而使整個算法具有O(n ^(3/2))的複雜性。我很難弄清楚嵌套for循環是否是我需要的正確複雜性。
注意:n
是字符串的大小。該功能基本上檢查是否在字符串s中出現重複模式。 s中唯一的字符是"0"
和"1"
。例如,如果字符串爲"001001"
,則該模式爲"001"
,並且發生兩次。字符串也是偶數。話雖如此,語法和功能上與這個問題無關。所有的基本動作都被認爲是O(1)(恆定)時間,這幾乎是整個代碼。
注2:
我正在做這個作業。但作業問題只是爲了讓算法運行,我已經完成了。降低複雜性只是額外的練習。
任何幫助或指導,將不勝感激!
該算法的作用是什麼? –
我在代碼下的「註釋:」中解釋了這一點。它確定字符串s是否包含重複模式。例如,「001001」由「001」組成兩次。 「000000」組成「0」6次。 「010100」將是一個不是由模式組成的例子。 – Tesla
這是一個O(N)工作。你需要稍微修改一下字符串搜索算法。 –