LeetCode 384. Shuffle an Array (Shuffle 数组最经典题!!!)

浅谈深度学习shuffle问题 在模型训练前,我们往往对数据进行shuffle,即随机打乱数据,为什么要这么做呢?不这么做会出现什么问题?何时应该shuffle,何时不该shuffle呢? 下面,本文就以上三个问题发表下自己的拙见。 Q1:为什么要进行shuffle? A1:不论是机器学习还是深度学习,我们总是基于数据独立同分布的假设条件,也就是说,数据的出现应该是随机的,而不是按照某种顺序排列好的。以上就是需要shuffle的根本原因。因此,我们需要在每个epoch的开始把数据shuffle一下。 Q2:不shuffle会. 阅读详情
  1. Shuffle an Array
    Medium
    Shuffle a set of numbers without duplicates.

Example:

// Init an array with set 1, 2, and 3.
int[] nums = {1,2,3};
Solution solution = new Solution(nums);

// Shuffle the array [1,2,3] and return its result. Any permutation of [1,2,3] must equally likely to be returned.
solution.shuffle();

// Resets the array back to its original configuration [1,2,3].
solution.reset();

// Returns the random shuffling of array [1,2,3].
solution.shuffle();

解法1:从数组尾部开始,每次从nums[0]到nums[i]中随机取一个数与nums[i]交换。如果碰巧取到nums[i]也没关系,只是多做一次swap而已。
这种方法不知道是叫Knuth shuffle还是Fisher-Yates shuffle?

代码如下:

   class Solution {
public:
    Solution(vector<int> nums): v(nums) {}
    
    /** Resets the array to its original configuration and return it. */
    vector<int> reset() {
        return v;
    }
    
    /** Returns a random shuffling of the array. */
    vector<int> shuffle() {
        vector<int> res = v;
        int n = v.size();
        for (int i = n - 1; i >= 0; --i) {
            int t = rand() % (i + 1);
            swap(res[i], res[t]);
        }
        return res;
    }
    
private:
    vector<int> v;
};

解法2:
类似解法1。只是从数组前面开始做。

    vector<int> shuffle() {
        vector<int> res = v;
        for (int i = 0; i < res.size(); ++i) {
            int t = i + rand() % (res.size() - i);
            swap(res[i], res[t]);
        }
        return res;
    }
    

下面这2个链接讲的非常好:
1)https://yjk94.wordpress.com/2017/03/17/%E6%B4%97%E7%89%8C%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF-knuth-shuffle%E7%AE%97%E6%B3%95/
2)
https://www.cnblogs.com/luxiaoxun/archive/2012/09/09/2677267.html

下面内容引用自2):
1)在不知道文件总行数的情况下,如何从文件中随机的抽取一行,并且每行被抽中的概率相等?
伪代码如下:

Element RandomPick(file): 
Int count = 0; 
while(count <= file.size) 
    If(random(0,count) == 0) 
        picked = file[count]; 
    ++ count; 
Return picked 

事实上这就是蓄水池算法的k=1的特殊情形。
2)蓄水池算法:
对其进行扩展,即如何从未知或者很大样本空间随机地取k个数?
类比下即可得到答案,即先把前k个数放入蓄水池,对于第 i>=k+1,我们以 k/i 概率决定是否要把它换入蓄水池,换入时随机的选取一个作为替换项,这样一直做下去,对于任意的样本空间n,对每个数的选取概率都为k/n。也就是说对每个数选取概率相等。
伪代码如下:

init a reservoir with the size k
add the first k elements into the reservoir
for i = k+1 to N
    m = random(1,i);
    if(m < k)
        swap the m_th value and i_th value
end for

以蓄水池算法为基础的一道题目 (参考九章):
问题描述:给你一个 Google 搜索日志记录,存有上亿挑搜索记录(Query)。这些搜索记录包含不同的语言。随机挑选出其中的 100 万条中文搜索记录。假设判断一条 Query 是不是中文的工具已经写好了。

解法如下: 假设你一共要挑选 N 个 Queries,设置一个 N 的 Buffer,用于存放你选中的 Queries。对于每一条飞驰而过的Query,按照如下步骤执行你的算法:

  1. 如果非中文,直接跳过
  2. 如果 Buffer 不满,将这条 Query 直接加入 Buffer 中
  3. 如果 Buffer 满了,假设当前一共出了过 M 条中文 Queries,用一个随机函数,以 N / M 的概率来决定这条 Query 是否能被选中留下。
    3.1 如果没有选中,则跳过该 Query,继续处理下一条 Query
    3.2 如果选中了,则用一个随机函数,以 1 / N 的概率从 Buffer 中随机挑选一个 Query 来丢掉,让当前的 Query 放进去。

为什么这样做就可以实现等概率地抽取呢? 我们用 5 条 Queries 里挑 3 条来作为例子证明每条 Query 被挑中的概率都是 3/5。

  1. 依次处理每条 Query,前 3 条 Queries 直接进入 Buffer => [1,2,3],此时前 3 条 Queries 被选中的概率 100%
  2. 第 4 条 Query 处理时,有 3/4 的概率被留下,那么第 4 条 Query 被选中的概率此时就是 3/4。
  3. 第 4 条 Query 处理时,如果留下之后,会从 Buffer 中以 1/3 的概率踢走一条 Query。那么这些在 Buffer 中留下包含两种情况:一种是第 4 条 Query 没有被选中,概率为1/4;第二种是第 4 条 Query被选中的条件下,没有被踢走,概率是3/4 * 2/3。所以总概率是1/4 + 2/3 * 3/4 = 3/4。其中 1/4 是第 4 条 Query 没有被选中的概率。
  4. 综上在处理到第 4 条 Query 的时候,所有 Query 被选中的概率均为 3/4。
  5. 第 5 条 Query 处理时,有 3/5 的概率被留下,那么第 5 条 Query 被选中的概率此时就是 3/5。
  6. 第 5 条 Query 处理时,如果留下之后,会从 Buffer 中以 1/3 的概率踢走一条 Query。前4条Query能够顺利进入Buffer并被留下,首先要满足大前提,第四条Query处理后被留下来,概率为3/4。在这个大前提下,同3.分两种情况,第一种是第 5 条 Query没有被选中,概率是2/5;第二种是第 5 条 Query被选中的前提下,没有被踢走,概率是3/5 * 2/3。总概率为::3/4 * (2/5 + 2/3 * 3/5) = 3/5。
3D视觉入门必看:深度图、点云图、IR图、RGB图像到底有什么区别? 本文深入解析了3D视觉中深度图、点云图、IR图与RGB图像的核心区别。深度图记录像素距离,是连接2D与3D的桥梁;点云图是显式的三维坐标集合;IR图感知红外光强度;RGB图像则提供颜色纹理。理解其信息维度和应用场景,是进行机器人导航、三维重建等任务的基础。 阅读详情

相关推荐

数据结构与算法 —— 最短路径Dijkstra算法(迪杰斯特拉)详细图解以及python实现

前两章我们讲到了关于图的基本知识,和广度/深度优先搜索。本章,我们将介绍加权图和最短路径的相关知识。最短路径和最小生成树是图论中常见的问题。最短路径是指在一个图中找到两个节点之间的最短路径,最小生成树是指在一个图中找到一个连通子图,使得所有节点都能够互相到达,且总权值最小。最短路径算法常见的有floyd算法(弗洛伊德算法)和 dijkstra算法(迪杰斯特拉)。本文只介绍dijkstra算法。最短路径运用非常广泛,比如在导航系统中,确定两个地点间哪条路线最短;

‘’ 2万+

Partition分区之底层源码解析

shuffle机制之Partition分区 一、分区概念 分区概念:将数据按照条件处理后,最终输出到多个文件中. 二、源码解析 2.1 通过设置分区数实现分区效果 默认情况下,我们运行WodCount案例可以看到,在输出路径中,所有的数据都存储到一个文件中(part-r-00000) 那么多个分区对应的就是多个不同的文件,比如part-r-00001、part-r-00002… 思考1:为什么设置reduce的个数,就可以实现分区的效果? 首先默认情况下,通过源码MapTaskrun()方法找到r

weixin_42796403的博客 517

复合材料RVE建模与力学性能分析实战指南

代表体积元(RVE)建模是复合材料多尺度分析的核心技术,通过建立微观结构与宏观性能的定量关联,可准确预测材料力学行为。本文基于ABAQUS平台,详细解析三材料(纤维/基体/界面相)RVE建模全流程,包括参数化几何建模、周期性网格划分策略、材料属性定义技巧等关键技术环节。针对碳纤维增强环氧树脂等典型复合材料,提供网格控制参数建议和材料参数参考表,并重点说明周期性边界条件的实现方法与验证标准。通过Python脚本自动化处理和优化分析流程,可显著提升计算效率,为复合材料设计提供可靠仿真依据。

weixin_34062469的博客 549

洗牌(shuffle)问题详解

打扑克牌,打麻将的时候,都会有洗牌这个动作。洗牌问题其实很简单,如果有一个数组中有n个元素,怎样设计一个洗牌(shuffle)算法保证随机性。最简单的思路自然是新建一个新数组,每次从原数组中剩下的元素随机挑选一个放入新数组,知道原数组为空。考虑一下这种方式的随机性。一个元素shuffle以后位于第一个位置的概率为1n\frac{1}{n},即第一次被抽中。 出现在第二个位置的概率为: p=p(第

bitcarmanlee的博客 6602

时间序列数据预测——15种时序大模型

本文综述了时间序列大模型(TSFM)的最新进展,系统介绍了11种主流模型(如TimeGPT、Lag-Llama、Moirai等)的架构特点、训练数据和创新点,并对比分析了它们在单变量/多变量预测、概率预测等功能上的差异。研究表明,基于"大规模预训练-微调/零样本"范式的TSFM在标准数据集(如M4、ETT)上展现出优于传统方法的性能,Time-MoE等模型更达到SOTA水平。但TSFM仍面临计算成本高、可解释性差等挑战,未来发展方向包括轻量级架构、多模态融合和可解释性增强。

m0_56592100的博客 4078

实现AI Agent的多Agent协作能力

在当今复杂的计算环境和应用场景中,单个AI Agent的能力往往受到限制。实现AI Agent的多Agent协作能力的目的在于通过多个Agent之间的协同工作,充分发挥各自的优势,提高整体系统的性能和效率,以解决更为复杂的问题。本文章的范围涵盖了多Agent协作的核心概念、算法原理、数学模型、项目实战以及实际应用场景等方面,旨在为读者提供全面且深入的技术指导。本文将按照以下结构进行阐述:首先介绍多Agent协作的背景知识,包括目的范围、预期读者和文档结构等;

AI Python 编程之道的博客 1433

LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组)

LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法、机器学习干货 csdn:https://blog.csdn.net/baidu_31657889/ csdn:https://blog.csdn.net/abcgkj/ github:https://github.com/...

小明的博客 1190

人工智能训练师三级考试题型全解析|190道真题样例+30天备考路线

人工智能训练师三级考试并不神秘:理论考190道选择题(刷题就能过),实操考代码+方案设计(练练就会)。核心是花时间——30天系统备考,足以从容通过。如果你想从零开始系统备考,覆盖所有考点和实操技能,欢迎查看我的专栏:📖《人工智能训练师三级·从零到拿证完全指南》80篇系统化内容,覆盖报名、备考、冲刺、拿证全流程六大模块知识点逐个击破,每个考点都讲透实操代码题手把手教学,附带完整参考代码高频考点速记 + 易错题精讲 + 3套模拟试卷30天备考计划 + 冲刺复习策略。

白话机器学习 6097

Shuffle an Array (水塘抽样)

随机性问题 水塘抽样算法可保证每个样本被抽到的概率相等 使用场景:从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到主内存的情况 Knuth洗牌算法 拿起第i张牌时,只从它前面的牌随机选出j,或从它后面的牌随机选出j交换即可 1 class Solution { 2 public: 3 Solution(...

weixin_30418341的博客 143

【nnUNetv2进阶】三、nnUNetv2 自定义网络-发paper必会

对于很多朋友来说,找到nnunet的网络结构位置的代码可能比较困难,因为nnunet的网络结构从else:代码中没有网络结构的类名,那么使用的网络是哪个呢?打开预处理后的数据集中的nnUNetPlans.json文件,如下图,configurations里面有2d、3d_fullres等,这些表示nnunet的模型,下面的network_class_name指的就是训练使用的模型结构,一般都是PlainConvUNet。

AI爱好者的博客,分享计算机领域相关知识 8759

Modbus协议介绍及解析

Modbus协议介绍及解析 1.Modbus简介 Modbus是一种广泛应用于工业控制领域串行通信协议,以其开放性、高可靠性、高效简单性、免费等优点,成为了工业领域通信协议的业界标准,是工业现场电子设备之间常用的连接方式。Modbus按其格式可分为Modbus-RTU,Modbus-ASCII,Modbus-TCP,其中前两者适用于串行通信控制网络中,例如RS485,RS232等,而Modbus-TCP主要应用于基于以太网TCP/IP通信的控制网络中。通过此协议,控制器相互之间、或控制器和其它设备之间进行通

逍遥子的博客 1万+

LeetCode //C - 384. Shuffle an Array

【代码】LeetCode //C - 384. Shuffle an Array。

Made in Code 938

【测开求职】面试题:JAVA 吐血整理

本篇文章包含本次测开工程师秋招过程中遇到的所有JAVA面试题,全文两万字,亲测应对各个大厂的面试毫无压力👉

vector的博客 1213

Leetcode 384. Shuffle an Array (python+cpp)

Leetcode 384. Shuffle an Array题目解法:Fisher-Yates Algorithm 题目 解法:Fisher-Yates Algorithm 通过调换数组位置的方式产生随机

qq_37821701的博客 259

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

[leetcode] 384. Shuffle an Array 解题报告

题目链接: https://leetcode.com/problems/shuffle-an-array/ Shuffle a set of numbers without duplicates. Example: // Init an array with set 1, 2, and 3. int[] nums = {1,2,3}; Solution solution = ne

小榕流光的专栏 3874

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Leetcode 384. Shuffle an Array (Medium) (cpp)

Leetcode 384. Shuffle an Array (Medium) (cpp)

还是需要多学习!闷声大发财,这是坠吼的! 470

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Leetcode 384.打乱数组(Shuffle an Array)

Leetcode 384.打乱数组 1 题目描述(Leetcode题目链接)   打乱一个没有重复元素的数组。 // 以数字集合 1, 2 和 3 初始化数组。 int[] nums = {1,2,3}; Solution solution = new Solution(nums); // 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。 solution.shuffle(); // 重设数组到它的初始状态[1,2,3]。 solution.reset(); //

qq_39378221的博客 532

LeetCode-384. Shuffle an Array [C++][Java]

Given an integer arraynums, design an algorithm to randomly shuffle the array. All permutations of the array should beequally likelyas a result of the shuffling.

贫道绝缘子的博客 1242

【LEETCODE】384- Shuffle an Array [Python]

【LEETCODE】384- Shuffle an Array [Python]

aliceyangxi1987的博客 2688

[leetcode] 384. Shuffle an Array

Shuffle a set of numbers without duplicates. Example: // Init an array with set 1, 2, and 3. int[] nums = {1,2,3}; Solution solution = new Solution(nums); // Shuffle the array [1,2,3] and return

TstsUgeg的博客 1884

leetcode 384. Shuffle an Array

Shuffle a set of numbers without duplicates. Example: // Init an array with set 1, 2, and 3. int[] nums = {1,2,3}; Solution solution = new Solution(nums); // Shuffle the array [1,2,3] and return

淡然坊 490

LeetCode 384. Shuffle an Array 题解(C++)

Shuffle a set of numbers without duplicates.

prayyojay的博客 451

LeetCode(384):打乱数组 Shuffle an Array(Java)

2019.10.5 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新) github:https://github.com/ChopinXBP/LeetCode-Babel 一道经典的洗牌问题,可以用Fisher-Yates洗牌算法。遍历每一个元素i,将i与i之后的一个随机元素j互换。随机元可以通过random.nextInt(max - min) + min生成。 传送门...

NJU_ChopinXBP的博客 426

[Leetcode]384. Shuffle an Array

384. Shuffle an Array题目[leetcode链接] Shuffle a set of numbers without duplicates.Example:// Init an array with set 1, 2, and 3. int[] nums = {1,2,3}; Solution solution = new Solution(nums);// Shuffle

沫沫的进阶之路 370

【Leetcode】384. Shuffle an Array

思路是Knuth洗牌算法。返回初始数组是简单的,直接开一个数组存一下即可。洗牌的话用Knuth洗牌算法非常方便(参考。1、将其洗牌后返回,要求每个排列出现概率相等;初始化和洗牌的时间复杂度。

数学、算法爱好者的博客 224

【Leetcode】Shuffle an Array

题目链接:https://leetcode.com/problems/shuffle-an-array/ 题目: Shuffle a set of numbers without duplicates. Example: // Init an array with set 1, 2, and 3. int[] nums = {1,2,3}; Solution solution

业精于勤,荒于嬉 3298
上一篇: C/C++ 数据输入模板
下一篇: LintCode 463: Sort Integers (QuickSort和MergeSort 经典模板!!!)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值