一.算法与程序
1.算法:对于计算机科学来说,算法的概念极其重要。通俗的讲,算法是指解决问题的方法或者过程。严格来讲,算法是满足下述性质的指令序列。
(1)输入:有零个或多外部量作为算法的输入
(2)输出:算法产生至少一个量作为输出
(3)确定性:组成算法的每条指令必须是清晰地,无歧义的
(4)有限性:算法中每条指令执行的次数有限,执行每条指令的时间也有限
2.程序:程序是算法用某种编程语言的具体实现。程序可以不满足上述的第4点即有限性。如操作系统。
二.算法与数据结构
在课本的1.2中,讲到了表达算法的抽象机制。文字很长,在知乎上看到有个学生的回答:算法是元帅,数据结构是将军,编程语言是士兵,呵呵,不知道对不对。我结合课本的理解如下:
1.算法十分复杂,而我们要将它转换为代码,就需要进一步的抽象。对于一个明确的数学问题,我们要设计它的算法,总是先选用该问题的一个数据模型。比如要排序,数据模型就是要排序的对象,它可以是整形数组的数据结构,拥有二分,倒序之类的方法。接着我们弄清楚数据模型在已知条件下的初始状态和要求的结果状态,以及这两个状态之间的隐含关系,然后在探索从初始状态到结果状态的步骤,也就是我们要学习的算法。
2.按照自顶向下逐步求精的原则,在探索运算步骤时,首先考虑算法顶层的运算步骤,再考虑底层的运算步骤。所谓顶层运算步骤就是定义在数据模型级上的运算步骤,是算法的主干部分,比如在归并排序中,将排序对象分开分别排序,递归排好序放到新对象,还有copy新对象中已排好序的部分到原对象,这些都是顶层运算步骤。底层运算步骤就是顶层抽象运算的具体实现。包括数据模型的具体实现和定义在数据模型上的运算的具体实现。如归并算法中对象要用到的排序方法和copy方法。(归并排序后续讲到)
3.抽象数据类型ADT是算法设计的重要概念。严格来说,它是算法的一个数据模型连同定义在上面该模型上并作为算法构件的一组运算。
三.算法复杂度分析
1.算法复杂性就是算法在运行是需要计算机资源的量,需要时间资源的量成为时间复杂性,需要空间资源的量称为空间复杂性。
2.用N,I,A分别表示要解问题的规模,算法的输入,和算法本身。复杂性C=F(N,I,A).成确定的3元函数关系。
3.时间复杂度:
假设算法中有k种元运算Ok,执行每种元运算的时间为tk,执行每种元运算的次数是ek,叫他们累积起来便是算法所花费的时间
4.本书只考虑最坏,最好,平均这三种情况下的时间复杂度。时间复杂度的具体计算会在之后的例子说明。
5.题目:
第三题O(1)可以理解为表示n达到一定程度表达式就不增长了