复杂度例题--C语言

本文介绍了C语言中的四个经典问题:模拟strchr函数复杂度、递归求阶乘、冒泡排序、二分查找和斐波那契数列的实现,详细分析了它们的时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

欢迎来到本期频道!

这期介绍关于复杂度的经典例题。(关于复杂度是什么?在上一篇已讲解,有需要的小伙伴可以看看哦!)
让我们一起来看看以下题目吧:

Ⅰ.模拟的strchr

const char* strchr(const char* str,char ch)
{
	while(*str)
	{
		if(*str==ch)
			return str;
		str++;
	}
	return NULL;
}
描述:该函数是在一个字符串str中找到第一个字符ch,找到返回该地址,没找到返回NULL。
问:该函数的时间复杂度和空间复杂度是多少?
答:
首先str的长度是N,由此可以知道while循环最多执行N次,
所以该函数的时间复杂度是O(N).
由于函数在运行时没有显示申请的额外空间,所以该函数的空间复杂度是O(1).

Ⅱ.N阶乘- -递归

int fun(int N)
{
	if(0==N)
	{
		return 1;
	}
	return N*fun(N-1);
}
描述:该函数用来求一定范围内的正整数阶乘 - - N!
问:该函数的时间复杂度以及空间复杂度。

在这里插入图片描述

答:
所以该函数
时间复杂度是O(N);
空间复杂度是O(N).

Ⅲ.冒泡排序

void bubble_(int* arr, size_t n)
{
	int i = 0;
	for (i = 0; i < n - 1; i++)			//最多N-1次
	{
		int flag = 1;
		int j = 0;
		for (j = 0; j < n - 1 - i; j++)			//最多N-1-i次
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;
				int t = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = t;
			}
		}
		if (flag)
			break;
	}
}
描述:该函数是用来将一组数组排成升序数组。
问:该函数的时间复杂度以及空间复杂度。
答:
N-1和N-1-i可以看成是N,因为这是主要影响时间复杂度的项,
所以该时间复杂度为O(N²).
由于该函数没有消耗额外空间,所以该函数空间复杂度O(1).

Ⅳ.二分查找

int bisect(int* arr,int len,int x)
{
	int left=0;
	int right=len-1;
	int mid=0;
	while(left<=right)
	{
		mid=left+(right-left)/2;
		
		if(arr[mid]<x)
		{
			left=mid+1;
		}
		else if(arr[mid]>x)
		{
			right=mid-1;
		}
		else
			return mid;
	}
	return -1;
}
描述:该函数是在一组升序数组中找到目标值,找到返回该值的下标,没找到返回-1.
问:该函数的时间复杂度以及空间复杂度。

在这里插入图片描述

答:
一般情况下,log₂N会简写成logN,故该函数的时间复杂度为O(logN).
由于该函数没有额外的空间开销,所以该函数的空间复杂度为O(1).

Ⅴ.斐波那契数列

int fib(int N)
{
	if(N<3)
		return 1;
	return fib(N-1)+fib(N-2);
}
描述:该函数可以返回第N个斐波那契数列的值。
问:该函数的时间复杂度以及空间复杂度。

在这里插入图片描述

答:

为了方便计算时间复杂度,可以假设每行的调用次数都是2行数减一,
所以f(N)=2º+2¹+···2N-1+2N .
利用错位相减法:
2×f(N)=2¹+2² +···2N+2N+1
2×f(N)-f(N)=f(N)=2N+1-1

故该函数的时间复杂度为O(2ᴺ).

在这里插入图片描述

结合图解分析,调用fib(5)会创建4快函数空间,所以可类推调用fib(N),N>=3,将创建N-1块函数栈帧。
故该函数的空间复杂度为O(N).
本期分享就到这里了,希望能让你更热爱C语言。
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值