生活中用过最高级的算法知识(什么是顶尖算法)

蝉的生命周期为什么是13或17这种素数。

这个是邓俊辉老师在讲解“hash函数的除数取余法为什么尽量取素数”时讲到的,感觉数据结构和算法很神奇,大自然更神奇。

“我们知道在实际应用中,我们所处理的数据通常都具有一定的局部性。其中一种典型的现象是:数据序列中的数据项 大多是按某一步长单调变化。如果数据序列的步长为S,我们来考察S与M(散列表最大长度)的最大公因子,将其记作G。

而你的数据序列,将从某一个位置开始,以S为间隔,逐次的转入下一项,以及再下一项。当然如果你的数据序列足够长,它就有可能会从另一端回到这个空间,并且继续以S为间隔在散列地址空间中逐次访问下去。

生活中用过最高级的算法知识(什么是顶尖算法)图1

现在考察这个数据序列在散列地址空间中留下的足迹,这些足迹能够遍历整个散列表空间吗?如果能,那么这种散列方法就具有均匀性;反之就不具有。

借助数论的知识不难知道,数据序列的足迹能够遍布整个散列表,当且仅当刚才这个最大公因子等于1。请注意,因为可能有不同的程序,而每个程序的每一次运行所对应的这个步长,必然未必相等。也就是说,这里的M,相对于几乎任何S最大公因子都只能是1,这意味着什么呢,意味着M应该是一个素数。

生活中用过最高级的算法知识(什么是顶尖算法)图2

很有意思的是,很多动物,包括一些昆虫都懂得这个道理。在这里我们再次向蝉学习,学习它的哲学。昆虫学告诉我们,蝉有很多变种,每一个变种都有其固定的生命周期,比如有些蝉是13年,而有些却是17年,为什么没有14、15或16呢?

不妨回到我们的散列表。实际上,每一只蝉的生命周期,都可以对应为一个散列表。蝉的寿命有多长,散列表也就有多长,所以有些种类的蝉所对应的散列表长度为13,有些对应于17,当然也可能是11等等这类的素数。

我们知道在自然界蝉是弱势群体,它有很多天敌,每一种天敌大致也有一个自己的生命周期,这就相当于我们这里的步长S,每经过S年,蝉的天敌都会更新一代。当然。蝉不能去改变弱肉强食的法则,它唯一能期望的只能是,在同一年,不要遇到更多的天敌。相应的,反过来,所有的天敌都应该在每一年分布的更加均匀,这更有利于蝉作为一个物种得以在自然界延续下去。

用数学的语言来说,如果蝉能够选择自己的生命周期,那么自然的就应该选择与天敌的生命周期保持最大公约数为1,而为了与更多的天敌在生命周期上保持这种关系。尽管蝉有不同的变种 但是在经过长时间的进化之后,每一个变种都会聪明的将其生命周期设定为素数,正像我们所看到的那样 取做17,13等等。”

上面这一大长段解释出自学堂在线的邓俊辉老师的课《数据结构与算法》第九章“词典”第三节“散列:散列函数”,基本上都取自老师的字幕,略有修改。邓老师这门课讲得太棒了,春风化雨,旁征博引,极其用心。教材内容、课件制作、讲课语言无一不充满美感。这是一门融计算机、数学、哲学、艺术于一体的课,我也不知道该怎么夸了,算了,不夸了。

版权声明:本文来自用户投稿,不代表【闪电鸟】立场,本平台所发表的文章、图片属于原权利人所有,因客观原因,或会存在不当使用的情况,非恶意侵犯原权利人相关权益,敬请相关权利人谅解并与我们联系(邮箱:dandanxi6@qq.com)我们将及时处理,共同维护良好的网络创作环境。

(0)
上一篇 2023年09月04日 11:06
下一篇 2023年09月04日 11:18

相关推荐