本文主要参考书籍为《大话数据结构》第二章,算法。
目录
一、算法的定义与特性
特性:输入输出、有穷性、确定性、可行性。
1、输入输出:可能没有输入(如print "Hello World!");但是一定有一个或多个输出。
2、有穷性:算法不会出现无限循环。可以在有限的时间内运行结束。
3、确定性:每一步有确定含义,不会有二义性。相同输入有唯一输出。
4、可行性:每一步必须可行,每一步必须通过执行有限次数完成。
二、算法设计要求
1、正确性
2、可读性
3、健壮性:输入不合法时,算法也可以作出相关处理,而不是产生异常。
4、时间效率高、存储量低
三、算法效率的度量方法
1、事后统计方法
存在几个弊病:
必须利用设计好的测试程序和数据;
运算时间的比较非常依赖于环境,比如不同机器对同一程序运算速率不同;
效率高的算法在小数据集面前往往得不到体现。
2、事前分析估算方法
(1)高级语言程序在计算机上的运行速度往往取决于:
其中2,4分别取决于计算机软硬件的支持。抛开软硬件的关系不谈,程序的运行速度主要取决于算法的好坏与输入的规模。
(2)函数的渐进增长
比如算法A,输入为n时需要2n+3步运算;而算法B输入为n时需要3n+1步运算。当n>2时,算法A的运算步骤总比算法B少。所以算法B的增长渐进快于算法A。
(3)判断一个算法的效率时,函数中的常数和其他次要项往往可以忽略。应该关注住最高阶项的阶数。
事前估算的方法,主要就是依赖于判断几个算法关键执行次数的渐进增长性。通过算方法的时间复杂度进行预估。
四、算法的时间复杂度
1、定义
其中O()称为大O记法。
2、推导大O阶的方法
O(1): 常数阶
O(n):线性阶
O(n^2): 平方阶
O(log(n)): 对数阶,例子: