关于作者

 一个毕业于北京大学数学力学系,在中国科学院计算所、计算中心和网络中心工作过,在澳大利亚科工组织DMS、香港浸会学院数学系和中国21世纪议程管理中心等处工作过,多次获国家和中科院科技奖并享受政府特殊津贴的退休老头。现在在【中国科普博览】网“科学新语林”栏目里开设一个《数学与计算机》的个人专栏,愿和爱好数学与计算机的各界网友和青少年朋友,谈谈对数学与计算机的看法、想法。

数学算法统治世界?

张建中
2016年03月04日

数学技术之算法概论篇(4)

统治世界的十大算法

软件正在统治世界,而软件的核心是算法;互联网即将统治世界,其管理、使用的核心也是算法;算法统治着软件和互联网,所以说“算法统治世界”这句话应是有一定道理的。
算法决定了你用Google搜索的结果,算法决定了新浪微博向你展示的话题,算法决定了Netflix向你推荐的电影,算法决定了你QQ对话窗弹出的横幅广告等等,这些都意味着“算法在统治世界”。我们花费了大量时间、巨大的投资来研究新算法,调整、改善旧算法,寻找更好的算法以便集成到应用中去,但是有些现成的算法却罕有人知晓,最后却是“众里寻她千百度,那人却在灯火阑珊处”——往往答案就在眼前,但很多别人已经研究多年的算法自己却从未听说过。这里,从千千万万算法中,整理出统治世界的十大算法的小型列表,排名不分先后,供参考。
1. 归并排序,快速排序和堆排序
算法
哪个排序算法最好?这取决于需求,也是为什么要将归并排序、快速排序和堆排序算法这三个使用频率较高的排序算法置于一处的原因。你可能比较偏爱其中的一个,但它们都是同等重要的。
归并排序算法是目前为止我们拥有的最重要的算法之一。它是一种基于比较的排序算法,使用分治法解决那些原本复杂度为O(N2)的问题。归并排序是由数学家John von Neumann于1945年提出的。
快速排序是解决排序问题的另一种途径,它使用就地分解算法,同时它也是一种分治算法。这个算法的问题在于它是不稳定的排序算法,但它在基于内存的数组排序上确实非常高效。
最后,堆排序算法使用一个优先队列降低数据的查找时间,它也是一种就地排序算法,同样也是不稳定的排序算法。
相较于曾经使用的其他排序算法(如冒泡排序),上述算法带来了显著的改进。事实上,多亏了它们,今天我们才有了数据挖掘、人工智能、链接分析,以及世界上大部分的计算机工具,也包括网络在内。
2. 傅立叶变换与快速傅立叶变换
整个数字世界都在使用这一简单而又强大的算法,将信号从频域转换为时域,反之亦然。互联网、你的WIFI、智能手机、电话、计算机、路由器、卫星,几乎所有内置计算机的东西都会以各种方式使用这些算法实现各自的功能。
3. Dijkstra算法
毫无不夸张地说,如果没有这个算法,当今互联网将无法有效工作。这是一种图搜索算法,它被广泛应用在能够建模为图的问题中,用以找出两个节点之间的最短路径。
目前,即便我们已经拥有了解决最短路径问题的更好方法,Dijkstra算法依然在那些重视稳定性的系统中得到应用。
4. RSA算法
如果没有信息加密和网络安全,互联网不会像现在那么重要。在信息加密领域,有一个算法始终是世界上最重要的算法之一,它就是RSA算法。这个算法是由RSA公司的创始人建立,它使信息加密惠及千家万户,奠定了当今信息加密的运作基础。RSA算法用来解决一个简单而又复杂的问题:怎样在不同平台和终端用户之间共享公钥,继而实现信息加密。其实,这个问题也没完全解决,还需要做更多工作。
5. 安全哈希算法
准确地说,它不能称之为算法,它是美国国家标准暨技术学会定义的加密散列函数族中的一员,但是这族算法对整个世界的运作至关重要。从你的应用商店,你的邮件,你的杀毒软件,到你的浏览器等等,所有这些都在使用安全哈希算法,它能判断你是否下载了你想要的东西,也能判断你是否是中间人攻击或网络钓鱼攻击的受害者。
6. 整数因式分解
这是在计算机领域被大量使用的数学算法,没有这个算法,信息加密会更不安全。该算法定义了一系列步骤,得到将一合数分解为更小因子的质数分解式。这被认为是一种FNP问题,它是NP分类问题的延伸,极其难以解决。
许多加密协议(如RSA算法)都基于这样一个原理:对大的合数作因式分解是非常困难的。如果一个算法能够快速地对任意整数进行因式分解,RSA的公钥加密体系就会失去其安全性。
量子计算的诞生使我们能够更容易地解决这类问题,同时它也打开了一个全新的领域,使得我们能够利用量子世界中的特性来保证系统安全。
7. 链接分析
在互联网时代,分析不同实体间的关系是相当重要的。从搜索引擎,社交网络,到营销分析工具,每个人都在不停寻找互联网的真正结构。
链接分析背后的理念非常简单,以矩阵形式描绘出一张图,将问题转换为特征值问题。特征值是一种很好的渠道,它有助于展现图的结构以及每个节点的相对重要性。该算法是由Gabriel Pinski和Francis Narin于1976年建立的。
谁在使用这个算法?Google的Page Rank算法,Facebook向你展示的新闻提要(这就是为什么Facebook的新闻提要不是算法,只是使用算法的结果而已),Google 和Facebook的推荐,LinkedIn的工作和联系人推荐,Netflix和Hulu的电影,YouTuBe的视频,等等。虽然每个都有不同的目标和参数,但它们背后的数学理念是相同的。
8. 比例积分微分算法
你是否曾经用过飞机、汽车、卫星服务或手机网络?你是否曾经在工厂工作或是看见过机器人?如果回答是肯定的,那么你应该已经见识过这个算法了。
大体上,这个算法使用一种控制回路反馈机制,将期望输出信号和实际输出信号之间的错误最小化。无论何处,只要你需要进行信号处理,或者你需要一套电子系统,用来自动化控制机械、液压或热力系统,这个算法都会有用武之地。可以这样说,如果没有这个算法,现代文明将不复存在。
9. 数据压缩算法
要判断哪种数据压缩算法最为重要是很困难的,因为它取决于不同的应用环境。它们可以应用在zip和mp3上,也可以应用在JPEG和MPEG-2上。但众所周知,在所有结构中这些算法都极其重要。
除了显而易见的zip文件,在哪我们能够找到这些算法?在电子游戏、视频、音乐、数据存储、云计算、数据库等等地方都能找到这些算法。可以说,数据压缩算法处处可见,它们使系统成本更低、效率更高。
10. 随机数生成
现在我们还没有一个“真正的”随机数生成器,但我们已经有了一些伪随机数生成器,这就够用了。随机数生成器的用途非常广泛,从互联联络、数据加密、安全哈希算法、电子游戏、人工智能、优化分析,到问题的初始条件、金融等等,都有它们的身影。
最后再强调一下,上面这个列表仅供参考,它并不完整。因为在机器学习、矩阵乘法、分类化等领域也有一些算法,它们对我们的世界同样重要,但在这里还没有提到。

数学建模竞赛中常用的十类算法

诸多国内参赛带队老师对我国多年数学建模賽赛题目进行研究分析之后,总结出如下建模竞赛中常用的十大类算法,现列出供对此有兴趣的网友参考。
1. 蒙特卡罗算法。
该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟来检验自己模型的正确性,几乎是比赛时必用的方法。
2. 数据拟合、参数估计、插值等数据处理算法。
比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用MATLAB 作为工具。
3. 线性规划、整数规划、多元规划、二次规划等规划类算法。
建模竞赛大多数问题属于最优化问题,很多时候这些问题可以用数学规划算法来描述,通常使用Lindo、Lingo 软件求解。
4. 图论算法。
这类算法可以分为很多种,包括最短路、网络流、二分图等算法,涉及到图论的问题可以用这些方法解决,需要认真准备。
5. 动态规划、回溯搜索、分治算法、分支定界等计算机算法。
这些算法是算法设计中比较常用的方法,竞赛中很多场合会用到。
6. 最优化理论的三大非经典算法:模拟退火算法、神经网络算法、遗传算法。
这些问题是用来解决一些较困难的最优化问题的,对于有些问题非常有帮助,但是算法的实现比较困难,需慎重使用。
7. 网格算法和穷举法。
两者都是暴力搜索最优点的算法,在很多竞赛题中有应用,当重点讨论模型本身而轻视算法的时候,可以使用这种暴力方案,最好使用一些高级语言作为编程工具。
8. 一些连续数据离散化方法。
很多问题都是实际来的,数据可以是连续的,而计算机只能处理离散的数据,因此将其离散化后进行差分代替微分、求和代替积分等思想是非常重要的。
9. 数值分析算法。
如果在比赛中采用高级语言进行编程的话,那些数值分析中常用的算法比如方程组求解、矩阵运算、函数积分等算法就需要额外编写库函数进行调用。
10. 图象处理算法。
赛题中有一类问题与图形有关,即使问题与图形无关,论文中也会需要图片来说明问题,这些图形如何展示以及如何处理就是需要解决的问题,通常使用MATLAB 进行处理。