Java实现完美洗牌算法】的更多相关文章

1 问题描述 有一个长度为2n的数组{a1,a2,a3,-,an,b1,b2,b3,-,bn},希望排序后变成{a1,b1,a2,b2,a3,b3,-,an,bn},请考虑有没有时间复杂度为O(n)而空间复杂度为O(1)的解法. 2 解决方案 2.1位置置换算法 下面算法的时间复杂度为O(n),空间复杂度为O(n). package com.liuzhen.practice; public class Main { //对于数组A第i个位置的元素都最终换到了2*i % len的位置 public…
目录 1 问题描述 2 解决方案 2.1位置置换算法 2.2 走环算法   1 问题描述 有一个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后变成{a1,b1,a2,b2,a3,b3,...,an,bn},请考虑有没有时间复杂度为O(n)而空间复杂度为O(1)的解法. 2 解决方案 2.1位置置换算法 下面算法的时间复杂度为O(n),空间复杂度为O(n). 具体代码如下: package com.liuzhen.practice; public c…
[转]原博文地址:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.09.md 完美洗牌算法 题目详情 有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解法. 题目来源:此题是去年2013年UC的校招笔试题,看似简单,按照题目所要…
完美洗牌问题,给定一个数组a1,a2,a3,...an,b1,b2,b3..bn,把它最终设置为b1,a1,b2,a2,...bn,an这样的. O(n)的算法,O(n)的空间. 对于前n个数,映射为f(i)=2 * i + 1, 0 <= i < n / 2; 比如0->1, 1->3 对于后n个数,映射为f(i)=2(i - n/2), n / 2 <= i < n; 比如n/2->0, n/2 + 1->2... 并且f(i) =2(i - n/2)=…
首先来思考一个问题: 设计一个公平的洗牌算法 1. 看问题,洗牌,显然是一个随机算法了.随机算法还不简单?随机呗.把所有牌放到一个数组中,每次取两张牌交换位置,随机 k 次即可. 如果你的答案是这样,通常面试官会进一步问一下,k 应该取多少?100?1000?10000? 很显然,取一个固定的值不合理.如果数组中有 1000000 个元素,随机 100 次太少:如果数组中只有 10 个元素,随机 10000 次又太多.一个合理的选择是,随机次数和数组中元素大小相关.比如数组有多少个元素,我们就随…
1.算法 http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle 简单的原理如下图所示: 2.原理 总结下,洗牌算法Fisher_Yates的原理就是把从1到n的顺序候选集随机打乱, 做法就是 第1次从1-n的候选集合随机选个数,拿出此数,并把它从候选集合剔除(候选集合n-1). 第2次从1-n-1的候选集合随机选个数,拿出此数,并把它从候选集合剔除(候选集合n-2). 第2次从1-n-2的候选集合随机选个数,拿出此数,并把它从候选集合…
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   C#洗牌算法如下: class Program { static void Main(string[] args) { List<string> list = new List<string>(); Init(list); XiPai(list); Print(list); DiPai(list); list.Clear(); } st…
function shuffle(arr){ var len = arr.length; for(var i = 0;i<len -1;i++) { var idx = Math.floor(Math.random() * (len - 1)); console.log("idx",idx); var temp = arr[idx]; console.log("temp",temp); arr[idx] = arr[len - i - 1]; console.…
1,缘起 最近工作上遇到一个问题,即将一组数据,比如[A,B,C,D,E]其中的两个B,E按随机排列,其他的仍在原来的位置: 原始数组:[A,B,C,D,E] 随机字母:[B,D] 可能结果:[A,B,C,D,E],[A,D,C,B,E] 在解决这个问题的过程中,需要解决的一个问题是,怎么样让一个数组随机排序?上网一查,这也是计算机科学基础问题,也称之为洗牌算法(Shuffle Algorithm). 2,问题及解决 2.1,问题 很简单:给定一个数组,将其中的元素随机排列.比如给定数组arry…
1. 问题 给定一个全零矩阵的行和列,实现flip函数随机把一个0变成1并返回索引,实现rest函数将所有数归零. 2. 思路 拒绝采样 (1)先计算矩阵的元素个数(行乘以列),记作n,那么[0, n-1]相当于矩阵下标对应的一维索引. (2)用一个arrays数组存放矩阵元素为1的索引.每次从 [0, n-1]取数,这个数可以表示矩阵元素的索引,如果取的数已经在这个数组里,说明这个索引对应的矩阵元素已经被flip为1了,则放弃,继续取数,直到取到的数不在数组里(对应的矩阵元素为0),就把取到的…