很多程序员可能会认为算法和数据结构很重要,但门槛又很高,学习成本起来很痛苦。作为非科班出身的我来说,同样如此。不过在接触分形理论之后,我发现二叉树、平衡树等分治算法可以通过它来简单理解。因此将自己的想法分享出来,大家一起探讨。
本篇文章英文版同步发布在 dev.to,技术分享无国界,欢迎大佬们指点。
下面是正文。
“话说天下大势,分久必合,合久必分。” --《三国演义》罗贯中
很少有人能质疑算法( Algorithm )在现代 IT 行业中的重要地位。正是有了巧妙设计的算法,计算机才能以最小的资源和最大的效率来运行各种各样的软件程序。因此,算法非常重要,以至于不少 IT 企业在招聘工程师时对算法要求非常高。回忆一下你参加过的技术面试被要求手写快速排序的算法题吧。不少人会认为算法是高屋建瓴的东西,然而笔者却认为算法以及数据结构产生的效率增益是自然形成的,这个可以从大自然中找到答案。
我们都知道,一片雪花很漂亮,除了它明亮的外表以外,令人惊叹的还有其造型:整体像雕琢过的六边形,每个角放大来看又是新的类似雪花的子六边形。这种自相似( Self Similarity )不断递归( Recursion )的结构有个专业术语,分形( Fractal )。分形在大自然中随处可见,例如树的根系和枝叶、肺部毛细血管、天然形成的海岸线,数不胜数。甚至连一块摔碎的玻璃,也能找到分形的影子。
那么,为什么?分形为什么普遍存在于大自然?是上帝的特意安排还是巧妙的数学规律?学术界普遍认为是后者。根据热力学原理,雪花是在水蒸气突然凝结时形成的,而雪花状的构造能让自由流动的水分子在短时间里在最小的空间中释放最大的能量,从而形成稳定的晶体结构;根据流体力学,肺部的树状毛细血管结构能让呼吸进来的氧分子最大程度的被红细胞吸收。因此,分形的结构是因效率原因而产生的。
现在说回分治算法。熟悉算法的同学应该对分治法不陌生,例如快速排序( Quick Sort )就是典型的分治算法。而其之所以快,就是因为递归的将一个整体分成最小颗粒度的大小比较再合并回来,即自相似递归操作,跟分形原理如出一辙。再说数据库中的平衡树( B-tree )索引,也应用到了分形原理:将无序的数据通过树状结构一层一层的构造下去,形成一个数据索引,能让检索变得更快,而优化平衡树参数的过程就是在优化检索效率。平时学习复杂度分析中经常看到的 LogN 就是来自于分形结构产生的等差数列求和。读者可以试着在笔记本上推演一下,运用初中数学知识就能得到最优的参数方程。
分形理论是一个较新的学科,现代很多科学研究都将其与复杂系统理论( The Theory of Complex Systems )联系在一起。很多复杂的系统,其实都由一些非常简单的物质或规律构成。例如,逢山开路、遇水架桥的蚁群很像智慧生物体,靠的只是一些信息素;而生命全来自于细胞,细胞来自于 DNA ,DNA 来自于更小的微观物质(分子、质子、中子等)。这些简单的物理模型套用起来,就形成了世间万物。所谓古人的 “大道至简”、“一花一世界,一叶一菩提”,说的正是这个道理。
虽然分形理论能解释大自然中的很多构造,但它并不完美。因为大自然中的自相似并不是完全等同,而是在递归的过程有一些不确定性的变化,产生了多样性。因此,我们在惊叹于强大的分形理论时,也需要意识到它并不是完美的。世界上很多东西还需要我们继续探索。
如果您对笔者的文章感兴趣,可以加笔者微信 tikazyq1 并注明 "码之道",笔者会将你拉入 "码之道" 交流群。