首页 >后端开发 >C++ >Fisher-Yates Shuffle如何实现线性时间随机洗牌?

Fisher-Yates Shuffle如何实现线性时间随机洗牌?

Barbara Streisand
Barbara Streisand原创
2025-01-21 14:06:11380浏览

How Can the Fisher-Yates Shuffle Achieve Linear-Time Random Shuffling?

Fisher-Yates 洗牌算法:一种线性时间洗牌算法

随机排序整数列表时,效率至关重要。题目中最初的方法虽然试图实现随机性,但在处理过程中,尤其是在接近尾声时,可能会遇到效率问题。

更有效的解决方案是 Fisher-Yates 洗牌算法,这是一种线性时间算法,可以确保输入列表的真正随机重新排序。与最初依赖布尔数组来跟踪已交换元素的方法不同,Fisher-Yates 洗牌算法采用了一种更简单的方法。

<code class="language-c#">for (int i = iItemCount - 1; i >= 1; i--)
{
    int j = random.Next(i + 1);
    int temp = values[j];
    values[j] = values[i];
    values[i] = temp;
}</code>

该算法通过重复地将当前元素与列表中前面随机选择的元素交换来工作。随着算法的进行,它会缩小未排序元素的范围,从而有效地在 O(n) 时间内洗牌整个列表。

使用 Fisher-Yates 洗牌算法,您可以高效且随机地重新排列整数列表,避免最初算法的潜在缺陷。

以上是Fisher-Yates Shuffle如何实现线性时间随机洗牌?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn