第二章 算法

算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

一. 算法的特性

输入输出, 有穷性,确定性,可行性。

注:算法的输入可以是零个。算法至少有一个或者多个输出,输出的形式可以是打印输出,也可以是返回一个或多个值等。

二.算法设计的要求

正确性,可读性,健壮性,时间效率高和存储量低。

三.算法效率的度量方法

事后统计法和事前分析估算法。

四.算法时间复杂度

定义:算法的时间复杂度就是算法的时间量度,记作T(n) = O(f(n))。它表示随问题规模n的增大,算法的执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。其中f(n)是问题规模n的某个函数。(大O记法)

一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。

如下代码,循环的时间复杂度为O(n), 因为循环体中的代码需要执行n次。

int i;
for(i = 0; i < n; i++)
{
	/* 时间复杂度为O(1)的程序步骤序列 */
}

 下面的代码,由于每次count乘以2之后,就距离n更近了一分。也就是说,有多少个2相乘后大于n,则会退出循环。由2^x = n得到x = log2n。所以时间复杂度为O (logn)。

int count = 1;
while count < n)
{
	count = count * 2;
	/* 时间复杂度为O(1)的程序步骤序列 */
}

如下循环嵌套,内循环时间复杂度为O(n), 外循环时间复杂度为O(m),所以总时间复杂度为O(m*n)。

int i,j;
for(i = 0; i < m; i++)
{
	for(j = 0; j < n; j++)                
	{                                      
		/* 时间复杂度为O(1)的程序步骤序列 */
	}                                      
}

推导使用方法:1.用常数1取代运行时间中的所有加法常数。

                          2.在修改后的运行次数函数中,只保留最高阶数。

                          3.如果最高阶项存在且其系数不是1,则去除与这个项相乘的系数。

常见的时间复杂度所耗时间的大小排列:

O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值