Time complexity 为什么O(1)恒定时间码比O(n)线性时间码慢?

Time complexity 为什么O(1)恒定时间码比O(n)线性时间码慢?,time-complexity,big-o,Time Complexity,Big O,“…对于特定的输入,O(N)代码很可能比O(1)代码运行得更快。大O只是描述增长率。” 据我了解: O(N)-根据输入N的变化值运行算法所需的时间 O(1)-无论输入大小,算法执行所需的恒定时间,例如int val=arr[10000] 根据作者的陈述,有人能帮我理解吗 O(N)代码运行速度是否比O(1)快 作者所指的具体投入是什么 增长率是多少 O(n)恒定时间可以绝对快于O(1)线性时间。原因是在Big O中,常量时间运算被完全忽略,这是一种衡量算法复杂度随输入大小n的增加而增加的速度的

“…对于特定的输入,O(N)代码很可能比O(1)代码运行得更快。大O只是描述增长率。”

据我了解:

  • O(N)-根据输入N的变化值运行算法所需的时间
  • O(1)-无论输入大小,算法执行所需的恒定时间,例如
    int val=arr[10000]
根据作者的陈述,有人能帮我理解吗

  • O(N)代码运行速度是否比O(1)快
  • 作者所指的具体投入是什么
  • 增长率是多少 O(n)恒定时间可以绝对快于O(1)线性时间。原因是在Big O中,常量时间运算被完全忽略,这是一种衡量算法复杂度随输入大小n的增加而增加的速度的方法,而不是其他方法。这是衡量增长率的指标,而不是运行时间

    下面是一个例子:

    int constant(int[] arr) {
        int total = 0;
    
        for (int i = 0; i < 10000; i++) {
             total += arr[0];
        }
    
        return total;
    }
       
    int linear(int[] arr) {
        int total = 0;        
    
        for (int i = 0; i < arr.length; i++) {
            total += arr[i];
        }
    
        return total;
    }
    
    很明显,
    常量
    线性
    运行得慢

    但你可以这样称呼他们:

    int[] arr = new int[10000000];
    
    constant(arr);
    linear(arr);
    
    哪个跑得慢

    考虑过之后,运行给定n的各种输入的代码并比较结果


    只是为了说明
    运行时的这种现象!=大O不仅仅适用于恒定时间函数,请考虑:

    void exponential(int n) throws InterruptedException {
        for (int i = 0; i < Math.pow(2, n); i++) {
            Thread.sleep(1);
        }
    }
    
    void linear(int n) throws InterruptedException {
        for (int i = 0; i < n; i++) {
            Thread.sleep(10);
        }
    }
    
    void index(int n)抛出中断异常{
    for(int i=0;i

    练习(使用笔和纸):在哪种情况下,
    n
    指数运行速度比
    线性运行速度快?

    考虑以下情况:

    Op1)给定长度为n的数组,其中n>=10,在控制台上打印前十个元素两次。-->这是一个常数时间(O(1))操作,因为对于大小>=10的任何数组,它将执行20个步骤

    Op2)给定长度为n的数组,其中n>=10,查找数组中最大的元素。这是一个常数时间(O(N))操作,因为对于任何数组,它都将执行N个步骤

    现在,如果数组大小在10到20之间(独占),Op1将比Op2慢。但是我们假设一个数组的大小大于20(例如,size=1000),Op1仍然需要20个步骤才能完成,但是Op2需要1000个步骤才能完成


    这就是为什么big-o表示法是关于算法复杂性的增长(增长率)

    o(1)意味着无论输入的大小,过程所需的时间大致相同。O(N)表示时间与输入的大小成正比,因此如果输入的大小加倍,则时间大致加倍。O描述了时间相对于进程输入大小的变化方式。O(1)的示例为:
    while(true){;}
    。O(n)的示例:
    for(inti=0;i
    。哪一个需要更长的时间?O(1)应该需要无限长的时间!!虽然这两个函数在同一个输入上运行,但您不是在比较“苹果和橙子”吗?一个函数在基于输入数组大小的整个数组上运行,另一个函数在数组的固定元素上运行10000次!!是的,大O是对算法增长率的一般描述,而不是别的。它没有说明运行时间。恒定时间可能非常昂贵且缓慢,但如果是一个固定的工作量,根据Big O,它是O(1)。如果您仍然不理解这一点,请使用这两种算法,在输入大小为1和时间的情况下运行它们,并比较它们,看看每种算法需要多长时间。然后在100的输入上运行它们,并对结果计时。尝试1000、10000、100000、1000000、10000000并计时结果。然后报告你的发现。那么,在讨论算法复杂性时,我们为什么还要考虑固定时间呢?为什么我们不能比较真正的“苹果对苹果”,即对输入进行操作?我的意思是O(n)vs O(n幂2)对O(n log n)……我们不考虑在大O中的恒定时间。如果你想比较相同或不同复杂性的两种算法的运行时间,你当然可以做到这一点,但这与大O的度量不同,它测量的是增长率,而不是别的。如果这两个函数看起来像苹果和橙子,那是因为它们是大O中两个不同的复杂度类,即O(1)和O(n)。我不明白O(n)和O(n^2)与O(1)和O(n)的比较有什么不同,但我会添加这个例子。
    void exponential(int n) throws InterruptedException {
        for (int i = 0; i < Math.pow(2, n); i++) {
            Thread.sleep(1);
        }
    }
    
    void linear(int n) throws InterruptedException {
        for (int i = 0; i < n; i++) {
            Thread.sleep(10);
        }
    }