我需要实现并测试一个2^n复杂度的算法。我已经试图找了一段时间的算法。如果有任何办法能够通过实现来达到精确的2^n复杂度,那将是最优的。如果有人知道我可以找到例子的地方,或者可以帮我实现一个例子,那就太好了。基本操作可以是任何东西,但像 i++ 这样的单个语句最好。
我需要实现并测试一个2^n复杂度的算法。我已经试图找了一段时间的算法。如果有任何办法能够通过实现来达到精确的2^n复杂度,那将是最优的。如果有人知道我可以找到例子的地方,或者可以帮我实现一个例子,那就太好了。基本操作可以是任何东西,但像 i++ 这样的单个语句最好。
生成一个含有n个元素的集合的所有子集。
补充。
生成S = {a0, a1, ..., an-1} 所有子集最简单的方法可能是将排名和子集之间进行二进制转换。
以S = {a0,a1,a2}为例。
rank binary subset
0 000 {}
1 001 {a0}
2 010 {a1}
3 011 {a0, a1}
4 100 {a2}
5 101 {a0, a2}
6 110 {a1, a2}
7 111 {a0, a1, a2}
因此,二进制中的1表示相应的元素在子集中。0表示该元素不在子集中。
但您还应该查找格雷码。
经典的递归斐波那契数计算复杂度为O(2^n)。
unsigned Fib(unsigned n)
{
if (n <= 1)
return n;
else
return Fib(n - 1) + Fib(n - 2);
}
由于上述算法的时间复杂度实际上是theta(Phi^n),我添加了一个时间复杂度为theta(2^n)的算法来返回2^n。感谢Jeremiah Willcock。
unsigned TwoExp(unsigned n)
{
if (n == 0)
return 1;
else
return TwoExp(n - 1) + TwoExp(n - 1);
}
Fib(n-2)
替换为Fib(n-1)
,那么复杂度会变成2^n。 - Jeremiah Willcockpublic class TwoToTheN
{
private static int twoToTheN = 0;
private static int power = 3;
public static void main(String[] args)
{
twoToTheN(power);
System.out.println(twoToTheN);
}
private static void twoToTheN(int n)
{
if(n == 0)
{
twoToTheN++;
return;
}
else if(n == 1)
{
twoToTheN++;
twoToTheN++;
return;
}
twoToTheN(n-1);
twoToTheN(n-1);
}
}