关于排列后数组的一些思考(1)

发布时间:2019-06-14 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了关于排列后数组的一些思考(1)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

问题: stackoverflow上看到了一个问题@L_777_0@

对楼主的实例代码进行了一下重构,代码如下:

public class Main {

    public static void main(String[] args) {
        noSortedTime();

        sortedTime();

    }

    private static void noSortedTime() {
        int[] data = initialize();
        calculateTime(data);
    }

    public static int[] initialize() {
        int arraySize = 32768;
        int data[] = new int[arraySize];
        Random ran = new Random(0);
        for (int c = 0; c < arraySize; ++c) {
            data[c] = ran.nextInt() % 256;
        }
        return data;
    }

    private static void sortedTime() {
        int[] data = initialize();
        Arrays.sort(data);
        calculateTime(data);
    }

    private static void calculateTime(int[] data) {
        long start = System.nanoTime();
        long sum = 0;
        for (int i = 0; i < 100000; i++) {
            for (int c = 0; c < data.length; c++) {
                if (data[c] < 128) {
                    sum += data[c];
                }
            }
        }
        System.out.println((System.nanoTime() - start) / 1000000000.0);
        System.out.println("sum = " + sum);
    }
}
  1. 把up最高的回答看了下,也就是在loop的时候,在判定if (data[c] > 128) 的时候,没有排列时候,每次都要重新进行判断,而排列完之后,当排列完数据大于128判断时候,后面所有的数据都不需要进行if的判断,由此减少了判定方向,减少了运行时间,由于128大概是255的一般左右,所以我当时的认为应该时间也是一般左右,但得到的偏差比较大,而且sum是负数,debug后发现ran.nextInt() % 256;可能产生负数,于是我把initialize()方法改成了如下:

    public static int[] initialize() {
        int arraySize = 30000;
        int data[] = new int[arraySize];
        Random ran = new Random(0);
        for (int c = 0; c < arraySize; ++c) {
            int i = ran.nextInt() % 256;
            if (i > 0) {
                data[c] = i;
            } else {
                data[c] = -i;
            }   
        }
        return data;
    }
    
  2. 这时候,得到了结果是:
    20.666892876
    sum = 95197000000
    9.225126652
    sum = 95197000000

  3. 之后我觉得如果以128作为判定条件太折中,如果是用极端点的条件来进行如小于1会不会排列好的数组会非常快的完成呢,或者大于254会不会两边的速度差不多呢,进行了实验小于1的话得到的结果是:
    8.647651855
    sum = 0
    8.641952252
    sum = 0
    大于254的结果是:
    8.942171349
    sum = 3111000000
    8.821620658
    sum = 3111000000

  4. 上述结果很明显得到我们的猜想是错误的,我又重新去把回答up最高的答案仔细读了一遍,发现了又branch predictor这个概念,是处理器中对于if else这类condition的判断预测,具体里面的概念灰常不懂,只能先放着了。

脚本宝典总结

以上是脚本宝典为你收集整理的关于排列后数组的一些思考(1)全部内容,希望文章能够帮你解决关于排列后数组的一些思考(1)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。