我想弄清楚,我写了一个函数的时间复杂度的复杂性(它给定的字符串生成power set):时间幂生成函数
public static HashSet<string> GeneratePowerSet(string input)
{
HashSet<string> powerSet = new HashSet<string>();
if (string.IsNullOrEmpty(input))
return powerSet;
int powSetSize = (int)Math.Pow(2.0, (double)input.Length);
// Start at 1 to skip the empty string case
for (int i = 1; i < powSetSize; i++)
{
string str = Convert.ToString(i, 2);
string pset = str;
for (int k = str.Length; k < input.Length; k++)
{
pset = "0" + pset;
}
string set = string.Empty;
for (int j = 0; j < pset.Length; j++)
{
if (pset[j] == '1')
{
set = string.Concat(set, input[j].ToString());
}
}
powerSet.Add(set);
}
return powerSet;
}
所以我的尝试是这样的:
- 让输入字符串的大小是n 在外部for循环
- ,必须重复2^n倍(因为集合大小是2^N)。
- 在内循环中,我们必须迭代2 * n次(最坏的情况)。
1.所以Big-O会是O((2^n)* n)(因为我们放弃了常数2)......这是否正确?
而n *(2^n)比n^2差。
如果n = 4,则
(4 *(2^4))= 64
(4^2)= 16
如果n = 100然后
(10 *(2^10) )= 10240
(10^2)= 100
2.是否有更快的方式来产生功率集,或者这是否最优?
我实际上并不知道c#,但我相信string.concat必须复制每个调用的字符串,这意味着复杂度实际上是O(n^2 * 2^n)。 – 2011-01-08 11:14:41
@Chris,感谢您的参与。 – Kiril 2011-01-08 23:17:25