Java时间复杂度O(n^2/3)
我的数学背景不太好,这是我尝试编写的JAVA代码,在运行时按不同的输入比例编写Java时间复杂度O(n^2/3),java,algorithm,big-o,time-complexity,Java,Algorithm,Big O,Time Complexity,我的数学背景不太好,这是我尝试编写的JAVA代码,在运行时按不同的输入比例编写 用n^2/3表示。因为n^2/3=立方根n*立方根n,所以我可以写 public void test(int n){ for (int i = 0; i*i*i < n; i++) { for (int j = 0; j*j*j < n; j++) { count ++; } } } 公共无效测试(int n){ 对于(int i=
public void test(int n){
for (int i = 0; i*i*i < n; i++) {
for (int j = 0; j*j*j < n; j++) {
count ++;
}
}
}
公共无效测试(int n){
对于(int i=0;i*i*i
public int fibonnaci(int n) {
if (n <= 1) {
return 1;
} else {
return fibonnaci(n - 2) + fibonnaci(n - 1);
}
}
public int fibonnaci(int n){
如果(n您只是在编写任何需要时间复杂度达到big-o界限的代码
对于#1,是的,它需要O(n^(2/3))
但对于#2,您的代码将采用O(2^n)
,而theta(1.6…^n)
,1.6..是著名的黄金比例数
参考资料:第一个是正确的,而且考虑得很好
第二个不是。计算fibs的算法比O(n^4)的时间复杂度要高得多(编辑:这是我写这个答案时被问到的问题——问题同时被更新了)。它甚至不是多项式。推理如下(符号#fib(x):调用fib以计算fib(x)的次数:
- fib(1):#fib(1)=1(它直接返回结果)
- fib(2):#fib(2)=3(一个表示fib(2),它表示fib(0)和fib(1))
- fib(3):#fib(3)=5(一个代表fib(3),它调用fib(2)和fib(1),再调用3+1)
- fib(4):#fib(4)=9
- fib(5):#fib(5)=15
- fib(6):#fib(6)=25
- fib(i):#fib(i)=1+#fib(i-1)+#fib(i-2)
因此,你有:
- #fib(i)~=#fib(i-1)+#fib(i-2)
由此,我们可以合理地猜测,计算fib(i)所需的时间大约是计算fib(i-1)所需时间的2倍(实际上,略少于2倍)。因此,您可以“猜测”O(#fib(i))=O(2^i)。这是正确的答案,您可以通过归纳法轻松证明
在结束关于斐波那契序列的讨论之前,有很多更快的算法来计算第n个数。例如,一个线性时间算法(即,O(n))是用来记忆你写的函数(即,让它查阅地图,检查它是否知道n的结果,所以立即返回它,否则,计算它,存储它并返回它)。还有一个,因此是一个常数时间算法(即O(1))
最后,O(n^4)算法的一个例子是任何有4个内部循环的东西,每个循环运行“大约”n次
例如,计算n侧n个立方体的体积(以非最佳方式):
int volume=0;
for(int cube=0;cube
这并不是一个真正的答案,但这里是一个“欺骗”解决方案的草图,该解决方案提供了一个花费O(F(N))
时间的程序示例
创建一个Java函数对象,对给定的N
计算F(N)
:
将其作为参数传递给以下方法:
public void计算顺序fn(int n,FunctionInt2Int fn){
整数计数=fn.评估(n);
对于(int i=1;i
但是,如果“聪明的**s”有失去信誉的风险,就不要使用这个选项:-2)斐波那契-它更多的是O(2^n)iso O(n^4)。使用4嵌套for循环(从1到n递增1)作为O(n^4)的示例;-)和1)是一个聪明的例子:)@LouisWasserman,很有名。但是,当我回答这个问题时,有人问到关于n^4的问题,OP后来在我写了这篇文章后更改了它。对于给您带来的不便,我深表歉意。
int volume = 0;
for (int cube = 0; cube < n; cube++)
for (int x = 0; x < n; x++)
for (int y = 0; y < n; y++)
for (int z = 0; z < n; z++)
volume++;
return volume;
public void computeOrderFN(int n, FunctionInt2Int fn) {
int count = fn.evaluate(n);
for (int i = 1; i < count; i++) {
// Do something O(1) that the compiler can't optimize away)
}
}