下面代码的时间复杂度

voi*_*916 0 c# algorithm big-o

我正在尝试检查以下简单程序的时间复杂度.该程序用字符串替换字符串中的空格'%20'.

  1. 计算空格的循环(O(1)时间)

        foreach (char k in s)
        {
            if (k == ' ')
            {
                spaces_cnt++;
            }
        }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 替换空格的循环(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++;
            }
        }
    
    Run Code Online (Sandbox Code Playgroud)

所以我猜这是一个"O(n)+ O(1)"解决方案.如果我错了,请纠正我.

Dou*_*las 6

计算空间的循环O(n)不需要O(1),因为你正在迭代 - 并执行检查 - n字符串中的每个字符.

如你所说,更换循环需要O(n).O(n)顺序执行的两个操作具有组合的复杂度O(n)(以Big-O表示法丢弃常数因子).

PS你知道你可以使用一行来实现所有代码的等效吗?

s = s.Replace(" ", "%20");
Run Code Online (Sandbox Code Playgroud)