1977 年法国人 Philippe Flajolet 发表了一篇评估计算机展开算术表达式平均所需寄存器数量的论文 [1]。同年,普林斯顿的 Rebert Sedgewick 向 SIAM 投递了一篇讨论奇偶归并排序的文章 [2],其中给出了数据在排序过程中平均交换次数的简洁表达式。Sedgewick 通过渐进分析获得的这个表达式后来被发现和 Flajolet 用于评估寄存器数量的式子具有同一性。Flajolet 后来给 Sedgewick 写信说:

> I believe that we have a formula in common!

这让我想到了杨振宁的杨-米尔斯规范场论与陈省身早前所做的纤维丛中的联络论之间美妙的同一性。同样的巧合发生在了理论计算机领域,而这一次则表征着渐进分析法的胜利。这一经典的数学分析工具早在18世纪就由欧拉和迈克劳伦初步建立,直到20世纪50年代末趋于完善,目前依然是算法分析最有效的系统方法之一。即便现今任何一台小型计算机的处理器都能轻松胜任大数值计算(例如 2^10000 的阶乘),但渐进分析所提供的极高精度的表达式依然具有极高的效率和简洁性。经典数学分析所提供的信息量和对问题的深入洞见是无法被强力计算所替代的。

后来 Sedgewick 成为了算法分析领域的大牛,沿着他的导师高德纳的足迹越走越远。而 Flajolet 在法兰西的另一边走火入魔般地使用分析方法研究组合数学。和所有狗血的基友故事一样,他俩的渊源远没有就在一则公式上打住,1980 年两人决定合写一本有关算法分析的教材,1986 年 Sedgewick 开始在普林斯顿计算机学院开设算法分析课程,十余年间积累了大量的课程讲义和技术报告材料,1992 年,Flajolet 在组合数学上的研究取得系统性成果,两人决定将写作计划由原来的一本拆分为两本不同侧重的专著。1995 年两人合著的第一本书《算法分析导论》(以下简称 AoA)出版,以生成函数(Generating Functions)为核心,系统地介绍了自伯努利、欧拉以来被广泛使用的算法分析工具,其中包含了一些高德纳在《计算机编程艺术》前三卷中所涵盖的主题,主要是递归、生成函数和渐进分析。这些主题完整地定义了算法分析的科学基础,也从数学上证明了人们可以准确地估计和比较算法的运行效率。AoA 还给出了大量的分析应用,包括二叉树、森林、排序、字符串、分词和映射的边界统计分析。除此之外,AoA 最精彩的部分莫过于对分析组合学浅尝辄止的介绍,这部分内容为传统的算法分析和组合学架起了桥梁,使得计算机科学家能够将组合数学的简洁性移植到算法分析过程中去。Flajolet 和 Sedgewick 将这部分内容在 2009 年出版的《分析组合学》中进行了完整、系统化地阐释,史无前例地将数学分析工具大规模地应用到符号化的组合数学上,并获得了一些异常简洁而令人惊叹的结论,而这些结论不仅相容于传统的算法分析,而且更进一步地揭示了一些用传统方法很难解释或证明的现象。Flajolet 和 Sedgewick 开创性地使用数学分析方法获得了巨大的成功,又一次带来这个世界的一切都存在着奇妙而神秘的联系的既视感。而人类伟大的数学家们用至上的智商不停地挑战造物主的权威,在学科的边界处绞尽脑汁顶破一个又一个的牛角尖,所发现的奇妙现象看起来依然只像是冰山一角而已。

第一次阅读 AoA 的时候确实被其中铺天盖地的数学公式所吓到,同时也看到有人吐槽 Sedgewick 这本书写得太过「理论」和「不实用」。最主流的观点就是将这本书和麻省理工 CLRS 的《算法导论》相比较,从而得出一些对前者的负面评价。在这学期修完以《分析导论》为蓝本的 Analysis of Computing and Systems 后,我能够更加具体地为这本写得十分漂亮而引人入胜的书正名。

学计算机的人都知道 CLRS 的《算法导论》,这本书早已成为 CSer 们面试攻坚的圣经,提到算法和数据结构,没有人会跳过这本书。同样也没有人能够否认《算法导论》可能是算法设计领域最有影响力的一本教材。然而作为一个捣腾计算机科学的家伙,你得明白算法分析和算法设计是截然不同的两个领域,即便他们都涉及核心主题「算法」,但研究方法和思路都相差甚远。简单点说,CLRS 试图解决的问题是,为每一个类别的代表性算法提供设计细节和可用性分析,同时涉及一些高级数据结构和少量渐进分析符号;而 AoA 则提供泛型的数学分析工具,并不特别针对某一类别的问题。你很可能在本科的时候修过离散数学、算法设计、形式语言与自动机、数据结构,但缺乏系统知识结构和背景让大部分人很难理清其中的联系。在认真阅读 AoA 之前,我可能并没有好好思考过我们为什么需要研究离散数学。而意外的是,正是这本充溢着连篇累牍的数学公式和推算的「理论」书,串联起了计算机科学的主轴。

我们的世界本质上是连续的,从 0 到两端的无穷,数值没有最小刻度。然而人类认识到这个事实花了上千年,直到无理数和极限出现。高等数学主要针对连续和极限进行推演,发展出一套精巧高效的微积分系统,20世纪的数学继续在几何学上发展微分思想,获得开创性的成功。20世纪中叶计算机的出现使理论科学家开始调转注意力到离散世界,事实上这部分数学在19世纪以前也被研究的相当透彻(欧拉的数论,伯努利的猜度术),但以高德纳为首的计算机科学家第一次将这些材料针对计算机问题进行归纳。于是人们开始重新审视那些老旧的离散分析工具——递归、生成函数、渐进分析以及欧拉-迈克劳伦公式,本质上都是试图将离散问题转换为连续问题来研究,因为我们面对后者拥有丰富的经验和强大的武器库。

掌握 AoA 中讨论的工具,使得我们可以快速地对一个问题进行数学的估计,得出问题规模的增长率、变化趋势和极限。这些结论只能通过数学分析获取,而不能单纯依赖经验和硬性计算性能。而一旦获得这些结论,我们对问题本身就有了具象、俯瞰式的把握,解决起来也就更加游刃有余了。这里举一个最简单的例子,假设我们需要用 BitString 存储有 N 个节点的二叉树,这样的二叉树可以呈现出任意合法的形态,那么我们至少需要定义多长的 BitString 来表达这些二叉树而不会溢出?

最简单的考虑是去计算不同 $N$ 节点二叉树的数目,这里设为 $M$,那么用 BitString 来存储就至少需要 $log(M)$ 长度。好吧,那么,如何得到这个 $M$ 的值?比较传统的方法是使用递归,考虑二叉树在跟节点处的情况,假设左子树有 $K$ 节点,根节点一个,所以右子树 $(N-K-1)$ 节点。 设 $T_i$ 表示 $i$ 节点二叉树的数目,那么我们可以得到递归式如下

$$\SS{T}{K} = \sum_{K=0}^{N} \Ss{T}{K} \Ss{T}{N\SUBx{-}\subx{K}\subx{-}\subx{1}} + \Ss{\delta}{N\subx{0}} $$

用任意方法解这个递归都可以得到 $T_N = \frac{1}{N+1} \binom{2N}{N}$ ,所以我们只需要对这个数求对数就可以得到所需的 BitString 最小长度了。这个结果是准确的,但依然有一个小瑕疵,对于比较大的 $N$ 值,计算组合数不是一件容易的事,如何能够让程序员快速地知道对于任意大的 $N$ 值,这个 $T_N$ 大概是多少呢?(通常情况下我们不需要特别精确的结果)这个时候利用渐进分析我们可以得到 $T_N$ 其实就是 $\frac{4^N}{\sqrt{\pi N^3}}$,而再求一下对数,则大概是 $2N-1.5 log (N)$,对于程序员来说可能后面减去的 $1.5 log(N)$ 也不重要,特别是对于足够大的 $N$。至此我们确信,对于 $N$ 节点的 二叉树,我们使用 $2N$ 长度的 BitString 是绝对安全的,这是一个十分优雅、绝对正确的结果。它证明算法分析不仅是有效的,更是优秀的。
    
      
      
      
***
    
    
[1] Flajolet, Philippe, Jean-Claude Raoult, and Jean Vuillemin. "On the average number of registers required for evaluating arithmetic expressions." Foundations of Computer Science, 1977., 18th Annual Symposium on. IEEE, 1977.

[2] Sedgewick, Robert. "Data movement in odd-even merging." SIAM Journal on Computing 7.3 (1978): 239-272.

美的同一性和神秘的算法分析相关推荐

  1. Jolt大奖作品、重磅星级图书尽在十月

    <实用Common Lisp编程> ◎第16届Jolt生产效率大奖得主 ◎计算机科学领域的经典语言之一 ◎著有名噪一时访谈录<编程人生>(Coders at work) < ...

  2. 计算机专业为什么学那么多数学,计算机专业为什么要学习数学详解.pptx

    &数学的意义与价值 移动学院 赵慧媛 数学是个最富有魅力的学科,它所蕴含的美妙和奇趣,是其他任何学科都不能相比的.美国数学家克莱因曾对数学作过这样的描述:"音乐能激发或抚慰情怀,绘画 ...

  3. 创世纪元java游戏,创世纪元

    创世纪元手游是一款以魔幻题材为玩法的冒险手游,游戏中的画风采用的是魔幻的世界,游戏中有很多奇幻的魔兽,经典的西方奇幻职业,炫彩的魔幻和强大的斗气让游戏显得有趣! 创世纪元手游特点 西方魔幻秘境,唯美视 ...

  4. ( 转载)改变人类历史的17大数学方程

    Source:http://news.cnblogs.com/n/538057/ 投递人 itwriter 发布于 2016-01-30 11:44 评论(0) 有48人阅读 原文链接 [收藏] «  ...

  5. 2013年总结和2014年的规划

    看了CSDN上这么多人在写年终总结,作为一个还是在校生的我也有必要对过去的一年记录点什么了 2013年收获 拿到了驾照 在趋势科技(中国)实习了差不多两三个月,主要是Android测试方面的工作,这份 ...

  6. 如何搭建一个可以远程开机、挂下载、读写文件、云备份或是搭个数据库玩查询的NAS

    关键词:nas主机.智能开关.ZeroTier.内网穿透 以下内容主要讲,如何在公司调用家里的NAS. 不需要通过VPS或FRP,而是使用ZeroTier虚拟局域网的方法. 这里的NAS指的基于Lin ...

  7. 2005年八大国际科学骗局

    世上骗人的把戏太多,而且这些把戏一旦沾上科学的边儿就更让人真假难辨.捉摸不透.2005年的国际科学界并不太平,甚至连印尼海啸.南亚地震这样本是弥漫着伤痛的场合,也被人有意无意变成传播伪科学的舞台,而最 ...

  8. 禾穗漫读 | 四首诗 爱 神秘 美 礼物

    主理人 | 謝玢        编辑 | Dave  董雯雪       视觉设计 | 任染 这是 禾穗HERS女性商学院 的第  008 篇禾穗漫读 大家好,這裡是精英女性成長的沃土,禾穗女性商學院 ...

  9. 美狐美颜SDK滤镜、哈哈镜功能算法分析

    我们在使用抖音拍摄短视频的时候,经常会在美颜滤镜中用到哈哈镜.怀旧等效果,那么这两种效果是如何实现的呢?下面就来分别为大家介绍下原理. 一.哈哈镜效果 现实生活中的哈哈镜,是指一种表面凹凸不平的镜子, ...

最新文章

  1. Ubuntu 16.04~ORB SLAM2~Kinect v1
  2. python爬虫实例手机_python爬虫实例详解
  3. 【转】如何查看linux版本 如何查看LINUX是多少位
  4. python 动态语言 优美_Python动态语言之魅力大揭秘
  5. mysql实际是用命令还是图形化_那些你不常用却非常有用的MySql语句和命令
  6. 基于Springboot实现商品进销存管理系统
  7. 免费PR转场 独特的形状过渡PR动态图形模板MOGRT免费下载
  8. android中自定义 toast,Android自定义Toast
  9. Jsonp解决跨域问题原理
  10. 搜索引擎的高级搜索语法指令
  11. YOLOv7全文翻译
  12. 用深度强化学习玩FlappyBird
  13. ICLR 2022:​PiCO,基于对比消歧的偏标签学习 丨AI Drive
  14. Fiddler抓包夜神模拟器
  15. 5个开发必备的 Python 工具,你用过几个?
  16. linux查看usb设备文件,Linux下查看USB设备信息
  17. python实现剪刀石头布小游戏
  18. div垂直居中-CSS元素垂直居中方法
  19. 史上最强Tomcat8性能优化,网易云课堂java高级架构师
  20. 关于String str1 = “123“ 和 String str2 = new String(“123“)内存分析

热门文章

  1. 【C++】不同模板对象之间赋值
  2. Navicat Premium 连接oracle 提示ORA-01017:用户名/口令无效;登陆被拒绝
  3. 【Java】虚拟机JVM
  4. 前端自学路线 更新11.11
  5. ROS IDE —— RoboWare Studio
  6. ListView数据动态刷新
  7. python【模块】xml.etree.ElementTree 解析 xml
  8. VvalidationError:Invalid options object.Ignore Plugin has been initialized using an options object
  9. GICv3软件overview手册之GICv3基本功能(1)
  10. 信息学奥赛对大学计算机专业,关于信息学竞赛学习的几大误区,你必须得知道!...