此前我 “自然而然” 做了两个小算法,最短路径 和 最小生成树,我喜欢大自然的第一性原理,最小作用量,梯度下降,爆炸,河水泛滥,本质上都是一回事。
大自然另一风格是分布式并行,没外力的熵增本身就是分布式并行过程,它和上述那些例子殊途同归,但如果熵减过程也如此,就可用于自组织了。以最短路径为例,rip 路由协议就如此,但 ospf 不是,后者通过交互形成统一视图,再集中计算,颇具人为风格,并不自然。
如果时间精确任意小,sleep(v) 样式的排序算法最快,且完全可扩展,与排序规模无关,这是另一种自然而然的算法,与人类风格的串行 + 统筹方法的风格截然相反,计算机无疑模拟了人的风格。
推而广之,整个自然界一直在执行 sleep(v) 样式的算法。
今天(自入梅每天都冒大雨甚至暴雨跑环城河)冒大雨跑环城河一圈,途中想到一个自然风格的最短路径算法:
非常自然,用计算机做却非常笨拙,就像计算机做 sleep(v) 风格的排序一样被人诟病,因为太慢!难道不是因为计算机太笨了吗?如果计算机调度时间精度可低到冒泡,快排的指令时间,这种算法就能逞能了。
若用计算机做上面烧绳子算法,简单来讲也能 sleep:
- 初始化,构建所有节点邻居表,设所有节点属性为 false,设 S 为 p;
- 为 p 每个 false 邻居生成一个 thread,在 thread 中 sleep(边权重),若无邻居,终止;
- thread wakeup 后:
- 若邻居节点为 false,设为 true,重复上一步;
- 若邻居节点为 true,将该边 block,终止 thread;
很简单,无需任何主动松弛操作,靠自然力松弛,但在计算机看来却非常笨拙。
计算机看它笨拙前面提到,是计算机的时间精度太粗糙,但在本身就更大的时间尺度,这种算法就高尚,类似 rip,stp 都是消息交换驱动的分布式算法,本算法也不例外,它的目标就是一棵最短路径树,天然解决了 rip 的环路问题,很高尚。
与这个类似的就是前面那个 最小生成树 算法,都是分布式并行操作。
浙江温州皮鞋湿,下雨进水不会胖。