一.算法
非形式地说,算法【algorithm】就是任何定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出。这样算法就是把输入转换成输出的计算步骤的一个序列。
我们也可以把算法看成是用于求解计算问题的工具。一般来说,问题陈述说明了期望的输入/输出关系。算法则描述一个特定的计算过程来实现该输入/输出关系。例如,我们可能需要把一个数列进行升序排序。实际上,这个问题经常出现,并且为引入许多标准的设计技术和分析工具提供了足够的理由。
输入:n个数的一个序列(a,a2,...,an)
输出:输入序列的一个排序(a`,a`2,...,a`n)
例如,给定输入序列(6,3,1,2,8,5),排序算法将返回序列(1,2,3,5,6,8)作为输出。这样的输入序列称为排序问题的一个实例。一般来说,问题实例由计算该问题解所必需的【满足问题陈述中的各种约束】输入组成。
因为许多程序使用排序作为中间步骤,所以排序是计算机科学中的一个基本操作。因此,已有许多好的排序算法供我们任意使用。对于给定应用,哪个算法最好依赖于一下因素:将要被排序的项数、这些项已被稍微排序的程度、关于项值的可能限制、计算机的体系结构、以及使用的存储设备的种类【内存、磁盘或磁带】。
若对每个输入实例算法都以正确的输出结束,则称该算法是正确的,并称正确的算法解决了给定的计算问题。不正确的算法对某些输入实例可能根本不停止,也可能以不正确的方式结束。与人们期望的相反,不正确的算法只要其错误率是可控的,有时还是有用的。例如:在研究大素数算法时,将会是一个具有可控错误率的算法。
算法可以用英文说明,也可以说明成计算机程序,甚至说明成硬件设计。唯一的要求是这个说明必须准确描述所要遵循的计算过程。
二.算法解决那些问题
排序绝不是已开发算法的唯一计算问题,实际上,算法的实际应用是无处不在的,例如:
1.人类基因工程
识别人类DNA中所有10万个基因,确定构成人类DNA的30亿个化学基对的序列。
2.互联网搜索
互联网使得全世界的人都能快速地访问与检索大量信息。借助于一些聪明的算法,互联网上的网站能够管理和处理这些海量数据。
3.电子商务
电子商务使得货物能够以电子方式洽谈与交换,并且依赖于信用卡号、密码和银行结单这类个人信息的保密性。
4.制造业、广告推送等等
5.A/B两点的最短路径
6.最长公共子序列
7.工厂流水线设计等等
虽然这些问题的列表还未穷尽,但是它们却展示了许多有趣的算法问题所共有的两个特征:
1.存在许多候选解,但绝大多数候选解都没有解决手头上的问题。寻找一个真正的解或一个最好的解可能是一个很大的挑战。
2.存在实际应用。例如,最短路径问题就是一个很常见的例子。地图导航、货物运输、网络路由等等
三.数据结构
数据结构是一种存储和组织数据的方式,旨在便于访问和修改。没有一种单一的数据结构对所有用途都有效,所有重要的是知道不同数据结构的优点和局限。
四.技术
虽然你可能掌握了很多的算法,但是也许某一天你会遇到这样一个问题,你一时无法找到一个你所知晓或搜索到的算法来解决它。那么你需要知道如何自己设计与分析一个算法,并且可以去证明及测试它的效率。
五.并行性
我们或许可以指望处理器时钟速度能以某个持续的比率增加多年。然而物理的限制对不断提高的时钟速度给出了一个限制:因为功率密度随着时钟速度超线性增长,一旦时钟速度变的足够快,芯片就有融化的危险。因此,为了每秒执行更多的计算,芯片被设计成包含不止一个核心,不同核心之间可以并行执行。因此,为了算法从多核计算机中获得最佳性能,设计算法时必须考虑并行性。
六.算法无处不在
我们应该像计算机硬件一样把算法看成一种技术。整个系统的性能不但依赖于选择快速的硬件而且还依赖于选择有效的算法。可能你会想,我只是开发一个简单的WEB程序,只有html和css,那么抱歉,其中还是设计了不少算法,其中,图形界面的渲染依赖了算法,WEB程序依赖互联网,网络中的路由高度依赖路由算法。程序需要中有需要编译的代码没?编译器也广泛使用算法。因此,算法时当前计算机中使用的大多数计算的核心。
进一步说,随着计算机能力的不断增强,我们使用计算机来解决比之前更大的问题,因此,在面对海量的数据时,算法的优劣就显得尤为重要。
是否具有算法知识与技术的坚实基础是区分真正熟练的程序员与初学者的一个特征。使用现代计算技术,如果你对算法懂得不多,你也可以完成一些任务,但是,如果有一个好的算法背景,那么你可以做的事情就会多得多。