iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构时间复杂度及空间复杂度简要分析
  • 168
分享到

C语言数据结构时间复杂度及空间复杂度简要分析

2024-04-02 19:04:59 168人浏览 泡泡鱼
摘要

目录一、时间复杂度和空间复杂度是什么?1.1算法效率定义1.2时间复杂度概念1.3空间复杂度概念二、如何计算常见算法的时间复杂度和空间复杂度2.1时间复杂度计算2.2空间复杂度计算2

一、时间复杂度和空间复杂度是什么?

1.1算法效率定义

算法效率分为两种,一种是时间效率——时间复杂度,另一种是空间效率——空间复杂度

1.2时间复杂度概念

时间复杂度,简言之就是你写一个代码,它解决一个问题上需要走多少步骤,需要花费多长时间。打个简单的比方:现在给10个数,要求找到7在哪里1,2,3,4,5,6,7,8,9,10。我们要求写一个代码,同学狗蛋写了一个暴力查找,从第一个数依次往后遍历,他的算法要找7次,同学狗剩写了一个二分法查找,只要找2次,这就是时间复杂度的比较
算法中的基本操作的执行次数,为算法的时间复杂度

1.3空间复杂度概念

空间复杂度,是对一个算法在运行过程中临时占用存储空间大小的量度。举个栗子:我们现在要求写一个代码,狗蛋啪啪啪敲了一大堆变量,程序运行了,狗剩就用了很少的变量,程序也运行了。但是他们两个在代码运行中变量多少不同,占用的内存多少是不一样的。空间复杂度,它计算的是变量的个数。

二、如何计算常见算法的时间复杂度和空间复杂度

我们在计算时间/空间复杂度时用的都是大O渐进表示法(是一种估算法)

2.1时间复杂度计算

我们以一个简单的函数举例
代码如下:


void func1(int n)
{
	int i = 0;
	int j = 0;
	int k = 0;
	int count = 0;
	for (i = 0;i < n;i++)
	{
		for (j = 0;j < n;j++)
		{
			count++;
		}
	}
	for (k = 0;k < 3 * n - 1;k++)
	{
		count++;
	}
}

试问:该函数如果被调用,要运行多少次?
我们清楚的看出i进去有n次,共有n个i,第一个for结束要运行n^ 2次,第二个for要执行3n-1次,共执行n^ 2+3n-1次
那么我们这里的时间复杂度是否就是n^2+3n-1呢?答案是否的
我们前面说过,时间复杂度和空间复杂度用的都是大O渐进表示法,是一种估算法

我们取的值,是取对表达式中影响最大的那个

我们以n^ 2+3 * n-1这个式子进行举例:设f(n)=n^2+3n-1
n=1,f(n)=1+3-1=3
n=10,f(n)=100+30-1=129
n=100,f(n)=10000+300-1=10299
n=1000,f(n)=1002999

很容易发现,对f(n)影响最大的是n^ 2,设g(n)=n^2
n=1,g(n)=1
n=10,g(n)=100
n=100,g(n)=10000
n=1000,g(n)=1000000

当n越大,g(n)就越接近f(n)
那么这里的时间复杂度大O渐进表达法写法是这样的:O(n^2)

2.2空间复杂度计算

学习空间复杂度的求解之前,我们要知道,空间复杂度也是用大O渐进表达法进行求解,我们计算的不是所占空间大小,而是变量的个数。先来看一段代码:
代码如下(示例):


#include<stdio.h>
void bubblesort(int*a, int n)
{
	assert(a);
	for (size_t end = n;end > 0;--end)
	{
		int exchange = 0;
		for (size_t i = 1;i < end;++i)
		{
			if (a[i - 1] > a[i])
				swap(&a[i - 1], &a[i]);
			exchange = 1;
		}
		if (exchange == 0)
			break;
	}
}

在上面这个代码中,我们创建了三个变量分别是size_t endint exchangesize_t i,尽管我们这个函数会经历很多的循环,但这三个变量是反复使用的,也就是说他们所占的空间是被反复使用的,空间的多少是没有变的,这里区别时间复杂度——时间是累计的,空间是不累计的(对于时间复杂度,每次循环都会被计算;对于空间复杂度,空间是可以被反复使用的)。

我们上面说过,空间复杂度计算也是用的大O渐进表示法,对于常数,我们统一用O(1)表示(大O渐进表示法详情见时间和空间复杂度篇1)

ps1:assert通常用于诊断程序中潜在的BUG,通过使用assert(condition), 当condition为false时,程序提前结束运行,利于程序BUG的定位。
ps2:size_t是一种类型,把它看作long unsigned int

我们再来看一段代码:
代码如下(示例):


//计算bubblesort的空间复杂度
#include<stdio.h>
long long Factorial(size_t n)
{
	return N < 2 ? N : Factorial(n - 1)*n;
}

这段代码是一个很简单的递归实现阶乘运算,那么它的空间复杂度是多少呢?我们先假设传过去的n=10。

在这里插入图片描述

10传过来我们会进行10次递归,每次递归是创建一个函数栈帧(也就是一个空间),共创建10次,每一次的空间复杂度都是O(1)。把10换成n,也就是进行n次递归,每次递归会创建1个函数栈帧,空间复杂度是O(n)。

ps:可能会有小伙伴问,那函数栈帧递归往回走的时候不是销毁了吗?注意:这里的空间复杂度是计算的“最坏、最多的情况”,况且不管是什么函数,在使用过后其栈帧都会销毁,空间复杂度算的是它用的空间最多的时候。

2.3快速推倒大O渐进表达法

1.常数1代替所有加法运算中的常数
2.只保留最高阶(高数极限思想)
3.若最高阶存在且不为常数,则去除最高阶的系数,比如3*n^ 9,去掉系数变为n^9

我们再来看两个代码训练一下
代码1如下:


void func2(int n)
{
	int i = 0;
	int k = 0;
	int count = 0;
	for (i = 0;i < 3n;i++)
	{
		count++;
	}
	for (k = 0;k < 6;k++)
	{
		count++;
	}
}

这里f(n)=3n+6,它的大O渐进表达法就是O(n)

代码2如下:


void func3(int n)
{
	int i = 0;
	int count = 0;
	for (i = 0;i < 1000;i++)
	{
		count++;
	}
}

这里一眼就看出是运行1000次,用什么来表示呢?前面说过:常数1代替所有加法运算中的常数,所以这里不管常数有多大,只要你只有一个常数都用O(1)表示

一些注意事项:

O(1)这个时间复杂度的估值是不随n的改变而改变的,以大白话说,不管你输入的n是多少,我这个算法的效率是不变的

O(n)这个时间复杂度是随n改变的
打个通俗的比方:设一个函数O(x)=1,那你x随意多少,函数值都是1
设一个函数O(X)=x,那这里函数值就随x变换而变换了

三、一些特殊的情况

有些算法的时间复杂度是存在最好、平均、最坏情况:
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)
不多说,举例说明:
代码如下:


const char*strchr(char*str, char c)
{
	while (*str != '\0')
	{
		if (*str == c)
		{
			return str;
		}
		++str;
	}
	return NULL;
}

上面的代码是一个简单的查找字符的函数,比如我们现在给一串字符共n个字符“aaaaba…aaac”(省略号省略a)
这里查找a一下子就找到了,查找b要点功夫,查找c就更慢了,如果查找d,不好意思,查无此d。
那么这里就出现了最好情况:一次找到O(1)
平均情况:O(n/2)
最差情况:O(n)
对于这里最坏情况可能有同学要说为什么是O(n),你看最坏情况没找到不是吗?这里解释是这样的,你找c要n次,找d是找不到也要找n次才能确定找不到。

总结

本文介绍了时间和空间复杂度的定义及大O渐进表达法的算法及一些特殊情况的解释,希望对屏幕前的读者有所帮助,祝您学习愉快!

更多关于数据结构时间复及空间复杂度的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言数据结构时间复杂度及空间复杂度简要分析

本文链接: https://www.lsjlt.com/news/155223.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言数据结构时间复杂度及空间复杂度简要分析
    目录一、时间复杂度和空间复杂度是什么?1.1算法效率定义1.2时间复杂度概念1.3空间复杂度概念二、如何计算常见算法的时间复杂度和空间复杂度2.1时间复杂度计算2.2空间复杂度计算2...
    99+
    2022-11-12
  • C语言数据结构的时间复杂度和空间复杂度
    目录一、数据结构前言        1.什么是数据结构:        2.什么是...
    99+
    2023-05-15
    C语言时间复杂度和空间复杂度 C语言时间复杂度 C语言空间复杂度
  • C语言数据结构的时间复杂度和空间复杂度实例分析
    这篇文章主要讲解了“C语言数据结构的时间复杂度和空间复杂度实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言数据结构的时间复杂度和空间复杂度实例分析”吧!一、数据结构前言 ...
    99+
    2023-07-06
  • C语言数据结构通关时间复杂度和空间复杂度
    目录一、时间复杂度:1.常数阶2.线性阶3.对数阶4.平方阶二、空间复杂度算法的时间复杂度和空间复杂度 一、时间复杂度: 首先,为什么会有这个概念的出现呢? 原来啊,在进行算法分析时...
    99+
    2022-11-13
  • C语言时间复杂度和空间复杂度实例分析
    今天小编给大家分享一下C语言时间复杂度和空间复杂度实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.时间复杂度:首先...
    99+
    2023-06-30
  • C语言时间复杂度与空间复杂度实例分析
    这篇文章主要介绍“C语言时间复杂度与空间复杂度实例分析”,在日常操作中,相信很多人在C语言时间复杂度与空间复杂度实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言时间复杂度与空间复杂度实例分析”的疑...
    99+
    2023-06-29
  • C语言详细解析时间复杂度与空间复杂度
    目录一、概念1.1、算法效率1.2、时间复杂度1.3、空间复杂度二、计算2.1、大O的渐进表示法2.2、时间复杂度计算2.3、空间复杂度计算三、有复杂度要求的习题一、概念 1.1、算...
    99+
    2022-11-13
  • C语言数据结构与算法时间空间复杂度实例分析
    这篇文章主要介绍“C语言数据结构与算法时间空间复杂度实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言数据结构与算法时间空间复杂度实例分析”文章能帮助大家解决问题。时间复杂度来看第一个:l...
    99+
    2023-06-29
  • C语言三分钟精通时间复杂度与空间复杂度
    目录一、时间复杂度1)O(n)的含义2)复杂表达式的简化3)O(n)不一定优于O(n^2)​4)递归的时间复杂度二、空间复杂度1)O(1)空间复杂度​2)​​​​​​​O(n)空间复...
    99+
    2022-11-13
  • C语言算法的时间复杂度和空间复杂度
    目录1.算法效率1.1 如何衡量一个算法的好坏1.2算法的复杂度2.时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3常见时间复杂度计算举例 3.空间复杂度4...
    99+
    2022-11-13
  • 数据结构与算法—时间复杂度和空间复杂度
    目录 1. 什么是数据结构? 2.什么是算法? 3、算法的复杂度 4、时间复杂度 (1) 时间复杂度的概念:  (2) 大O的渐进表示法:  六个例题: (3) 时间复杂度对比:  两个例题:  OJ题分析时间复杂度 5、空间复杂度 (1...
    99+
    2023-10-24
    数据结构
  • 数据结构--算法的时间复杂度和空间复杂度
    文章目录 算法效率时间复杂度时间复杂度的概念大O的渐进表示法计算实例 时间复杂度实例 常见复杂度对比例题 算法效率 算法效率是指算法在计算机上运行时所消耗的时间和资源。这是衡量算法...
    99+
    2023-09-08
    算法 数据结构 时间效率 复杂度
  • Java数据结构通关时间复杂度和空间复杂度
    目录算法效率时间复杂度空间复杂度小结算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被 称作空间复杂度。 时间复杂度主要衡量的...
    99+
    2022-11-13
  • 如何解析Java 数据结构中时间复杂度与空间复杂度
    这篇文章给大家介绍如何解析Java 数据结构中时间复杂度与空间复杂度,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。算法效率在使用当中,算法效率分为两种,一是时间效率(时间复杂度),二是空间效率(空间复杂度)。时间复杂度...
    99+
    2023-06-25
  • 【数据结构】 时间和空间复杂度
    文章目录 如何衡量一个算法的好坏算法效率时间复杂度时间复杂度的概念大O渐近表示法推导大O阶方法 常见的时间复杂度计算【实例1】【实例2】【实例三】【实例四】【实例五】【实例六】【实例七】...
    99+
    2023-08-31
    数据结构 java 算法 时间复杂度 空间复杂度
  • Java 数据结构之时间复杂度与空间复杂度详解
    目录算法效率时间复杂度什么是时间复杂度推导大 O 阶的方法算法情况计算冒泡排序的时间复杂度计算二分查找的时间复杂度计算阶乘递归的时间复杂度计算斐波那契递归的时间复杂度空间复杂度计算冒...
    99+
    2022-11-12
  • Java数据结构--时间和空间复杂度
    目录一、算法效率二、时间复杂度 1.概念2.大O的渐进表示法3.练习练习一:计算阶乘递归factorial的时间复杂度练习二:计算斐波那契递归fibonacci的时间复杂度...
    99+
    2022-11-12
  • C语言数据结构与算法之时间空间复杂度入门
    目录数据结构与算法什么是数据结构?什么是算法?分析维度大O的渐进表示法常数阶线性阶对数阶其他时间复杂度指标空间复杂度数据结构与算法 终于开始搞这块难啃的骨头了,走上这条漫漫长路之前要...
    99+
    2022-11-13
  • C语言数据结构之算法的时间复杂度
    目录1、算法的复杂度2、时间复杂度2.1 时间复杂度的定义2.2 大O的渐进表示法3、常见时间复杂度计算举例3.1 冒泡排序的时间复杂度3.2 二分查找的时间复杂度3.3 阶乘(递归...
    99+
    2022-11-13
  • C语言数据结构与算法时间空间复杂度基础实践
    目录小感想时间复杂度空间复杂度小感想 今天去看了看许多人今年去各个大厂面试的面经,确实如大体所说,各大公司越来越注重性能迭代,时代需要数据结构与算法这样的考试。 一个公司的成本主要来...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作