Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java时间复杂度O(n^2/3)_Java_Algorithm_Big O_Time Complexity - Fatal编程技术网

Java时间复杂度O(n^2/3)

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=

我的数学背景不太好,这是我尝试编写的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=0;i*i*i
  • 用4^n。我可以使用Fibonnaci方法吗

    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)
          }
       }