首先介绍一下什么是算法?算法有哪些特性?如何判断算法的好坏?
算法(Algorithm)
(一)算法有以下特性:
1. 一个有限指令集
2. 接受一些输入(有的情况下,不需要输入)
3. 产生输出 (否则算法没有意义)
4. 一定在有限步骤之后终止
5. 每一条指令必须
1) 有充分明确的目标,不可以有歧义
2) 计算机能处理的范围之内
3) 描述应不依赖于任何一种计算机语言以及具体的实现手段(就是说描述手段要抽象)
示例:
选择排序算法的伪码描述 —— 用于说明算法描述手段抽象的特性。
void selectionSort(int[] list){
// 将N个整数list[0]...list[N-1]进行非递减排序
for(int i = 0; i < list.length;i++){
//从list[i]到list[N-1]找最小数,并将其位置赋值给minPosition
int minPosition = scanForMin(list, list.length-1);
//将未排序部分的最小数换到有序部分的最后位置
swap(list[i], list[minPosition])
}
}
抽象提现在:
1. list是数组还是链表(虽然看上去像是数组)?
2. swap的实现是用函数还是别的方式?
这两个问题都不清楚,但是这并不妨碍去说明这个算法是怎样的。算法本身和这两个问题没有关系。
(二)衡量算法的指标
1. 空间复杂度S(n)—— 根据算法写成的程序在执行时占用存储单元的长度。 这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断。
2. 时间复杂度T(n)—— 根据算法写成的程序在执行时耗费时间的长度。这个长度往往与输入数据的规模有关。时间复杂度过高的算法可能导致由于耗费时间过长而等不到运行结果。
n指的是数据的规模,不管是算法的时间复杂度还是算法空间复杂度都是跟要处理的数据的规模有关系,都是n的函数。
3. 时间复杂度的计算
由于计算机加法运算的速度很快,所以在计算时间复杂度的时候, 主要关注乘法的运算次数。
具体的时间复杂度的算法,可以参考下面这位兄台的博客。
http://blog.csdn.net/hitwhylz/article/details/12374407
4. 在分析算法的效率时,主要关注下面两种复杂度:
1) 最坏情况复杂度Tworst(n)
2) 平均复杂度 Tavg (n)
我们一般更注重Tworst(n), 因为到底什么时候算是Tavg (n),这个程度很难界定。