Mo1a's blog

分类 · 算法

首页

关于

归档

algorithm

Knuth洗牌算法

Knuth算法是一种非常常用的洗牌算法,它在很多方面都有着广泛的应用。本文需要一定的概率论知识,包括排列组合、古典概型和条件概率。 问题分析洗牌其实是一种取随机的算法,只有每一面牌在序列中的任意位置出现的概率都相同的时候,我们才可以说一个随机算法是公平的。 最容易想到的公平洗牌方式大概是这种:有n张牌,这n张牌自由组合共有n!个组合,每次只要随机且等可能地从这n!种情况内选取一项,就可以得到一种随机的排列,也就是一次洗牌。那么问题就来了,n在小的时候,n!的数值大小仍可计算,而当n逐渐增大到一定值的时候,n!就会变得不可计算了起来,要随机取得一个情况要耗费的开支太大,时间复杂度达到了o(n!)。 那么,有没有别的方法可以保证一次洗牌开销没那么大而每张牌在任一位置的概率都相等呢? 算法分析我们可以借鉴下插..

更多
algorithm

C语言数字、指针、布尔值灵活利用的典范

先思考这个问题,假设我有一组数,我需要在每两个数字中间加入一个空格然后再输出出来,末尾和头部都没有空格,应该如何实现。 实现方法很简单,加个if就可以实现了,比如我想输出1 2 3 4 5 6,就可以这样: #include<stdio.h> int main() { int arr[6] = { 1, 2, 3, 4, 5, 6 }; for (int i = 0; i < 6; i++) { if (i == 5) //输出到最后一个数字了 printf("%d", arr[i]); else printf("%d ", arr[i]); } return 0; } ..

更多