你相信算法吗?对于这个问题的答案,我们并不关心,因为无论你信不信,不可否认的是算法席卷了你我的生活。
通信聊天时词汇的联想输入、网络购物时商品的关联推荐和下班回家时家电的智能声控,其算法早己悄无声息地进入我们的世界。但你是否知道算法是什么呢?
很多时候,比自己更了解自己的,不是你的父母和伴侣,也不是你的朋友,而是算法。算法就像一位智者那般,似乎只要我们有还没解决的问题,它便可以为我们提供这个问题的可行解。
算法,即计算之法,是一串指令,一个方案,也是一个过程。算法就是一系列规范化的计算步骤,它对一个或多个输入值先进行计算,然后转换成所请求的结果再输出。当然,需要强调的是,所谓的“请求的结果”,并非请求一个精确的结果,而是算法根据我们的请求运行后得出一个结果。
简单地说就是,我们可以要求算法输出一个“请求的结果”,如“1+1=?”的结果,但我们无法要求当输入“1+1”时算法必然输出“2”(如果你直接把答案告诉算法那就另当别论了)的结果。就像考试时,老师要求你在试卷上填上正确的答案,但老师并不能确保你所认为的正确答案便是正确的答案。
运行算法时,我们从一个初态开始,经过一系列有限、清晰且有明确定义的状态转化,最终产生并止步于一个终态。初态到终态的转化是无法确定的,甚至初态与终态之间多种状态的转化也是无法确定的。
或者换一个角度,我们可以这样理解:算法是由一系列数据对象的一系列运算和操作组成的。
运算包括算术运算、逻辑运算和关系运算。算术运算有加、减、乘、除,逻辑运算有或、与、非,关系运算有大于、小于、等于、不等于。操作包括输入、输出和赋值等。这么一看是不是就了然于胸了呢?那什么是数据对象呢?它其实就是指数据。至于数据类型,则是一个十分庞杂的问题,后续的文章将会详细地讲解。
通常来讲,算法有5个特征,即我们所说的“两项三性”。
除了以上5个强制特性外,算法还有以下5个非强制特性:
正确性、可读性和可移植性很容易理解,就是字面意思。至于健壮性和鲁棒性,就有点意思了。鲁棒是 Robust 的音译,而Robust 是健壮的意思,因此二者虽然不尽相同,但却是息息相关的,而且容易弄混。下面我们就来具体讲一下鲁棒性和健壮性的区别。
健壮性也称容错性,是指一个程序(算法)对不合理的输入的反应能力和处理能力。
而鲁棒性又分为稳定鲁棒性和性能鲁棒性。稳定鲁棒性指小偏差只能产生小影响,大偏差不能产生大影响。而性能鲁棒性更简单,就是指高精度和有效性。
可以这样理解:健壮性的偏差是意料之外的,超出规定的外偏差;而鲁棒性的偏差是范围之内的,可预料的内偏差。
也许细心的你已经发现,前面讲到算法时用到了“席卷”一词。是的,毫不夸张地讲,由于算法的“神通广大”,它几乎被应用于人们生活的方方面面。当然,是几乎,而不是完全,毕竟算法还不是无所不能的,而且算法所引起的人们的不同价值观也是极具争议的热点。算法必然会继续发展,但我们也需要清醒地意识到现阶段它的局限性和问题,不要夸大和渲染它的神奇性。
例如:识别算法可以隔离垃圾邮件和骚扰信息,量子算法可以在短时间内破译密钥,关联算法可以发现客户想买的或需要买的东西……这就是算法的“神通”。当然,对于这类高级算法,是需要设计数学模型的。不同的问题还需要设计不同的数学模型,这对于新手来说无疑有很高的门槛。要真正学会算法有很长的路要走,最重要的就是走好脚下的每一步。
一般来讲,算法的设计策略主要有遍历、迭代、递归、回溯、贪心和分治等。这些策略大部分都是本专栏要讲的。不仅要讲,还要详细地讲。毕竟知识体系环环相扣,没有丰富的基础,知识体系就会漏洞百出。只懂表面,不懂原理的话,一道题稍稍变动一下就做不出来了。如果学算法却连算法的策略都无法掌握,那么和学数学不会加减乘除有什么区别呢?