最近在看MIT的公开课复习算法,参考书是《算法导论》
1、Asymptotic Analysis
Θ、O、Ω、o、ω的含义(类比数学上的=,<=,>=,<,>)
在渐进式分析中,等于符号“=”不具有自反性,如n=O(n^2),不能反过来写作O(n^2)=n。
还应注意:事实上,这些符号刻画的不是等于关系,而更像是集合中的属于关系,例如,上式写成n∈O(n^2)就不会引起太多疑惑(因为O(n^2)其实是一个函数族!),但习惯上我们仍然使用“=”符号。
渐进符号可以参与运算,但是在数学归纳法中不能直接使用它们。
分析时间复杂度的过程通常是“粗糙”的,这也是渐进式分析给人的感觉(我们通常会省略一些贡献不大的项)。
例子:Insertion sort
插入排序(Insertion sort)是一种比较naive的排序方法,下面是它的C++实现:
void InsertionSort(ElementType A[], int size)
{
int i,j;
int tmp;
if(size<=1)
{
return;
}
for(i=1;i<size;i++)// start from the second elem in the array
{
tmp=A[i];// get this elem and store it
j=i;// start from this position back to the beginning of the array
while(j>0&&tmp<A[j-1])// if j is NOT out of the boundary && we find some bigger elem
{
A[j]=A[j-1];// move this bigger elem forward, notice this causes DUPLICATES!!!
j--;
}
A[j]=tmp; // remove this duplicate with tmp
}
}
注意Insertion sort执行的过程中会导致元素重复,但这并没有关系,在外循环的最后,这个重复的元素会被预先记下的tmp给替代掉。
插入排序的时间复杂度是Θ(n^2),简单证明:
内循环中每次只做常数时间的操作,记作Θ(1),考虑外循环,则T(n)=ΣΘ(1),从1到n求和,则T(n)=Θ(n^2)。
这是一个还不错的时间复杂度=。=,一般元素个数在30左右及以下时,插入排序的表现是优秀的,但是当元素个数较大时,插入排序就比较慢了。
下面介绍比插入排序更快的排序算法:归并排序(Merge Sor