【问题标题】:Fisher-Yates (java) vs. Collections.shuffleFisher-Yates (java) 与 Collections.shuffle
【发布时间】:2017-11-23 16:03:34
【问题描述】:

我还是个初学者,所以请善待。我很难理解为什么 Fisher-Yates 算法会永久修改数组元素而 Collections 的 shuffle 方法不会。我怀疑一个原因是我可能实际上并没有正确理解 Fisher-Yates 算法的工作原理,但我将不胜感激。代码如下:

导入 java.util.*;

公共类 ArrayShuffle {

private static char[] letters = {'a','b','c','d','e','f','g'};

public static void main(String[] args) {
    System.out.println("Collections' shuffle method:");
    shuffleCollections(letters);
    System.out.print(letters);
    System.out.println();
    System.out.println("Fisher-Yates method:");
    shuffleFisherYates(letters);
    System.out.print(letters);

}

public static void shuffleCollections(char[] abc) {
    List letterList = new ArrayList();
    for(int alph=0; alph<abc.length; alph++)
        //convert char to ArrayList object
        letterList.add(abc[alph]);
    //shuffle
    Collections.shuffle(letterList);
    System.out.println(letterList);


}

public static void shuffleFisherYates(char[] abc) {
    int size = abc.length;
    Random random = new Random();
    for(int alph=0; alph<abc.length; alph++) {
        int randomIndex = alph + random.nextInt(size - alph);
        char randomLetter = abc[randomIndex];
        abc[randomIndex] = abc[alph];
        abc[alph] = randomLetter;
    }
    for(int shuffled = 0; shuffled<abc.length; shuffled++)
        System.out.print(abc[shuffled]+" ");
    System.out.println();

}

}

【问题讨论】:

  • 你试的时候输入输出是什么?
  • 嗯,您只是将数组的元素复制到一个列表中,然后对该列表进行洗牌。为什么要修改数组?如果数组是对象数组,并且您使用了 Collections.shuffle(Arrays.asList(array)),那么数组将被打乱(因为 Arrays.asList 是原始数组的列表视图,而不是副本)。

标签: java arrays algorithm shuffle


【解决方案1】:

您的shuffleFisherYates 直接修改输入数组(abc[someIndex] = ...; 就是这样做的)。

您的shuffleCollections 基于输入数组构建ArrayList,然后修改ArrayList(通过调用Collections.shuffle(letterList))。它不会修改输入数组。

【讨论】:

  • 谢谢伊兰。但是有没有办法使用 Fisher-Yates 方法将输出反转回原来的?
  • @Busybitsnbytes 除非您保留原始数组的副本作为备份。
  • 我也是这么想的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2017-07-08
  • 2023-03-27
相关资源
最近更新 更多