算法笔记1 -- 时间复杂度

认识时间复杂度

基础概念

常数时间操作: 一个操作与数据量无关的,无论多大的数据量都是固定时间完成的操作成为常数时间操作。
时间复杂度的表示: 我们常常使用bigO(T)的形式来表示时间的复杂度,bigO只是一种符号也可以简写成O,T表示程序运行的时间。总体可以简写成O(T)。
评价一个算法流程的好坏,看的就是时间复杂度,在分析不同样本的常数时间

时间复杂度的计算方法

在讲解时间复杂度之前我们来分析下面这个案例:
我们在上学的时候都听说过著名的高斯课堂装逼速算1~100的和吧。那这个我们该怎么用程序来实现呢?
在这里插入图片描述
(完)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
好吧,你都看到了这里了。就勉为其难告诉你吧。

我想很多的朋友刚开始的时候会使用循环来来计算。形如:

	int sum = 0;
	for (int i = 1; i <= 100; i++)
	{
		sum += i;
	}
	cout << sum << endl;
	

本文采用的是C++代码,但是都忽略语言特性,其他语言的皆可看懂。

当然这样写是可以的,上面我们讲到一个操作与数据量无关的为常数时间,但是在这个程序中存在循环,循环是跟数据量的大小有关的。所以这个时间的复杂度为O(n)

上过高中的朋友应该知道,其实这个是一个等差数列,我们可以直接使用等差数列的公式进行计算。

	//n代表总数,a代表首项,d代表公差
	int sum = 0, n = 0, a = 0,d =0;
	cin >> n >> a >> d;
	sum = n * a + (n * (n - 1) / 2)*d;
	cout << sum << endl;

这个代码中与数据量无光所以是常数时间,时间复杂度为O(1)。
很多朋友可能会问,这个代码中一共有四行代码不应该是O(4)吗,怎么是O(1)?
这就牵扯出我们时间复杂度的计算规则了。

保留最高阶项,去除其他低阶项,并且去除最高阶项的系数。

这句话怎么理解呢?我们来看看下面这段代码。

	/*查找arry1中的数是否在arry2中,输出存在的数并且写入arry3中*/
	int arry1[5] = { 1,2,3,4,5 }, arry2[5] = { 1,2,6,7,8 }, arry3[5]={0};
	for (int i = 0; i < 5;i++)
	{
		for (int u = 0; u < 5; u++)
		{
			if (arry1[i] == arry2[u])
				arry3[i] = arry1[i];
		}
	}

	for (int k = 0; k < 5; k++)
	{
		cout << arry3[k] << endl;
	}

这段代码写的很冗杂,主要是i想让各位能够理解。
在这个代码中我们有一个循环的嵌套,外部还有当个循环。到这里应该可以很容易的看出这个是与数据量有关的,我们假设arry1的数据量是n,arry2的数据量也是是n,可以初步判断这个时间复杂度为O(n2)+O(n),更具上面的规则保留最高阶n 2忽略后面的低阶项,所以最终的时间复杂度为O(n2)

当然如果这里的arry2中的数据量是m,那么我们就无法确定最高阶,那么时间的复杂度就为O(n*m)+O(n)。

时间复杂度不仅仅与循环有关,还与递归有关。

递归

递归的过程是一个压栈的过程,这里就简要的说一下。
问递归是什么的请度娘了解。
在这里插入图片描述
在每一次进行递归的同时,系统会把这次运行的所有数据压入到一个栈里面比如:
在这里插入图片描述
我们来看下面这个求阶乘的程序

int fun(int i)
{
	if (i == 1)
		return 1;
	return i * fun(i - 1);
}
int main()
{
	int a = fun(5);
	cout << a << endl;
}

递归一般伴随着判断,如果不加以判断将会无限递归下去,最后栈溢出。
在第一次递归调用的时候,我们在栈中压入了i的值以及返回值,进行第二次的递归后面也是同理,在这次递归中,时间复杂度与我们传入的i的值相关,也就是数据量。在递归函数中也没有看到其他与数据量相关的操作。所以这个递归的时间复杂度是O(n)

笔者也正在学习初学算法,希望能够将自己所学叙述给各位朋友,如果有不对的地方望指出,接受批评。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值