《算法图解》读书笔记-10

第七章:其他算法

这里还有一些零碎的优秀算法,但是不好划分到前面的章节中,因此这里就集中归类在一起;

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或者其它搜索引擎时,它将哪个网页放在第一位,将哪个网页放在第二位;换句话说,这个算法计算的是网页的重要性;

网页排名的算法有两种;下图展示了几个网页之间的链接关系我们先来讨论第一种算法:

a
b
c
d
e
f

箭头表示了网页之间的链接,我们定义:一个网页所有链接的的总权重为1,每个链接的权重为本页面的权重/链接总数;每个网页的权重等于所有指向它的链接的权重的总和;没有链接指向的网页权重为1;

现在我们计算上图中各网页的权重:

1
1
1
3
4
1

这个算法简单粗暴,并且存在一个问题,它没办法计算这样的网页:

a
b
c
d

如果使用上面的算法,abc这三个页面的权重都是正无穷,这显然是不行的;针对这个问题,我们有 “随机游走模型”:将用户的浏览行为分为两类,第一种是乖乖的沿着链接浏览,另一种是直接从另一个毫不相关的网页开始浏览;

如果我们给用户突然去往另一个毫不相关的网页设一个概率,那么我们就可以多次模拟计算,这时每个网页就会有访问量的差别;比如将突然离开的概率设为15%时,上面网页的访问次数变化是:

332次访问
320次访问
310次访问
38次访问

也就是:

0.332
0.320
0.310
0.038

重新使用这个算法计算第一个网页图:

0.09
0.09
0.09
0.27
0.36
0.09

4.汉诺塔

这个问题其实没什么好说的;它的核心思想是:大事化小,小事化了;对于一个问题,我们退而求其次的去解决一个小一点的问题,然后稍加修补它就能解决一个大一点的问题;而对于小一点的问题,我们退而求其次解决更小一点的问题再稍加修补…

总之汉诺塔就是这样一种游戏:要完成一个圆盘的汉诺塔很容易,而两个不过是比一个多一个圆盘罢了;三个也不过是比两个多一个罢了…总之一个巨大的问题可以不断划分为比较小的问题来解决,而小的问题又能划分为更小的问题来解决;层层递进,巨大的问题就得以解决了;

当然这么讲并不细致,毕竟递归算是一种比较精巧的设计;

你可能感兴趣的:(算法)