【学习笔记】<算法导论>基础知识1.1

译者序

Thomas H.Cormen著的《Introduction to Algotithms》是世界范围内包括MIT/CMU/Stanford/UCB/Cornell/UIUC等国际和国内等1000多所大学都作为教材或者教学参考书,它也是《高引用计算机科学文献》(Most Cited Computer Science Citations)一览表中名列前茅。

书中内容

不仅包括典型算法、算法分析、算法设计方法和NP等内容,还包括高级数据结构。
文章的各章节是相互独立的。
课程的习题答案网址:http://mitpress.mit.edu/algorithms/

第一部分-基础知识

什么是算法?

非正式的,算法就是任何的计算过程,该过程取某个值或者值的集合作为输入并产生某个值或值的集合作为输出。算法就是把输入转换为输出的计算步骤。
可以把算法成为计算问题的工具
算法就是描述一个特定的计算过程来实现输入/输出关系.
比如说:我们有一个非递减排序。
**输入:**n个数的一个序列(a1,a2,…an)
输出:(a1’,a2’,a3’,…a4’),满足a1’≤a2’≤…≤a4’。
比如<31,41,59,26,41,58>,排序算法将返回序列<26,31,41,41,58,59>,这样的输入序列成为排序问题的一个实例(instance).问题实例是计算该问题所必需的的输入组成。
许多的程序都会用到排序算法,排序是计算机科学中的一个基本操作,现在已经有很多的排序算法,对于不同的应用,每种算法都有不同的优势,排序算法主要依赖于:被排序的项数,对于项数值的限制,这些项数被修改的程度,计算机体系结构,以及使用的存储设备(主存、磁盘或者磁带)。
一般对于每个输入的实例算法输出正确,则称该算法正确。
并解决了给定的计算问题,但是有时候不正确的算法只要其错误率可控也是有用的,比如31章中,我们研究大素数算法时,将看到可控错误率的例子,但是通常我们只关心正确的算法。

算法解决哪种问题

算法的使用无处不在。例如
- 人类基因组工程,包含10万对基因,确定30亿个化学基对的序列,在数据库中存储和分析就需要算法进行分析,可以节省人和机器的时间和金钱。
- 互联网使得人们能够快速访问和检索大量的信息,需要借助算法来管理和处理这些海量的数据。
- 电子商务使得货物和服务通过电子的形式进行洽谈和交换,并且依赖于信用卡号、密码和银行结单等这类个人信息的保密性,其中电子商务中的公钥密码和数字签名,是以数值计算和数论为基础的。
- 制造业和其他的商务企业常常需要最有益的方式来分配稀有的资源,比如石油公司在什么地方开发油田合适?候选人在什么地方购买竞选广告?互联网提供商在什么地方确定资源放置的位置以更好的服务其客户,这些都是线性规划的问题。
虽然这些例子超过了本书的范围,但是本书确实涉及了一些适用这些问题的基本技术本书还说明了如何求解下列问题

  • 给定一张交通图,上面标记每对相邻十字路口之间的距离,确定从一个十字路口到另一个十字路口的最短距离,建立一个图并需找最短路径可以解决这个问题。
  • 对于给定的两个有序的符号序列X=(x1,x2,x3,…,xm)和Y=(y1,y2,y3,y4,…,yn),求出X和Y的最长的公共序列,这是动态规划的一个实例。
  • 给定一个依据部件库的机械设计,其中每个部件可能包含其他部件的实例,我们需要依次列出这些部件,以便每个部件出现在使用它的任何部件之前。如果该设计由n个部件组成,则存在着n!中可能的顺序,这比指数函数增长还快,这个问题是拓扑排序的一个实例。
  • 给定平面上的n个点,我们希望找到这些点的凸壳,凸壳就是包含这些点的最小的凸多边形。
  • 像这类的问题还是很多的,但是这些有趣的算法共有两个特征。(1)存在许多的候选解,但是绝大多数的候选解都没有解决手头的问题,寻找一个真正的解决或者一个最好的解是最大的挑战。(2)算法解决的每个问题并不都有个容易识别的候选解集,例如:有时候需要变换时域为频域。

数据结构

数据结构是存储和组织数据的方式,旨在便于访问和修改,没有一种单一的数据结构对于所有的用途都是有效的,所以重要的是要知道每种数据结构都有优势和局限性。

技术

虽然本书可以当一本“菜谱”来使用,但是也许某一天你遇到的一个问题,你无法很快的找到一个已有的方法来解决它(比如本书的后面的练习和思考题),本书会教你一些算法的设计和分析的技术,以方便你自己设计算法、证明其正确性和理解其效率。

难题

我们讨论大部分的有效的算法,通常用速度来度量效率,也就是一个算法要花多长的时间来产生结果,但是有时候我们还没有找到一个有效的解法,这类问题叫做NP完全问题
NP完全问题是有趣的?(1)对于是否存在有效算法是未知的。(2)NP完全问题集有个非凡的性质,就是对于任何一个NP完全问题如果存在有效地算法,那么所有的NP完全问题都存在有效的算法,NP完全问题的这种关系使有效解的缺乏更加的诱人。(3)计算机科学家通过问题的描述的小小的改变来很大的改变已知最佳算法的效率。
你应该了解NP安全问题,因为有些NP安全问题会时不时的在实际的应用中跳出来,如果要求你找出一个NP完全问题的有效解法,那么你就可能花费许多的时间在毫无结果的探寻中,如果你能证明这个问题是完全NP的,那么你可以把时间花费到开发一个有效的算法,这个算法是一个好的解,但不一定是最好的可能解。
作为一个具体的实例,考虑一家具有一个中心仓库的投递公司,每天在中心仓库为每辆车投递货物并发送出去,以将货物投递到结构地址,每天结束时,每辆货车返回以便第二天装货,为了节省成本,公司希望选择投递站的一个序,按照此序产生每辆货车行驶的最短总距离,这个问题就是著名的“旅行商问题”.并且它是NP完全的,它没有已知的有效地方法,但是在某种特定的条件下,我们知道最有效的方法,它们给出了一个离最小可能解不远的总距离,这个就是“近似算法”。

并行性

我们知道处理器的时钟速度是以某个持续的比率增加了多年,但是物理的限制对不断提高的时钟速度给出了一个基本的路障:因为功率密度随着时钟速度超线性增加,一旦时钟速度变得足够快,芯片将有融化的危险。所以对于每秒更多的计算,芯片通常涉及成不止一个核,我们可以把多核比拟成单一芯片上的几台顺序的计算机:换句话说,是并行计算机。

练习

(1)给出显示生活中需要排序或者计算凸壳的例子。
排序例子:学生成绩排名,比赛排名等
凸壳例子:图像处理中筛选出特定形状的物体。
(2)除了速度外,真实的环境中还有可能与那些其他的效率度量。
处理相同数据的所有的时间。
耗电量。
所需要的硬件资源。
(3)选择一种以前已知的数据结构,并讨论优势和局限性。
数组,优势可以轻松地访问每个元素,速度较慢。
(4)前面给出的最短路径和旅行商问题有哪些相似之处?又有什么不同?
都是找最短路径问题,前面的有有效解,后面的是NP完全问题,只能找到可能的接近的有效解。
(5)提出一个现实生活中的问题,其中只有最佳解才行,然后提出一个问题,其中近似最佳的一个解足够好。
从学校回家,怎样才最快回家?怎样才最省钱回家?
泰坦尼克号中的落水的人,选择那块木板比较好?

【学习笔记】算法导论基础知识1.1相关推荐

  1. 《Java并发编程实践》学习笔记之一:基础知识

    <Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念:  (2)进程:是一种活动,它是由一个动作序列组成 ...

  2. 前端学习笔记(js基础知识)

    前端学习笔记(js基础知识) JavaScript 输出 JavaScript 数据类型 常见的HTML事件 DOM 冒泡与捕获 流程控制语句 for..in 计时器 let,var,const的区别 ...

  3. 密码算法学习笔记01:基础知识-公钥密码和混合密码系统

    来自书籍<图解密码技术 第三版.pdf> 密码算法基础知识-公钥密码和混合密码系统 一.公钥密码 公钥密码--用公钥加密,用私钥解密. 公钥密码无需向接收者配送用于解密的钥匙,只需向发送者 ...

  4. 【学习笔记】网络安全基础知识总结

    网络安全基础知识总结 前言 一.网络安全概述 1.1 引言 1.2 密码学的发展 1.3 密码学基础 1.4 对称密码 1.4.1 数据加密标准DES 二.数论知识 2.1 数论基础 2.2 有限域 ...

  5. JAVA学习笔记(1)【基础知识】

    JAVA学习笔记DAY_1 提示:关于java系列的内容只是本人在老师的指导下和自学过程中的一些学习笔记,如果存在错误敬请批评指正! 文章目录 JAVA学习笔记DAY_1 前言 一.Java语言未来的 ...

  6. JS学习笔记二——JavaScript 基础知识

    JavaScript 基础知识 一.JavaScript 变量 二.JavaScript 的输出 三.JavaScript 运算符 四.结语 一.JavaScript 变量 变量是指在程序运行过程中, ...

  7. 网络通信学习笔记之——计算机网络基础知识

    一.计算机网络基础知识 1.什么是计算机网络 ​ 把分布在不同地理位置的计算机与专门的网络设备用通信线路互相连成一个规模大.功能强的系统, 从而使众多计算机可以方便地互相传递信息.共享软件.硬件.数据 ...

  8. php百分比乘加,PHP学习笔记第一篇 基础知识

    基础知识 我将php语言学习里面最最基础的部分,需要第一个学的,必须牢牢掌握的,归类到一起. 大纲 1.数据类型 2.变量 3.常量 4.操作符 5.流程控制 6.数组 7.字符串操作 8.正则 基础 ...

  9. 音视频学习笔记1--音视频基础知识(1)

    音视频基础知识 1 音视频开发是什么? 2 音视频数据处理流程 2.1 音视频数据采集 2.2 封装与解封装 2.3 音视频输出 2.4 音视频同步 3 视频中的基础概念 3.1 视频码率 3.2 视 ...

  10. 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...

    注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...

最新文章

  1. 基于Kubernetes 的机器学习工作流
  2. 皮一皮:35岁后你做什么?
  3. response.setcharacterencoding 报错是缺哪个包_出街,你缺的是这一款包包...
  4. 20180716:开博宣言
  5. DCMTK:用于管理常见细分特定类型的类
  6. SAP CRM里的settype和relationship有什么区别
  7. 察看linux内存使用情况
  8. 【CodeForces - 255C】Almost Arithmetical Progression (dp,离散化)
  9. abrels.inc.php_setlist.js
  10. python包路径有几个_python的搜索路径与包(package)
  11. Javascript--Folder对象
  12. python opencv 利用分水岭算法实现对物体的分割 图文详细注释版 以分割官网提供的硬币为例
  13. 跟着锅子一步步学习32位汇编(1)---第一个汇编程序
  14. Lazada新手卖家必看!只需掌握这三点,教你快速切入Lazada平台
  15. 快速生成数据库ER图的方式
  16. 谷歌重返中国_我如何利用数据科学重返幻想英超联赛并进入前1名
  17. e.target的用法
  18. 18.Consent 实现思路介绍
  19. 节俭生活-如何让机票打两折
  20. python中dic.get用法

热门文章

  1. Sql语句对数据库和表的简单操作
  2. 15. (附加)链表中间节点(C++版本)
  3. matlab电气常用工具箱,matlab电气工具箱实验指导书
  4. linux python2.7 post_在Python 2.7下面使用webpy框架
  5. lingo软件的基本使用方法_(PS软件)PHOTOSHOP基础操作和基本工具的使用
  6. (day 19 - 动态规划)剑指 Offer 42. 连续子数组的最大和
  7. mysql考试会自动给我们放好路径吗_Jsp struts mysql实现的在线考试系统项目源码附带视频运行教程...
  8. 留言板分页php,php留言板代码[经典的分页代码](1/4)
  9. c语言boon类型函数,函数式编程functional programming的特点
  10. 51单片机C语言堆栈,《单片机C语言试题》(一)20101027