以下代码基本上得到了字符串的排列。所以我预计时间复杂度为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;
}
}
}
}
}
答案 0 :(得分:0)
大O指的是渐近复杂度,因为变量接近无穷大。
它不能衡量将要执行的操作的确切数量。
随着您不断增加输入大小并接近无穷大,所执行的实际操作次数将不断接近N&#34;。