我的shuffle功能有哪些缺点?

时间:2017-07-30 15:52:15

标签: javascript

阅读了一些"如何改变"关于SO的问题,我看到this answer被普遍接受:

function shuffle (array) {
    var tmp, current, top = array.length;

    if(top) while(--top) {
        current = Math.floor(Math.random() * (top + 1));
        tmp = array[current];
        array[current] = array[top];
        array[top] = tmp;
    }

    return array;
}

但是,随机选择列表中的元素like I posted

会出现什么问题
function shuffle (array) {
  var result = [];
  while(array.length){
    var index = Math.floor(Math.random() * array.length);
    result.push(array.splice(index, 1)[0]);
  }  
  return result;
}

3 个答案:

答案 0 :(得分:2)

你的答案给出的结果似乎没有任何问题,当你拿起一个随机索引然后将其推送到结果数组时,它似乎会对数组进行洗牌。

两种方法之间的区别在于效率,第一种解决方案的最坏情况时间复杂度为O(n),并且您的解决方案的最坏情况时间复杂度为O(n ^ 2),因为拼接具有最差的情况复杂性O(n)和有一个while循环取O(n),第二种方法的空间复杂度为O(n)。

答案 1 :(得分:0)

您可以在.slice()循环之前调用原始数组上的while以保留原始数组。

function shuffle (array) {
  var result = [];
  var temp = array.slice(0);
  while(temp.length){
    var index = Math.floor(Math.random() * temp.length);
    result.push(temp.splice(index, 1)[0]);
  }  
  return result;
}

答案 2 :(得分:0)

明显的问题是,当你的解决方案构造一个新的result数组时,它也会清空参数array,这是一种绝对不好的做法。不要不必要地改变你的论点。此外,使用splice非常低效,因为它在移除后的所有元素周围移动。