我正在尝试检查以下简单程序的时间复杂度。
该程序用'%20'
替换字符串中的空格。
计算空格的循环(O(1)时间)
foreach (char k in s)
{
if (k == ' ')
{
spaces_cnt++;
}
}
替换空格的循环(O(n),其中n是字符串的大小)
char[] c = new char[s.Length + spaces_cnt * 3];
int i = 0;
int j = 0;
while (i<s.Length)
{
if (s[i] != ' ')
{
c[j] = s[i];
j++;
i++;
}
else
{
c[j] = '%';
c[j + 1] = '2';
c[j + 2] = '0';
j = j + 3;
i++;
}
}
所以我猜这是一个“O(n)+ O(1)”解决方案。如果我错了,请纠正我。
答案 0 :(得分:6)
计算空格的循环需要O(n)
,而不是O(1)
,因为您正在迭代 - 并对字符串中的每个n
字符执行检查。
正如您所说,替换循环需要O(n)
。顺序执行的两个O(n)
操作具有O(n)
的组合复杂度(以Big-O表示法丢弃常数因子)。
P.S。您知道可以使用一行来实现所有代码的等效吗?
s = s.Replace(" ", "%20");
答案 1 :(得分:0)
看起来你正在尝试编码一个字符串。如果是这种情况,您可以使用UrlPathEncode()方法。如果您只是尝试编码空格,请使用Replace()(如Douglas所述)。