遍历有序数组为何比无序数组快

最近看到2篇有意思的文章,提出了2个问题

1.为什么遍历有序数组比无序数组快?

2.arr[i][j] 与 arr[j][i]的区别?

让我们来看看第一个问题,下面给出2段代码
图1

//sort(vec.begin(),vec.end());
    clock_t begin = clock();
    for(int i = 0;i<10000;++i){
        for(int j = 0;j <vec.size();++j){
            if(vec[j] >= 5000){
                sum += vec[j];
            }
        }
    }
    clock_t end = clock();

图2

 sort(vec.begin(),vec.end());区别
    clock_t begin = clock();
    for(int i = 0;i<10000;++i){
        for(int j = 0;j <vec.size();++j){
            if(vec[j] >= 5000){
                sum += vec[j];
            }
        }
    }
    clock_t end = clock();

很明显差别就在于一个是排序数组,一个不是,那么运行时间是多少呢?前者平均为818ms,后者359ms
这就牵扯到cpu的分支预测原理。

那么讲到这里,我们来看一下下面2段代码,他们效率会相差多少呢,或者图2和图4的效率会差多少。相信如果你理解了分支预测你就应该可以想到。
图3

//sort(vec.begin(),vec.end());区别
    clock_t begin = clock();
    for(int i = 0;i<10000;++i){
        for(int j = 0;j <vec.size();++j){
            if(vec[j] >= 5){
                sum += vec[j];
            }
        }
    }
    clock_t end = clock();

图4

sort(vec.begin(),vec.end());
    clock_t begin = clock();
    for(int i = 0;i<10000;++i){
        for(int j = 0;j <vec.size();++j){
            if(vec[j] >= 5){区别
                sum += vec[j];
            }
        }
    }
    clock_t end = clock();

答案是图3与图4效率几乎是一样的。因为数组里的数字几乎都比5大,
持续更新。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值