Erlang练习:洗牌算法——将一个序列打乱,类似于Python里面的shuffle函数。
2013-04-04 13:36
357 查看
问题的来源:
问题描述:假设有一个数组,包含n个元素。现在要重新排列这些元素,要求每个元素被放到任何一个位置的概率都相等(即1/n),并且直接在数组上重排(in place),不要生成新的数组。用 O(n) 时间、O(1) 辅助空间。
算法的证明:
来计算一下概率。如果某个元素被放入第i(1≤i≤n)个位置,就必须是在前
i - 1 次选取中都没有选到它,并且第 i 次选取是恰好选中它。其概率为:
pi=n−1n×n−2n−1×⋯×n−i+1n−i+2×1n−i+1=1n
可见任何元素出现在任何位置的概率都是相等的。
网上的资源:
http://www.gocalf.com/blog/shuffle-algo.html
http://coolshell.cn/articles/8593.html
Fisher_Yates算法的Erlang实现:
不足:Erlang里面对lists处理的函数有些不足,没有对下标为i的元素进行操作的函数,所以就将其转换为tuple进行处理了。
问题描述:假设有一个数组,包含n个元素。现在要重新排列这些元素,要求每个元素被放到任何一个位置的概率都相等(即1/n),并且直接在数组上重排(in place),不要生成新的数组。用 O(n) 时间、O(1) 辅助空间。
算法的证明:
来计算一下概率。如果某个元素被放入第i(1≤i≤n)个位置,就必须是在前
i - 1 次选取中都没有选到它,并且第 i 次选取是恰好选中它。其概率为:
pi=n−1n×n−2n−1×⋯×n−i+1n−i+2×1n−i+1=1n
可见任何元素出现在任何位置的概率都是相等的。
网上的资源:
http://www.gocalf.com/blog/shuffle-algo.html
http://coolshell.cn/articles/8593.html
Fisher_Yates算法的Erlang实现:
-module(shuffle). -compile(export_all). shuffle(L) -> shuffle(list_to_tuple(L), length(L)). shuffle(T, 0)-> tuple_to_list(T); shuffle(T, Len)-> Rand = random:uniform(Len), A = element(Len, T), B = element(Rand, T), T1 = setelement(Len, T, B), T2 = setelement(Rand, T1, A), shuffle(T2, Len - 1). main()-> shuffle(lists:seq(1, 10)).
不足:Erlang里面对lists处理的函数有些不足,没有对下标为i的元素进行操作的函数,所以就将其转换为tuple进行处理了。
相关文章推荐
- 算法 - 有一个连续整数序列,里面随机存放的是0到99这100个不重复的整数,要求对该序列排序。
- 洗牌算法:随机打乱一个数组的顺序
- 洗牌算法:随机打乱一个数组的顺序
- 用Erlang实现一个组合算法
- 2018年全国多校算法寒假训练营练习比赛(第三场) B 一个小问题【CRT 扩展中国剩余定理 板子题】
- 每天一个python小程序 007有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来。
- 阿里巴巴面试算法题:有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N
- 阿里巴巴 2015 实习笔试题 分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出
- 算法优化的一个尝试 python
- 高效的算法求解一个序列的主元素
- 看到别人的Python爬虫博客,自己也模仿着写一个,顺便练习一下python
- 2018年全国多校算法寒假训练营练习比赛(第二场) E 小G有一个大树(树状DP 未解决)
- 牛客网python算法练习(三)二维数组的查找
- 【DAY.9】php随机打乱数组顺序(洗牌算法实现)
- 算法习题47:求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
- 把一个连续数序列打乱判断少了那些数
- 给你一个由n-1个整数组成的未排序的序列,其元素都是1到n中的不同的整数。请写出一个寻找序列中缺失整数的线性时间算法。
- 设计一个算法,将R中的序列循环左移P个
- python读取一个目录下所有txt里面的内容方法
- 最长递增子序列_python_算法与数据结构