第二章、算法
算法和数据结构的关系
数据结构中讲算法是为了帮助对数据结构的理解
算法
定义:解决特定问题求解步骤的描述
特性:
- 输入:0或多个(如,print helloworld)
- 输出:1或多个
- 有穷性:执行有限的步骤,在有限的时间内完成。
- 确定性:每一个步骤有确定的含义,没有二义性。相同的输入只能有一个结果。
- 可行性:算法可以转换为程序上机执行。
好算法的标准:
- 正确性:①语法正确 ②合法输入,正确输出 ③非法输入,满足规格输出 ④存心刁难,正确输出
- 可读性
- 健壮性
- 时间效率高、空间低
算法效率的度量方法
事后统计
缺点:①编写统计的程序费时 ②和软硬件有关 ③测试数据不好设计
事前估计
一个程序的运行时间,是受算法的好坏和问题规模的控制
函数的渐进增长
比较两个算法的好坏,要视问题的规模而定。
给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐进快于g(n)。
判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,更应该关注主项(最高阶项)的阶数。
算法时间复杂度
T(n)是关于问题规模n的函数,T(n) = O(f(n)),其中O(f(n))成为算法的时间复杂度。随着n的增加,算法执行时间的增长率与f(n)的增长率相同。
推导大O阶:
- 加法常数都变为1
- 函数只保留最高阶
- 最高阶存在且不是1,则去掉与这个项相乘的常数,得到的结果就是大O阶
常见时间复杂度:
- O(1):常数阶
- O(logn):对数阶
- O(n):线性阶
- O(n平方):平方阶
- O(nlogn):nlogn阶
- O(n立方):立方阶
- O(2的n次方):指数阶
最好、最坏、平均:
- 最好:一次就成功那种
- 最坏:通常意义下的时间复杂度都是最坏
- 平均:很难分析得到