我们可以安全地对Java Collections shuffle(List <! - ? - >,Random)方法做出哪些假设?

时间:2016-01-11 21:36:26

标签: java shuffle

所以我正在研究集合shuffle方法,并尝试提出一个列表,列出了运行它时是什么和不确定的。我发现了一些明显的案例如下:

  1. 给出的列表将包含与之前相同的元素
  2. 运行方法后,列表可能相同也可能不同(最终可能会使用相同的元素顺序)
  3. 该方法将以线性时间运行(我认为这是正确的,但不是100%正面)。
  4. 此列表是否总结或我是否遗漏了一些可能的案例?

2 个答案:

答案 0 :(得分:11)

official documentation of Collections.shuffle对于会发生什么有很多话要说。该列表将使用似乎为Fisher-Yates shuffle algorithm的值进行混洗,其中(假设O(1)中的随机访问可用)在时间O(n)和空间O(1)中运行。如果随机访问不可用,则实现将使用空间O(n)。假设基础随机源是完全无偏的,那么任何特定排序发生的概率都是相等的(也就是说,你可以在可能的排列上得到均匀随机的分布)。

所以,回答你的问题:

  1. 该列表将包含相同的元素。
  2. 他们可能处于不同的顺序,但是有1 / n!他们的机会不一样。
  3. 运行时为O(n),空间使用量为O(1)或O(n),具体取决于您的列表是否具有随机访问支持。

答案 1 :(得分:1)

  1. 是(并且更多 - 列表本身将保持相同的对象)
  2. 正确,总是有一点点随机获得完全相同的元素顺序的机会(对于小列表来说不是那么轻微)
  3. 这是基于实现的,但至少在java 7之前它是线性的(并且不太可能是它改变的原因)