【算法复习】算法基础:渐进式分析、分治法

本文通过复习MIT的公开课和《算法导论》,探讨了算法中的渐进式分析,包括Θ、O、Ω、o、ω的含义,并强调其非自反性和集合关系。详细分析了插入排序的时间复杂度为Θ(n^2),以及归并排序的时间复杂度为Θ(nlgn),使用主定理和分治法进行解释。此外,还介绍了分治法的应用,如快速幂、二分查找和Fibonacci数列的不同计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值