【发布时间】:2012-05-24 15:13:25
【问题描述】:
我正在尝试将算法降低到至少 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 循环最多为 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”是不由模式组成的示例。
-
这是一个 O(N) 的工作。您需要稍微修改的字符串搜索算法。
-
我的意思是,像 Knuth-Morris-Pratt 这样的 O(N) 字符串搜索算法。
-
@svinja:这称为“查找字符串的句点”。找到一个简单的方法是在其自身的正方形内搜索一个字符串(将第一个和最后一个字符切掉,以消除琐碎的情况)。有一个 article (pdf) 讨论了具有更好平均运行时间的算法。
标签: algorithm complexity-theory analysis