这两种算法中的一种有效算法

时间:2019-01-19 04:14:30

标签: c++ algorithm time-complexity

这两种算法都给出相同的输出,但是与第二种算法(.36)相比,第一种算法花费了几乎两倍的时间(> .67)。这怎么可能?您能告诉我两种算法的时间复杂度吗?如果它们相同,为什么时间会不同?

第一种算法:

 for (int i =0 ;i<n;i++){
        cin>>p[i];
        if(i>0){
            if(p[i-1]>p[i]){
                cout<<p[i]<<" ";
            }
            else{
                cout<<"-1"<<" ";
            }
        }
    }

第二种算法:

for (int i =0 ;i<n;i++){
        cin>>p[i];

    }
    for (int i =0 ; i<n-1;i++){
       if(p[i]>p[i+1]){
                cout<<p[i]<<" ";
            }
            else{
                cout<<"-1"<<" ";
            } 
    }

1 个答案:

答案 0 :(得分:1)

现代处理器中的时间复杂度可能是几乎无用的性能统计信息。

在这种情况下,我们有一种算法从0到n-1--O(N),另一种算法从0到n-1两次,常数消失了,所以它仍然是O(N) 。第一种算法有一个额外的if语句,该语句将一次仅是一次错误,并且一个不错的编译器将消除它。我们以相同数量的输入,相同数量的输出,相同数量的数组访问(某种)和相同数量的if (a>b)结束。

第二个是第一个没有的决定论。一个循环决定第二个循环。在第一个循环中读取所有输入。这意味着CPU可以提前知道确切的情况,因为它具有所有数字,因此可以确切地知道if的每个分支将如何运行,并且可以100%准确地进行预测,加载缓存,并为所有内容填满流水线,提前做好准备。

算法1无法做到这一点,因为在循环的下一次迭代之前,下一个输入是未知的。除非输入模式是可预测的,否则它将猜测if(p[i-1]>p[i])经常出问题的方式。

其他阅读:Why is it faster to process a sorted array than an unsorted array?