正好循环N!置换逻辑的时间?

时间:2017-06-20 21:33:36

标签: c# algorithm time-complexity

以下代码基本上得到了字符串的排列。所以我预计时间复杂度为O(N!)。 使用参数“abc”运行以下代码将在不使用HashSet检查字符串是否已添加时显示循环36而不是3!次。

static void Main(string[] args)
{
    generated = new HashSet<string>();
    var test = getA(args[0]);
    int i = 1;
    foreach (var s in test)
    {
        Console.WriteLine($"{i}:{s}");
        i++;
    }
}

static HashSet<string> generated;
private static IEnumerable<string> getA(string v)
{
    if (v.Length <= 1)
    {
        yield return v;
    }
    else
    {
        for (var i = 0; i < v.Length; i++)
        {
            var c = v[i];
            var s = v.Remove(i, 1);
            Console.WriteLine($"  i:{i} v:{v} c:{c} s:{s}");
            foreach (var t in getA(s))
            {
                Console.WriteLine($"      t:{t}");
                for (var k = 0; k < t.Length; k++)
                {
                    if (c != t[k])
                    {
                        var result = t.Insert(k, c.ToString());
                        //if (!generated.Contains(result))
                        {
                            generated.Add(result);
                            yield return result;
                        }
                    }
                }
                //if (!generated.Contains(t + c))
                {
                    generated.Add(t + c);
                    yield return t + c;
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

大O指的是渐近复杂度,因为变量接近无穷大。

它不能衡量将要执行的操作的确切数量

随着您不断增加输入大小并接近无穷大,所执行的实际操作次数将不断接近N&#34;。