算法概述以及时间复杂度


算法

1、概念

算法是求解特定问题的描述,是一步步解决问题的一种方法。

2、如何评价算法的好坏

算法的好坏即算法的运行效率怎么样,这里就要涉及到两个方法

①事后统计法

事后统计法是通过设计好的程序和数据,利用计算机的运行时间进行比较算法的时长来确定算法的好坏
弊端:

  • 必须事先编好程序,如果数据要处理大量的数据,则会浪费掉很多时间。
  • 时间的比较依赖于计算机的硬件和软件环境
  • 算法的测试数据设计困难,不能保证运算的高效率,设计的量小,体现不了算法的优越性,设计的数据大,会耗费很多时间。
②事前分析法

事前分析法是在编程之前,依据统计方法对算法进行估算
程序在计算机上运行的时间取决于以下几点:

  • 算法采用的策略、方法
  • 编译产生的代码质量。
  • 问题的输入规模
  • 机器执行指令的速度

3、算法时间复杂度

算法的时间复杂度讨论的是算法的输入规模N的数量级,不是算法的具体执行次数。

①常数阶O(1)

常数阶指的是无循环、无递归,与输入问题规模无关的代码。
在这里插入图片描述
如图时间复杂度随着问题规模的增加不变的代码复杂度就是常数阶。

②线性阶O(n)

线性阶与问题输入规模有关,主要形式就是一层循环的代码。如图:
在这里插入图片描述

③线性阶O(n+m)

这个和O(n)一样,只不过我们有两种数据的输入规模。例如:

int n = 100;
int m = 100;
for(int i =1;i<n;i++){
System.out.println(i);
}
for(int i = 1;i<m;i++){
System.out.println(i)
}

上述代码是并列的连个循环,但是也应该是线性阶。

④平方阶O(n²)、O(nm)

平方阶就涉及到了嵌套循环,如下所示:

int n = 100;
for(int i =1;i<n;i++){
	for(int j =1;j<n;j++){
		System.out.println(i+j)}
}

如上所示是一个嵌套循环,说明它的时间复杂度是平方阶。我们再增加一下输入规模,如下:

int n =10;
int m =20;
for(int i = 1;i<n;i++){
	for(int j = 1;j<m;j++){
		System.out.pintln(n+m);
	}
}

伴随着输入规模的增加,平方阶自然就变成了O(nm)。

⑤ 对数阶

对数阶是与问题输入规模有关的,正如对数图像所示,问题规模越大,时间在增长但是不是太激烈。
在这里插入图片描述

总结

常见的阶如下所示:
在这里插入图片描述
他们各自对应的图像比较也比较清晰:
在这里插入图片描述
这样我们在事前分析的时候也能大概分析下问题的时间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值