现在有这样一个问题,
假设A,B, C初始各有1块钱,每轮A将自己的钱一半给B, 一半给C, B将自己的钱全部给C, 而C将自己的钱全部给A。
第一轮: A 1元, B 1元, C 1元。
第二轮: A 1元, B 0.5元, C 1.5元
第三轮: A 1.5元, B:0.5元, C1元
第四轮: A 1元, B:0.75元, C 1.25元
........
问若干轮后, A,B,C的钱数是否收敛, 收敛到什么值。
这个问题如果用反复计算的“笨”方法解, 有如下思路,
我们把任务分配者称为Manager,任务执行者称为Worker,
Manager将任务分为A,B,C三个,并且分别给Worker执行,
第一轮
step1
WorkerA执行A 任务,发现A任务执行的两个结果 0.5B, 0.5C。
WorkerB执行B任务,发现执行结果1C
WorkerC执行C任务,发现执行结果1A
这个过程称为map
step2
WorkerA, B, C将任务结果还给Manager, Manager合并结果
A 1 B 0.5 C 1+0.5
在这个过程中Manager不停轮询WorkerA,B,C, 当A,B,C计算未完成时返回null, 计算完成则返回结果.
还有另外一种执行流程
WorkerA, B,C将处理结果中A的部分交给一专门处理A的WorkerA', B的部分交给WorkerB', C的部分交给WorkerC'。
然后由相应的WrokerA' B' C'执行合并过程。
等工作全部完成后再把最终结果传输给Manager。Manager在此过程中可以睡眠等。
这个过程称为reduce。
两种流程各有优劣,首先第二种流程因为多一次传输,传输量较大,其次, 各个机器负载也不相同。
再经过n轮计算后,我们可以发现,A,B,C的钱数确实收敛。
实际上,A,B,C的钱数之和不变,那么结果总是收敛的。在已知收敛的情况下,我们可以这么计算。
a = c
b = a/2
c = a/2 + b
a =2b = c
a +b +c = 3
则a =1.2 b=0.6 c=1.2, 既a, b, c收敛的数值。因为收敛意味着极限存在,极限值即是满足上述等式的"稳定值"。
现在换一个假设,想定A, B, C为三个网页,其中A网页引用B, C网页, B网页引用C网页, C网页引用A网页。那么A,B,C的权重是多少?
算法就在上面了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26899445/viewspace-756111/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26899445/viewspace-756111/