美文网首页Android技术知识Android开发Android开发
获取不重复的随机数列(打乱一组连续数列的顺序)的未解之谜

获取不重复的随机数列(打乱一组连续数列的顺序)的未解之谜

作者: ScottStone | 来源:发表于2018-08-16 10:47 被阅读140次

这个问题面试的时候被问到过,之前的思路是这样的:1,生成1-->N的数组Array。2,Radom出一个num,0<=num<N,3,每个位置的数都跟num交换,知道最后一个数,输出数组Array。如下:

public int[]getRadomSequence(int total) {

int[] output =new int[total];

    for (int i =0; i < total; i++) {

output[i]=i;

    }

Random random =new Random();

    //获取随机数

    int num = random.nextInt(total);

    for(int i=0;i

//所有位置的数与随机位置的数交换

        int t =output[i];

        output[i]=output[num];

        output[num]=t;

    }

return output;

}

然后,面试的人说,你这个效率不行啊。也没说原因,我感到很奇怪,我觉两个循环,一个循环,生成有序数列,另外一个循环交换生成随机数列,算起来是O(n)。后来我在网上看到很多人给出的是如下:

public int[]getRadomSequenceI(int total) {

int[] hashTable =new int[total];

    int[] output =new int[total];

    Random random =new Random();

    for (int i =0; i < total; i++) {

int num = random.nextInt(total);

        while (hashTable[num] >0) {

num = random.nextInt(total);

        }

output[i] = num;

        hashTable[num]=1;

    }

return output;

}

这个我就奇怪了,这个是循环套循环的,时间复杂度外层O(n),内层O(logn),算起来是O(nlogn),那不是不如我的?

后来我看到了一个改进型的算法:

public int[]getRadomSequenceII(int total) {

int[] sequence =new int[total];

    int[] output =new int[total];

    for (int i =0; i < total; i++) {

sequence[i]=i;

    }

Random random =new Random();

    int end=total-1;

    for(int i=0;i< total ;i++){

int num = random.nextInt( end +1);

        output[i] = sequence[num];

        sequence[num] = sequence[end];

        end--;

    }

return output;

}

这个算法,前一半跟我的一样,后一半是把随机的位置的数给将要输出的随机数列,然后缩短随机数的取值范围,直到最后,算起来时间复杂度也是O(n),我只用了一个数组,这里还用了两个数组,空间复杂度算是我的两倍,不解,有大神可以在下面回复,万分感谢!

相关文章

  • 获取不重复的随机数列(打乱一组连续数列的顺序)的未解之谜

    这个问题面试的时候被问到过,之前的思路是这样的:1,生成1-->N的数组Array。2,Radom出一个num,0...

  • 【纯干货】专升本数学--集合和数列的比较

    讲解对象:【纯干货】专升本数学--集合和数列的比较作者:融水公子 rsgz 集合:互异性 无顺序数列:有顺序,能重复

  • 19.linux中使用随机数

    随机数和伪随机数 随机数是随机出现,没有任何规律的一组数列。 真正的完全随机的数列是不存在的,只是一种理想情况。我...

  • 算法:查找丢失的整数

    问题 一个从0开始的连续数列(比如[0 .. n]),去除i个数,然后打乱顺序,该怎样找回这i个数 测试 统一解法...

  • 不重复随机

    方案一、无序不重复数列 通过无序数列代替随机数,如:[7, 2, 8, 4, 9, 0]现在我们模拟一个随机数范围...

  • 冒泡排序

    冒泡排序法 重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复进行...

  • 排序算法之冒泡排序

    定义:重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直...

  • 冒泡排序算法 bubble sort

    它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没...

  • Python实现常用排序算法

    1、冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的...

  • [源码和文档分享]8种排序算法的比较案例

    源码及文档下载 冒泡排序:重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列...

网友评论

    本文标题:获取不重复的随机数列(打乱一组连续数列的顺序)的未解之谜

    本文链接:https://www.haomeiwen.com/subject/lyjnbftx.html