第七章:其他算法
这里还有一些零碎的优秀算法,但是不好划分到前面的章节中,因此这里就集中归类在一起;
1.欧几里得算法
这个算法是用来求两个数的最大公约数的;比如将第一个数设置为a,第二个数设置为b,具体的逻辑是:
- 求a%b的值,如果这个值不是0,则将b赋值给a,将这个值赋值给b,继续下一个循环
- 如果a%b的值为0,那么b就是两个数的最大公约数
2.素性测试
这是个很有意思的算法,作用是判断某个大数是质数的可能性大不大;这个测试基于这样一个事实:
x
y
%
y
=
x
x^y\%y=x
xy%y=x
其中,y是质数,x是任意的整数;
不过有一个小问题:对于质数,这样的等式恒成立,但对于非质数这样的式子也有可能成立;我们的策略是:多进行几次检测,如果一个大数能总是通过相当多的检测,那么它是质数的可能性会更大;
即使我们进行几十次这样的检测,也比直接检测是否为质数耗费的时间小得多,因此这是一种十分划得来的算法;
3.网页排名算法
网页排名也称佩奇算法(别误会,此佩奇非彼佩奇);这个算法决定你在用Google或者其它搜索引擎时,它将哪个网页放在第一位,将哪个网页放在第二位;换句话说,这个算法计算的是网页的重要性;
网页排名的算法有两种;下图展示了几个网页之间的链接关系我们先来讨论第一种算法:
箭头表示了网页之间的链接,我们定义:一个网页所有链接的的总权重为1,每个链接的权重为本页面的权重/链接总数;每个网页的权重等于所有指向它的链接的权重的总和;没有链接指向的网页权重为1;
现在我们计算上图中各网页的权重:
这个算法简单粗暴,并且存在一个问题,它没办法计算这样的网页:
如果使用上面的算法,abc这三个页面的权重都是正无穷,这显然是不行的;针对这个问题,我们有 “随机游走模型”:将用户的浏览行为分为两类,第一种是乖乖的沿着链接浏览,另一种是直接从另一个毫不相关的网页开始浏览;
如果我们给用户突然去往另一个毫不相关的网页设一个概率,那么我们就可以多次模拟计算,这时每个网页就会有访问量的差别;比如将突然离开的概率设为15%时,上面网页的访问次数变化是:
也就是:
重新使用这个算法计算第一个网页图:
4.汉诺塔
这个问题其实没什么好说的;它的核心思想是:大事化小,小事化了;对于一个问题,我们退而求其次的去解决一个小一点的问题,然后稍加修补它就能解决一个大一点的问题;而对于小一点的问题,我们退而求其次解决更小一点的问题再稍加修补…
总之汉诺塔就是这样一种游戏:要完成一个圆盘的汉诺塔很容易,而两个不过是比一个多一个圆盘罢了;三个也不过是比两个多一个罢了…总之一个巨大的问题可以不断划分为比较小的问题来解决,而小的问题又能划分为更小的问题来解决;层层递进,巨大的问题就得以解决了;
当然这么讲并不细致,毕竟递归算是一种比较精巧的设计;