随机化算法基础
来源:互联网 发布:查看linux系统编码格式 编辑:程序博客网 时间:2024/04/30 12:11
随机化算法在分析某些涉及概率分析的问题上具有重要意义,因为输入的分布是我们不能预知的,我们想让分析的问题达到一个平均的状态,就得依靠随机化,把输入分布重新排列,使之成为一个脱离其他外界因数的排列,同时要保证出现这个排列的概率为1/n!。
下面,有两个常用的算法来实现输入分布的随机化,以给定的输入数组为例,我们的目标是把A[1..n]随机排列。
方法一:
为数组的每个元素A赋一个随机的优先级P,然后依据优先级对数组A中的元素进行排序。例如,数组A = {1,2,3,4},选择一个随机优先级P = {36,3,97,19},将得出数组A的排列B = {2,4,1,3},因为第2个优先级最小,其次是第4个,第1个,第3个。
这个过程称为permute_by_sorting
permute_by_sorting(A)
1 n <- length[A]
2 for i <- 1 to n
3 do P = RANDOM(1,n^3)
4 sort A,using P as sort keys
5 return A
其中第3步选择的随机数范围1--n^3是为了让产生的随机数尽可能的唯一。此过程消耗的时间将由第4步的排序决定,如果使用基于比较的排序,这个时间下界可以达到nlgn(合并排序……),其中排序的方法与普通排序一样,对P进行排序,多的只是在这个过程中将A按P的优先级排序。
方法二:
一个更好的原地排序(in place)给定的数列。过程randomize_in_place在O(n)的时间内完成。在第i次迭代时,元素A是从A到A[n]中随机选取的。第i次迭代之后,A保持不变。
randomize_in_place(A)
1 n <- length[A]
2 for i <- 1 to n
3 do swap A <-> A[RANDOM(i,n)]
证明这两个随机算法产生排列的概率为是均匀的即 1/n! ,需要用的概率分析的内容,这里不再验证(自己也知之甚少)。
同时,并非所有的随机化都是这个模式,这里只说明了常用的模型。例如在quick_sort中使用随机化使时间接近最优时,只需要在选择pivot时作一个随机选择。对于这个模型的具体实例,我在以后的学习中遇到将会添加。
- 随机化算法基础
- 算法基础4:快速排序(随机化版本)
- 随机化算法
- 随机化算法
- 【随机化算法】
- 随机化算法
- 随机化算法
- 随机化算法
- 随机化算法
- 随机化算法
- 随机化算法
- 随机化算法
- 随机化算法
- 随机化算法
- 随机化算法-数值随机化算法
- 随机化算法-----遗传算法
- 素数判定随机化算法
- 随机化算法-----模拟退火
- stl算法:next_permutation剖析
- IIS 7 新的日志报表,数据库管理,和其他很酷的管理模块
- .NET 3.5 客户端产品路线图
- 开发asp.net自定义控件
- 面部皱纹可表达身体健康状况(图)
- 随机化算法基础
- C#基础概念二十五问
- 数据结构:堆
- 在Eclipse中配置Grails工程
- 点石互动--石头之:石头论seo:网站被删与seo本质
- 利用Jakarta Commons组件beanutils、dbutils简化JDBC数据库操作
- VS2005 SP
- 我的失败
- Tapestry 整合 Acegi