【发布时间】:2011-01-07 21:59:06
【问题描述】:
我正在尝试计算我编写的函数的时间复杂度(它为给定的字符串生成 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)。
- 在内部 for 循环中,我们必须迭代 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)。
-
@Chris,感谢您的意见。
标签: c# algorithm performance analysis time-complexity