2023信创独角兽企业100强
全世界各行各业联合起来,internet一定要实现!

统治世界的十大算法——如果没有这些算法,当今互联网将

2015-04-29 eNet&Ciweek/谢然

一滴水从很高很高的空中自由落体下来,会不会砸伤人?

能够砸伤人则需要水滴具有的动能,即公式(1/2)mv^2,而水滴的质量是一定的,需要达到很高的速度时才能突破人体的承受极限而致人受伤。但是,当水滴具有足够大的速度时,根据v=9.8t,可以知道已经经过了比较长的时间,也就是在空中坠落了很长的一段距离,其实就是空气摩擦力。而当水滴在空中的坠落速度达到很大时,由于自身体积而产生一个空气阻力,也即空气摩擦阻力,水滴在空中就已经雾化了。当然雾化的原因是摩擦生热和水汽蒸发!也即是说水滴在速度没有达到能伤人的情况下,已经雾化消失。这个道理和空军战机有时为降低自身飞行重量而排油一个道理。

一名南大学生从电视台播放的一段记者采访360总裁周鸿祎的视频中破解了周鸿祎的手机号码;某地突发火灾,消防车如何能最快赶到现场实施救援;越来越多的人在线支付,安全加密又是如何保证的;……这些看似很神奇,其实很简单,无非就是背后依托着的各种算法。

那么何为算法呢?直白地说,就是任何明确定义的计算过程,它接收一些值或集合作为输入,并产生一些值或集合作为输出。这样,算法就是将输入转换为输出的一系列计算过程。

虽然算法的定义表达总是要借助一些或简或繁的公式或数学描述,一般人理解起来可能会有些困难。但是如果我们把算法映射到鲜活的生活场景中,就会发现算法其实并没有那么复杂。尤其是当飞速发展的互联网全方位融入我们的生活之后,许多看似复杂的算法,正在以非常直接的方式迅速改变着我们的生活方式。 在Reddit网站上,作者George Dvorsky试图解释算法之于当今世界的重要性,以及哪些算法对人类文明最为重要。如果Facebook的新闻提要也可以归为一种算法的话,那么最终就可以把几乎所有的东西都归类为算法,也就是说自然界中一切的现象,都可以用算法解释。

当下,软件正在统治世界。而软件的核心则是算法。算法千千万万,那么又有哪些算法统治了世界呢?发明算法的大师们,他们也是普通人,他们发明的算法看似高深莫测,其实我们每天都有接触到。下面就让我们一起学习下吧!

1.Dijkstra 算法 筛出最短路径

火灾是城市中较为频繁的灾害,造成的损失是巨大的。消防部门如何迅速调动消防救援力量到达事故地点并及时扑灭火灾,这就涉及到调集路径选取的问题。地理信息系统中的Dijkstra最短路径算法就可以很好地解决这个问题。

自驾游之中途迷路,作为司机,那份焦灼是难以用语言形容的。对于方向感很差的,之前每次出门都会提前,为走错路预留出时间。但其实不必,在做路线规划时,使用了Dijkstra算法就能寻找到最短路径。

那么何为Dijkstra算法呢?Dijkstra算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径,这也是一个计算机领域图搜索计算的一个经典算法。或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如线性规划,动态规划这些经典策略,当然有的问题我们可以用贪心来寻求整体最优解,在图论中一个典型的贪心法求最优解的例子就莫过于最短路径的问题。毫无不夸张地说,如果没有这个算法,当今互联网将无法有效工作。这是一种图搜索算法,它被广泛应用在能够建模为图的问题中,用以找出两个节点之间的最短路径。

Dijkstra算法的基本思想可以理解为:从起点开始,把相邻可选路段的时长加起来。遍历所有路径组合之后,就可以耗时最短的路径。由于计算机的应用,这种算法已经被广泛应用于电子地图及导航产品中。而这些产品的出现,确实颠覆了我们过去那种一出门就手拿地图,祈祷不堵车的出行习惯。

11.jpg

2. 傅立叶变换算法 听声音破解电话号码

就像大学生从360总裁周鸿祎的视频中破解了周鸿祎的手机号码,电话听音破密码诈骗也被炒得沸沸扬扬。不少人都觉得太过神话,其实很简单,用理性的声音解释一下这其中的奥秘,说白了就是离散傅立叶变换(DFT)。

傅里叶变换(Fourier transform)是一种线性的积分变换。因其基本思想首先由法国学者傅里叶系统地提出,所以以其名字来命名以示纪念。

“离散傅里叶变换(DiscreteFourier Transform,缩写为DFT)”是傅里叶变换算法中的一种,是指傅里叶变换在时域和频域上都以离散的形式呈现。原始信号离散化的过程其实就是以一定的周期对原始信号进行采样的过程。但常规的傅立叶变换算法并不适用于嵌入式控制系统,原因是运算量太大(涉及到复数运算),比如离散的傅立叶变换等同于用序列Y(n×1列矢量)乘以n×n矩阵Fn,需要n×n次乘法。若n=1024,则是104,8576次乘法运算。这又是一个什么概念呢?如果你选用的CPU单周期指令为25ns, 单周期也可以完成一次乘法运算,那么要计算1024点的傅立叶变换则需要26.2144ms,这还不包括加法或其它运算,对于大多数实时系统,这个处理时间实在太长。因为离散傅立叶变换计算量相当大,有很多提高效率的算法理论,其中应用最广泛的还是快速傅立叶变换(FFT)。

12.jpg

利用快速傅里叶变换FFT将图像信号从空间域转换到频域进行分析,使快速卷积、目标识别等许多算法易于实现;然后根据图像信号的灰度结构特征和频谱分布,用Butterworth带通滤波器和二维维纳滤波器进行滤波处理,去除图像信号中的低频干扰和噪声信号;再利用傅里叶反变换将信号还原。结果显示,处理后的模拟远程高空卫星照片轮廓清晰可见。

3. RSA算法 数据安全传输

电子商务是建立在一个开放式的Internet上,维护商业机密是电子商务获得全面推广应用的重要保障。保证电子商务各方信息的完整性是电子商务应用的基础。数字签名技术可以实现数据的完整性、身份认证性、不可抵赖性。贸易双方的如何确定要进行交易的贸易方正是进行交易所期望的贸易方这一问题也可通过数字签名来实现。而数字签名技术本身的安全性则由密码技术来保证。

公钥密码体制的思想是在1976年由Diffie和Hellman提出。公钥密码体制的想法是:可以找到一种密码体制,使由给定的ek来求dk是计算不可行的。如果可以的话,加密规则ek是一个公钥,可以在一个目录中发布(这就是公钥体制名称的由来)。

1977年由Rivest、Shamir和Adleman发明的著名的RSA密码体制就是公钥体制的一种典型代表。其优点是甲可以利用公钥加密规则ek发出一条加密的消息给乙,而不需要预先共享密钥的通信。乙将是唯一能够利用dk(私钥)来对密文解密的人。乙可以让任何人发布他的公钥,任何人用公钥将数据加密后在网络中传输,即使在传输过程中被别人截获同时这人也拥有乙的公钥,也无法利用这些资料来破译加密数据:而只有乙通过私钥才能顺利解密密文。这样便能实现数据的安全传输。

RSA是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。

如果没有信息加密和网络安全,互联网不会像现在那么重要。你可以认为“安全问题理所当然应该是美国国家安全局和其他情报机构的事情”或“你认为你身处在互联网是安全的,这太天真了”。但是,人们需要在他们花钱时保有安全感,毕竟你不会在网络服务器上输入你的信用卡号,如果你知道它是不安全的话。

在信息加密领域,有一个算法始终是世界上最重要的算法之一,它就是RSA算法。这个算法是由RSA公司的创始人所建立的,它使信息加密惠及千家万户,奠定了当今信息加密的运作基础。RSA算法用来解决一个简单而又复杂的问题:怎样在不同平台和终端用户之间共享公钥,继而实现信息加密(我想说明一下这个问题还没完全解决,我想我们需要基于这个方向做更多工作)。

4. 哈希算法 安全在线支付

准确地说,它不能称之为是算法,它是美国国家标准暨技术学会定义的加密散列函数族中的一员,但是这族算法对整个世界的运作至关重要。从你的应用商店,你的邮件,你的杀毒软件,到你的浏览器等等,所有这些都在使用安全哈希算法,它能判断你是否下载了你想要的东西,也能判断你是否是中间人攻击或网络钓鱼攻击的受害者。

随着互联网的发展现在有了网上银行和在线支付,查好车次时间及票务信息,我们通过网上银行可以很方便地完成在线支付,顺利搞定车票门票。在线支付是互联网时代的产物,也是一个改变了我们支付习惯,真正为用户带来方便的重要技术。之所以我们可以远离过去那种为了买东西而奔波、排队的场景,都要感谢安全哈希算法为我们提供了在线交易的安全性。当我使用网上银行完成支付的那一刻,其实是安全哈希算法帮我完成了一系列安全检测动作。只有当银行服务器通过哈希算法验证了我的数字签名合法性之后,我们的在线交易才会顺利完成。

5. 排序算法轻松归队

可能好多人提起写代码,都会觉得枯燥乏味,其实不然,能写出赏心悦目的代码,也是一种美,突破自己之后的那种快乐是无法用言语来形容的。

程序员在起步之初最熟悉不过的就是各种各样的排序算法了。最初接触编程时,我也绞尽脑汁思考过一个问题,并被这个算法折磨了很久:怎样给一个磁盘文件排序?当你最终找到高效快捷精准的算法后,发现其实一切都是浮云。

这个算法如果用严谨的逻辑思维可以解释如下:

输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10,000,000。输入文件中没有重复的整数,没有其他数据与该整数相关联。

输出: 按升序排列这些数,并写入磁盘。

约束:有 1MB多(不超过2MB) 的内存空间可用,有充足的硬盘空间。

最初想到的是快速排序,对冒泡排序的一种改进。快速排序算法的基本思想是:每一趟排序中找一个点pivot,将表分割成独立的两部分,其中一部分的所有Record都比pivot小,另一部分比pivot大,然后再按此方法对这两部分数据分别进行快速排序。

13.jpg

但是设想一下:如果用一个int保存一个正整数,一个int为4 Byte,100万个数要用400万 Byte,约为4M。如果用快排,时间复杂度为O(nlogn)。

考虑到问题的特殊性,所有数字均为正整数,且都不重复,这样的问题可以用位图算法解决。

14.jpg

每个数字对应位图中的一位,如果数字出现则置1,否则置0。一个int 4 Byte可以保存32个数,因为所有的数都小于1000万,所以可以先用大小为1000万的位图来记录这100万个数,最后从头扫描这个位图,把置1的数字输出就是按序的结果。用位图排序需要的空间约为1.25M,时间复杂度为O(N),无论空间还是时间都比快排好。

排序是非常常用,非常基本的算法。当然,排序的方法还有有很多,如插入排序、选择排序、希尔排序、归并排序、堆排序等等。下面,逐一介绍。当然每种排序都有其用武之地,在使用时一定要对号入座哦!

插入排序,简单说就是每次选未排序的队列中最小的条目插入到已排序队列的最后:

15.jpg

选择排序,和插入有点像,是每次从拿未排序中的第一个条目插入到已排序中应该插入的位置:

16.jpg

希尔排序,是插入排序的一种,是针对直接插入排序算法的改进。希尔排序的基本思想是:先取一个小于count的增量increment,把表中Record分为increment组,所有距离为increment的Record为同一组,现在各组中进行直接插入排序(insert_sort),然后减小increment重复分组和排序,知道increment=1,即所有Record放在同一组中进行直接插入排序为止。

17.jpg

归并排序,是采用分治的思想将两个已排序的表合并成一个表。归并排序算法的基本思想是:先将一个表分成两个表(当个数是奇数时,使左表的元素比右表多一)。对两个表分别进行归并排序,然后将两个已排序好的表合并。合并的思路就像将两罗纸牌混成一摞,每次取顶上最小的纸牌。

18.jpg

堆排序,是先将表中Record按大堆(或小堆)存放,使选取最大的Record变的极为容易,每次选取之后再提升堆。实现排序。

19.jpg

继续:)

20.jpg

6. 整数因式分解算法 化繁为简

这是在计算机领域被大量使用的数学算法,没有这个算法,信息加密会更不安全。该算法定义了一系列步骤,得到将一合数分解为更小因子的质数分解式。这被认为是一种FNP问题,它是NP分类问题的延伸,极其难以解决。

许多加密协议(如RSA算法)都基于这样一个原理:对大的合数作因式分解是非常困难的。如果一个算法能够快速地对任意整数进行因式分解,RSA的公钥加密体系就会失去其安全性。

量子计算的诞生使我们能够更容易地解决这类问题,同时它也打开了一个全新的领域,使得我们能够利用量子世界中的特性来保证系统安全。

7. 比例积分微分算法 机器人轨迹优化

你是否曾经用过飞机、汽车、卫星服务或手机网络?你是否曾经在工厂工作或是看见过机器人?如果回答是肯定的,那么你应该已经见识过这个算法了。

大体上,这个算法使用一种控制回路反馈机制,将期望输出信号和实际输出信号之间的错误最小化。无论何处,只要你需要进行信号处理,或者你需要一套电子系统,用来自动化控制机械、液压或热力系统,这个算法都会有用武之地。如我们家里的电冰箱的温度控制,供水系统的水压控制,数控机床的刀具切割控制以及机器人的手臂动作控制等等。

8. 数据压缩算法 空间利用最大化

大数据时代,各类信息充斥生活工作的各个方面,人们离不开信息的搜集,处理,保存与交流。历史遗留下来的信息数据,现时的信息数据,将来的信息数据,其数据之大令人难以想象。高效的数据压缩也是一种很好的选择。

数据压缩技术其应用十分普遍,WinRar,WinZip等常规数据压缩软件已经成为现在电脑的必备软件了。互连网上到处都可以看到压缩文件包。而常规多媒体文件甚至把压缩算法嵌入到其文件格式的标准内。像现在图形图像方面的jpeg,png,gif,音频mp3,视频VCD,DVD就不用说了。

要判断哪种数据压缩算法最为重要是很困难的,因为它取决于不同的应用环境。它们可以应用在zip和mp3上,也可以应用在JPEG和MPEG-2上。但众所周知,在所有结构中这些算法都极其重要。

除了显而易见的zip文件,在哪我们能够找到这些算法?这张网页就进行了数据压缩并被下载到你本地,同时我们还能在电子游戏、视频、音乐、数据存储、云计算、数据库等等地方找到这些算法。可以说,数据压缩算法处处可见,它们使系统成本更低、效率更高。

9. 随机数生成算法 抽奖乐在其中

千百年来,人们一直在使用随机性,比如抛硬币来决定某些命运或输赢。今天,人们也使用随机数搞彩票,以确定巨额资金的获得者。

当前,很多网络信息或信用卡信息需要通过安全确认,随机数就被用来形成加密密钥。另一方面,随机数也可以用来模拟真实世界的现象。例如,经营自动取款机网络的银行设计的软件,常常通过随机时间随机取款机来模拟客户访问自己的帐户来测试软件的功能。

当我们需要产生一些随机数,如单位的抽奖,购买体育彩票前的选号等,我们可以利用Excel中的RAND函数来产生这些随机数。

随机数的另一个应用是著名的蒙特卡罗算法。所谓的蒙特卡罗方法对极难获得精确解的问题用随机数方法来获得数值逼近。例如,假设我们不知道单位圆的面积公式。如何计算它的面积呢?我们可以把单位圆放进一个面积已知的正方形里面(如下图),并在正方形上随机加点。落在圆内的点数的百分比应该近似于圆的面积和正方形面积的比。下图显示了随机放在一个边长为2.2的正方形上的2000个点,其中1308个点落在圆内。圆的近似面积等于正方形的面积4.84乘上1308/2000,结果是3.16536(当然,圆的精确面积是π≈3.14159 )。这已经比较接近单位圆的面积值了。如果撒的点更多,比如说10000个,得到的近似值将更精确。

21.jpg

22.jpg

在数据结构、算法分析与设计、科学模拟等方面都需要用到随机数。在密码技术中,随机序列是非常重要的,比如密钥产生、数字签名、身份认证和众多的密码学协议等都要用到随机序列。所以产生高质量的随机数序列对信息的安全性具有十分重要的作用。随机数分为真随机数和伪随机数,计算机通过算法产生的随机数并不上真正意义上的随机数,很容易被破解,只能称为伪随机数。

现在我们还没有一个“真正的”随机数生成器,但我们已经有了一些伪随机数生成器,足矣。随机数生成器的用途非常广泛,从互联联络、数据加密、安全哈希算法、电子游戏、人工智能、优化分析,到问题的初始条件、金融等等,都有它们的身影。

10. 链接分析算法 搜索更加高效

目前,每年每个黄金周,人们都可以得益于旅行前的网络搜索与信息筛选,真实体会到一下搜索引擎。

这里提到的搜索感受的变化就蕴含着一个令互联网搜索更加高效的基本算法-- “超链分析算法”。

在互联网时代,分析不同实体间的关系是相当重要的。从搜索引擎,社交网络,到营销分析工具,每个人都在不停寻找互联网的真正结构。有证据显示,链接分析是公众心目中伴随着最多谬见和误解的算法之一。这里的问题在于,有很多不同的方式可以进行链接分析,也存在很多特性使这些算法看起来有细微的区别(这些区别允许该算法独立申请专利),但它们本质上是类似的。

链接分析背后的理念非常简单,以矩阵形式描绘出一张图,将问题转换为特征值问题。特征值是一种很好的渠道,它有助于展现图的结构以及每个节点的相对重要性。该算法是由Gabriel Pinski和Francis Narin于1976年建立的。

谁在使用这个算法?Google的Page Rank算法,Facebook向你展示的新闻提要(这就是为什么Facebook的新闻提要不是算法,只是使用算法的结果而已),Google+和Facebook的好友推荐,LinkedIn的工作和联系人推荐,Netflix和Hulu的电影,YouTuBe的视频,等等。虽然每个都有不同的目标和参数,但它们背后的数学理念是相同的。

尽管看上去Google是第一家使用这类算法的公司,然而在1996年(Google之前两年),Robin Li(李彦宏)所建立的一个小型搜索引擎“RankDex”就已经在它的网页排名机制中使用了这项理念。后来,HyperSearch的创始人MassimoMarchiori基于各网页之间的关系使用了另一种网页排名算法。(Google在它的专利中提到了这两位创始者)也如被中国百度李彦宏化“简单”为“神奇”的“超链分析算法”,几乎支撑了整个中国互联网搜索一样,生活中的每一个简单环节中所蕴含的或浅或深的道理,抽象成数学描述就是一些非常有效的算法。

因此也可以这样认为,是人通过那些躲在背后、无处不在的神奇算法,不断地改变着世界,改变了人类的生活。认识、创造和利用这样的算法的本质,也是企业商业模式和原始创新的基础。当然,我的意思不是让大家学数学。

相关频道: eNews

您对本文或本站有任何意见,请在下方提交,谢谢!

投稿信箱:tougao@enet16.com