Knuth 洗牌算法

2023-11-18

核心思想

洗牌算法(Knuth shuffle算法):对于有n个元素的数组来说,为了保证洗牌的公平性,应该要能够等概率的洗出n!种结果。
举例解释如下:

开始数组中有五个元素;
在前五个数中随机选一个数与第五个数进行交换,每个数都有五分之一的概率被交换到最后一个位置;
在前四个数中随机选一个数与第四个数进行交换,每个数都有五分之一的概率被交换到第四个位置;
在前三个数中随机选一个数与第三个数进行交换,每个数都有五分之一的概率被交换到第三个位置;
综上所述,每个数都有相等的概率被放到任意一个位置中,即每个位置中出现任意一个数的概率都是相同的。这,就是洗牌算法。

题目

384. 打乱数组

复杂度

时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)

代码

class Solution {
public:
    vector<int> a;
    Solution(vector<int>& nums) {
        a = nums;
    }
    
    vector<int> reset() {
        return a;
    }
    
    vector<int> shuffle() {
        auto b = a;
        int n = a.size();
        for (int i = 0; i < n; i ++) {
            swap(b[i], b[i + rand() % (n - i)]);
        }
        return b;
    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution* obj = new Solution(nums);
 * vector<int> param_1 = obj->reset();
 * vector<int> param_2 = obj->shuffle();
 */

参考

Knuth 洗牌算法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Knuth 洗牌算法 的相关文章

  • 嵌入式常用通讯协议1(UART 、RS232、RS485、SPI、IIC)

    目录 1 常用通讯协议汇总 2 常见的电平信号及其电气特性 2 1 TTL电平 2 2 CMOS电平标准 2 3 RS232标准 2 4 RS485标准 3 UART 通用异步收发器 协议 3 1 UART定义 3 2 UART作用 3 3
  • LeetCode刷题C++

    5 最长回文字符串 给你一个字符串 s 找到 s 中最长的回文子串 划定步长 遍历判断 class Solution public string longestPalindrome string s if s size lt 2 retur
  • Vue 引入G2图表

    安装G2依赖 npm install antv g2 npm install antv data set vue ge 在Vue main js文件中引入G2 import G2 from antv g2 Vue use G2 模板中使用完
  • 深入理解链表:一种动态的线性数据结构

    文章目录 前言 1 概述 2 单向链表 3 单向链表 带哨兵 4 双向链表 带哨兵 5 环形链表 带哨兵 6 结语 前言 链表是我们在日常编程中经常使用的一种数据结构 它相比于数组具有更好的动态性能 但是 对链表的深入理解需要我们掌握其内在
  • Linux项目自动化构建工具-make/Makefile (●‘◡‘●)

    目录 1 为什么要使用make 2 makefile的基本语法与变量 1 为什么要使用make 假设我们的执行文件里面包含2个源文件 分别是main c test c 如果想要这个程序运行起来 那么就需要先编译 先对源文件进行编译 产生te
  • C语言之基本数据类型

    在学习C语言的时候 我们可能首先面对的就是C语言中基本的数据类型 下面来看一下C语言中一些基本的数据类型 基本数据类型 void 声明函数无返回值或无参数 声明无类型指针 显示丢弃运算结果 C89标准新增 char 字符型类型数据 属于整型
  • C++(22)——容器的迭代器失效问题

    前言 我们在之前的学习中已经实现过list和vector的迭代器 那么在面试中经常会有面试官问到有关于迭代器的失效问题 那么为什么迭代器会失效呢 原因 随着VS版本的迭代 g 版本的迭代 C 标准库容器以及迭代器的源码都有比较大的修改 但是

随机推荐