一、抽象数据类型的表示与实现
抽象数据类型独立于具体实现, 将数据和操作封装在一起。
ADT,相当于在概念层(抽象层) ,描述问题。
类, 相当于在实现层,描述问题。
二、算法和算法分析
算法定义:是为了解决某类问题而规定的一个有限长的操作序列。
1.五个特性
(1)有穷性。
一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。
(2)确定性。
对于每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,使算法的执行者或阅读者都能明确其含义及如何执行。
(3)可行性。
算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
(4)输入。
一个算法有零个或多个输入。当用函数描述算法时,输入往往是通过形参表示的,在它们被调用时,从主调函数获得输入值。
(5)输出。
一个算法有一个或多个输出,它们是算法进行信息加工后得到的结果,无输出的算法没有任何意义。当用函数描述算法时,输出多用返回值或引用类型的形参表示。
2.四个评价标准
(1)正确性。
在合理的数据输入下,能够在有限的运行时间内得到正确的结果。
(2)可读性。
(3)健壮性。
当输入的数据非法时,好的算法能适当地做出正确反应或进行相应处理,而不
会产生一些莫名其妙的输出结果。
(4)高效性。
高效性包括时间和空间两个方面。
3.时间复杂度(Time Complexity)
与哪些因素有关:
软硬件等环境因素 | 最主要因素是问题规模 | 其他因素 |
---|---|---|
机器速度、编译程序质量 | 语句执行时间的总和 | 在数组中查询一个元素,元素是否存在,与存在的位置 |
问题规模
:是算法求解问题输入量的多少,是问题大小的本质表示,一般用整数n表示。
语句频度
:一条语句的重复执行次数
用 执行次数正比于算法执行时间的“基本语句” 的
语句频度
,来度量算法的 工作量。就是在问题规模充分大的时候, 以
语句频度
表示算法工作量的方式,计算时间复杂度
(不知道,有没有说明白啊,反正我懂了…)
书中给出时间复杂度定义:
一般情况下,算法中基本语句重复执行的次数是问题规模n的某个函数f0(n),算法的时间量度记作T(n) = O(f(n))
表示随问题规模n的增大,算法执行时间的增长率和f(n)一样,称作算法的渐进时间复杂度,简称时间复杂度。
·
其中 O(Order of Magnitude 数量级) , 表示增长率的上限。
所以,算法分析并非精确统计实际执行算法所需时间
它可以:
- 忽略低次幂项
- 忽略高次幂系数
- 同时可以用递归方程表示
而对于空间复杂度 S(n) = O(f(n))
- 只需分析该算法在实现时所需要的辅助空间就可以了
时间复杂度和空间复杂度往往是相互影响的,
当追求一个较好的时间复杂度时,
可能会导致占用较多的存储空间, (用“空间换时间”
)
即可能会使空间复杂度的性能变差,反之亦然。
通常情况下,鉴于运算空间较为充足,
人们都以算法的时间复杂度作为算法优劣的衡址指标。
本篇结束