【数据结构】空间复杂度、时间复杂度

空间复杂度

任何程序的存储空间需求S(P)=c+Sp

c表示固定空间,通常包括指令空间等

Sp表示可变空间,其大小依赖具体要解决问题的特殊实例

e.g.  递归累加函数

float Rsum(float* a,const int n)
{
   if(n==0)
      return a[0];
   else
      return (Rsum(a,n-1)+a[n]);
}

每次调用Rsum,需要4个存储空间:a,n,返回值,返回地址

递归深度为n+1

所以空间复杂度为4(n+1)

时间复杂度

时间复杂度计算可以看所有程序步的总和,取其次数最高项(与n有关,并且去掉系数)

但是有时计算程序步总和比较复杂,所以我们可以看被重复最多次的程序,计算它的重复次数,取其次数最高项。(一般都是循环体最内层的程序)

e.g. for循环

void fun(int n)
{
  int x=0;
  for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
      x++;
}

它的时间复杂度就看x++,重复n^2次,所以t=O(n^2)

e.g.  递归累加函数

float Rsum(float* a,const int n)
{
   if(n==0)
      return a[0];
   else
      return (Rsum(a,n-1)+a[n]);
}

t(0)=2  (if语句执行一次,return语句执行一次)

t(1)=2+2 (在t(0)基础上加上if语句一次,else中return语句一次)

……

所以,t(n)=2+t(n-1)

                =2+2+t(n-2)

                =……

                =2n+2

所以时间复杂度为O(n)

e.g. 折半查找

int BinarySearch(int* a, int n, int t)
{
	int left = 0;
	int right = n - 1;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (a[mid] == t)
			return mid;
		else if (a[mid] > t)
			right = mid - 1;
		else if(a[mid]<t)
			left = mid + 1;
	}
	return left;
}

我们可以看到,这个方式是每查找一次,都缩小一半的范围,执行两个程序步

所以,2*2*2*……*2=n,重复次数就是logn,t=O(logn)  (底数2省略)

e.g. 全排列生成器

void Permutations(char* a,const int k,const int m)	//a代表字符数组,m代表元素个数-1(下标从0开始 )
{
	if(k==m)
	{
		for(int i=0;i<=m;i++)
		{
			cout<<a[i]<<" ";
		}
		cout<<endl;
	}
	else
	{
		for(int i=k;i<=m;i++)
		{
			swap(a[k],a[i]);
			Permutations(a,k+1,m);
			swap(a[k],a[i]);
		}
	}
}

我们可以看到,全排列生成器就是

每次都将第一个数与后面的数交换位置,得到新的序列,     (第1次)

新的序列每次都将第二个数与后面的数交换位置                   (第2次)

……

重复下去直到序列都将倒数第二位数与末位数交换位置            (第n次)

所以t=(n-1)!+(n-2)!+……

所以t=O(n*n!)

参考书籍:数据结构基础(C++)语言版 (第二版)   

                   清华大学出版社

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗勒柑橘调

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值