算法导论

简介: 算法导论

一.算法

  非形式地说,算法【algorithm】就是任何定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出。这样算法就是把输入转换成输出的计算步骤的一个序列。

  我们也可以把算法看成是用于求解计算问题的工具。一般来说,问题陈述说明了期望的输入/输出关系。算法则描述一个特定的计算过程来实现该输入/输出关系。例如,我们可能需要把一个数列进行升序排序。实际上,这个问题经常出现,并且为引入许多标准的设计技术和分析工具提供了足够的理由。

  输入:n个数的一个序列(a1,a2,...,an)

  输出:输入序列的一个排序(a`1,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程序依赖互联网,网络中的路由高度依赖路由算法。程序需要中有需要编译的代码没?编译器也广泛使用算法。因此,算法时当前计算机中使用的大多数计算的核心。

  进一步说,随着计算机能力的不断增强,我们使用计算机来解决比之前更大的问题,因此,在面对海量的数据时,算法的优劣就显得尤为重要。

  是否具有算法知识与技术的坚实基础是区分真正熟练的程序员与初学者的一个特征。使用现代计算技术,如果你对算法懂得不多,你也可以完成一些任务,但是,如果有一个好的算法背景,那么你可以做的事情就会多得多。

相关文章
|
10月前
|
算法
算法导论(第三版)具体算法解析与理解
算法导论(第三版)具体算法解析与理解
|
算法
【数据结构与算法】之动态规划经典问题
【数据结构与算法】之动态规划经典问题
131 0
【数据结构与算法】之动态规划经典问题
|
算法
数据结构与算法之八皇后问题
八皇后问题代码实现 package com.pionner.recursion; public class Queen8 { int max = 8; int[] array = new int[max]; static int i = 0; public...
763 0
|
算法
算法导论——贪心算法
贪心算法(greedy algorithm)是指,在每一步都做出当时看起来最佳的选择,也就是局部最优的选择,期望这样的选择能够导向全局最优解。所以并不是所有的问题都能得到全局最优解。          典型的例子如分数背包问题:背包容量为50kg,有三个商品分别是重60元/10kg、100元/20kg、120元/30kg,商品可以分割,如何选取商品使背包价值最大。
1469 0
|
移动开发 算法 BI
算法导论——动态规划
  动态规划指的是一个问题可以拆分成多个小的最优子问题,并且这些子问题具有重叠,典型的如斐波那契数列:f(2)=f(1)+f(0),f(3)=f(2)+f(1),f(4)=f(3)+f(2),若使用简单的递归算法求f(4),则f(2)会被计算两次,当计算f(n)时需要计算f(n-1)和f(n-2)而f(n-1)又要计算记一次f(n-2),如此往复时间复杂度为n的指数级别,导致算法效率低下。
1422 0
|
算法 Python 机器学习/深度学习
|
算法
《算法导论(原书第3版)》一导读
本书的设计目标是全面、适用于多种用途。它可用于若干课程,从本科生的数据结构课程到研究生的算法课程。由于书中给出的内容比较多,只讲一学期一般讲不完,因此,教师们应该将本书看成是一种“缓存区”或“瑞典式自助餐”,从中挑选出能最好地支持自己希望教授的课程的内容。
1997 0
|
算法
《算法导论(原书第3版)》一思考题
本节书摘来自华章出版社《算法导论(原书第3版)》一 书中的第3章,第3.3节,作者:(美)Thomas H.Cormen,Charles E.Leiserson,Ronald L.Rivest,Clifford Stein,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2340 0
|
算法 人工智能
算法导论第十五章 动态规划
写在前面:从本章开始,算法导论章节进入第四部分:高级设计和分析技术。在读的过程中,可以明显感觉到本章内容跟之前章节的内容要复杂得多。这么来说,之前章节的内容更多的是在教我们使用一些在算法设计过程中常用的工具(即数据结构),而本章以后的内容是在述说更上层的方法论(如何根据不同的问题精确地设计不同的算法)。
1343 0
|
算法
算法导论第十二章 二叉搜索树
一、二叉搜索树概览   二叉搜索树(又名二叉查找树、二叉排序树)是一种可提供良好搜寻效率的树形结构,支持动态集合操作,所谓动态集合操作,就是Search、Maximum、Minimum、Insert、Delete等操作,二叉搜索树可以保证这些操作在对数时间内完成。
775 0