数据结构与算法初探

数据结构与算法

什么是算法

官方的解释:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。在我看来,就是解决问题采用的一种方法,我们学编程的终究是要把这些方法落实到代码中,不同的算法,也就是你实现的代码不一样,但是目的都是一样的,都是为了解决问题。

什么是时间复杂度

时间复杂度来衡量一个算法的好坏一个指标。先说一下官方解释:在计算机科学中,算法的时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。例如,如果一个算法对于任何大小为 n (必须比 n0 大)的输入,它至多需要 5n^3 + 3n 的时间运行完毕,那么它的渐近时间复杂度是 O(n^3)。实话说,看不太懂,你可以这样理解:时间复杂度就是怎么样解决问题的方法比较快,花费的时间比较少,用张图来说明吧。
在这里插入图片描述
起点到终点的一个过程就是所谓的算法,而起点到终点的三条路线的远近就可以用来表示他们的时间复杂度,路线近,就可以说他的时间复杂度低,算法就好,线路远,时间复杂度就高,算法就比较复杂。但是时间复杂度只是衡量一个算法好坏的一个指标,还有其他的指标,例如空间复杂度。

时间复杂度的表示:大O表示法

同样的,我先来看看官方对这个方法的定义:若存在函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n) 的同数量级函数。记作T(n)=O(f(n)),称为O(f(n)),O为算法的渐进时间复杂度,简称为时间复杂度。因为渐进时间复杂度用大写O来表示,所以也被称为大O表示法。

看不懂没关系,你只需知道他如何表示就行了。大O标识法的形式就是O(n),O就是大写的字母O,括号里的数可以是已知的,例如1,也可以是未知的。例如 n 或者和n相关的函数;这个n是什么意思呢,就是代表未知数的意思,有点约定俗成的意思。

如何计算时间复杂度

我们先来看一段代码:

public static int test(int n) {	
		return n++;	
	}

这段代码很简单,就是给定一个值,然后加1返回。这就是一个很简单的算法,只不过比较简单,我们怎么来算他的时间复杂度呢?

我们先约定好,在方法体内,每执行一次操作,我们可以记作1,就是花费一个时间单位。

在这个方法体内,就只有return++ 这一条代码,算是一次操作,就是花费一个时间单位,也就是1,那他的时间复杂度就是O(1)。不用纠结,继续往下看下一段代码:

public static int test(int a) {		
		a=+5;
		return a++;	
	}

这段代码就比上面的代码多了一行代码,也就是多了一个时间单位的花费。整个代码也就是花费了两个时间单位,它的时间复杂度是O(1),是不是有点诧异,不是花费了两个时间单位了嘛,为什么时间复杂度还是O(1),你只要记住:只要是花费常数个时间单位,时间复杂度始终都是O(1)。

我们在看看时间复杂度O(n)是什么情况,看下面这段代码:

public static int test(int n) {
		int sum = 0;
		for (int i=0;i<n;i++) {
			sum=+i;
		}
		return sum;
	}

这段代码有一个for循环,我们看看它的时间复杂度如何计算,int sum = 0执行1次,1个时间单位。主要是这个for循环的时间单位如何计算,这里有个未知数n,分析可知,这个for循环会执行n+1次,也就是会花费n+1个时间单位,循环体内的sum+=1这行代码会执行n次,花费n个时间单位,然后在执行最后一行的代码return sum费一个时间单位,那么这段程序总共花费了1+n+1+n+1=3+2n个时间单位,那么他的时间复杂度就是O(n)。如果它花费的时间单位是3+2n2的话,它的时间复杂度就是O(n2)。

对于这个说法比较官方的解释就是:

  1. 如果运行时间是常数量级,则用常数1表示
  2. 只保留时间函数中的最高阶项
  3. 如果最高阶项存在系数,则省去最高阶项前面的系数

举个栗子:如果一个算法的花费了3+2n^3 +5时间单位,那么按照上面的规则,它的时间复杂度就是O(n^3);

总结

经过上面的叙述,对算法和时间复杂度的概念应该有个初步的认识了,对于时间复杂度的计算应该也没啥问题了,当然我上面的算法都是一些比较简单的,对于复杂的我们可能还算不出来,不过随着我们 学习的加深,会慢慢了解,先有个概念,由浅到深。

下面看一张时间复杂度的函数图
在这里插入图片描述
这张图学过数学的应该都能看懂,越陡的时间复杂度越高,花费时间就越多,算法的性能就越差。

参考来源:

微信公众号:编码之外,作者有很多的java自学资源,此篇是我看数据结构与算法基础做的笔记。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值