时间复杂度_易懂版


1、找到执行次数最多的语句

2、语句执行语句的数量级

3、用O表示结果

计算时间复杂度的3个出发点,掌握这三个出发点,那么一向搞不懂的时间复杂度就可以迎刃而解啦。

然后:

1、用常数1取代运行时间中的所有加法常数

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

3、如果最高阶项存在且不是1,那么我们就去除于这个项相乘的常数。比如3n2我们取n2

最后就可以得到你们想要的结果了。

举几个例子:

我们来看一下这个例子,用的是java,内容就是打印6条语句,问这个程序的时间复杂度是多少?

public class Test {
	public static void main(String[] args) {
		System.out.println("xxx");
		System.out.println("xxx");
		System.out.println("xxx");
		System.out.println("xxx");
		System.out.println("xxx");
		System.out.println("xxx");
	}
}

当然不是O(6)!!!按照时间复杂度的概念“T(n)是关于问题规模为n的函数”,这里跟问题规模有关系吗?没有关系,用我们的第一个方法,时间复杂度为O(1)。

例子二(线性阶)

public class TS {
	public static void main(String[] args) {
		int sum = 0;
		for(int i=1;i<=100;i++) {
			sum = sum + i;
		}
	}
}

时间复杂度为O(n)

例子三(平方阶)

public class TS {
	public static void main(String[] args) {
		int sum = 0;
		for(int i=1;i<=100;i++) {
			for(int j=1;j<=100;j++)
				sum = sum + i;
		}
	}
}

外层i的循环执行一次,内层j的循环就要执行100次,所以外层执行100次,那么总的就需要执行100*100次,那么n次呢?就是n的平方次了。所以时间复杂度为:O(n^2)。

平方阶的另外一个例子:

public class TS {
	public static void main(String[] args) {
		int sum = 0;
		for(int i=1;i<=100;i++) {
			for(int j=i;j<=100;j++)
				sum = sum + i;
		}
	}
}

当i=1的时候执行n次,当n=2的时候执行(n-1)次,…

一直这样子下去就可以构造出一个等差数列:n+(n-1)+(n-2)+…+2+1

根据等差数列的求和公式:或者

求和易得:n+n*(n-1)/2整理一下就是n*(n+1)/2然后我们将其展开可以得到n^2/2+n/2。

根据我们的步骤走,保留最高次项,去掉相乘的常数就可以得到时间复杂度为:O(n^2)

例子四(对数阶)

public class TS {
	public static void main(String[] args) {
		int i=1;
		int n= 100;
		while(i<n) {
			i = i*2;
		}	
}

2^x = n,所以时间复杂度为O(log2n)。

补充常用的时间复杂度所耗费的时间从小到大依次是:

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

最坏情况与平均情况:

平均运行时间是期望的运行时间。

最坏的运行时间是一种保证。我们提到的运行时间都是最坏的运行时间。

可以通过空间来换取时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值