算法 时间、空间复杂度的计算(C语言/小白/零基础/新手 + 例题)

这篇具有很好参考价值的文章主要介绍了算法 时间、空间复杂度的计算(C语言/小白/零基础/新手 + 例题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 时间复杂度

计算时间复杂度( O(N))的方法:

  例1:嵌套循环时间复杂度的计算   

  例2:双重循环时间复杂度的计算

  例3:常熟循环的时间复杂度

  例6:冒泡排序的时间复杂度

  例7: 二分查找的时间复杂度

  例8:斐波那契的时间复杂度

        常见的时间复杂度:

2. 空间复杂度

  例1:创建变量

例2:长度N的数组

例3:斐波那契的空间复杂度

3. OJ:消失的数字


1. 时间复杂度

        算法在编写成可执行程序后,运行时所需要消耗时间资源和空间( 内存 )资源。因此衡量一个算法的好坏,一般是从时间和空间两个维度进行衡量,即时间复杂度 和 空间复杂度。、

        时间复杂度主要衡量一个算法的快慢。

        大O的渐进表示法:大O符号,是用于描述函数渐进行为的数学符号。

计算时间复杂度( O(N))的方法

        1. 用常熟1代替所有运行时间中的加法常数;

        2. 在修改后的运行时间中,只保留最高项;

        3. 如果最高项存在且不是1,则去除最高项的系数。

        有个重要的点是,大家算时间复杂度的时候,不要去关注代码,要去思考算法的思路!!!,其次我们这次所说的时间复杂度都是指最坏时间复杂度。

  例1:嵌套循环时间复杂度的计算   

int Test(int N)
{
	int count = 0;
	for (int i = 0;i < N;i++)
	{
		for (int j = 0;j < N;j++)
		{
			count++;
		}
	}
	int num 10;
	while (num--)
	{
		count++;
	}
	return count;
}

         O(N)  = N * N  + 10 ,只看最高次项,即为N^2

        时间复杂度: T(N) = O(N^2)。

  例2:双重循环时间复杂度的计算

int Test(int N,int M)
{
	int count = 0;
	for (int i = 0;i < N;i++)
	{
		count++;
	}
	for (int j = 0;j < m;j++)
	{
		count++;
	}
	return count;
}

          时间复杂度: T(N) = O(N + M)。

        这里没有说明M 和 N 的大小关系,如果M > N,则时间复杂度为 O(M),反之,则相反。

  例3:常熟循环的时间复杂度

int Test(int N,int M)
{
	int count = 0;
	for (int i = 0;i < 100 ; i++)
	{
		count++;
	}
	return count;
}

            时间复杂度: T(N) = O(1)。

        这里的1不是指数字1,只执行1次,而是指常数次。即所有常数项均用1代替。

  例6:冒泡排序的时间复杂度

int Test(int* nums,int N)
{
	int count = 0;
	for (int i = 0;i < N;i++)
	{
		for (int j = 0;j < i;j++)
		{
			if (nums[j] > nums[j + 1])
			{
				int t = nums[j];
				nums[j] = nums[j+1];
				nums[j + 1] = t;
			}
		}
	}
	return count;
}

         时间复杂度: T(N) = O(N^2)。

         冒泡排序的时间复杂度计算是等差数列相加,首相是n-1 ,尾项是 1,项数为n-1,所以运行时间公式为 N*(N-1) / 2,只保留最高次项N^2/2,且最高次项的系数为1。

        这里就很能体现我们不只能看代码的循环次数。

  例7: 二分查找的时间复杂度

int Binary_search(SqList L,ElemType key)
{
	int low = 0;int mid = 0;int high = L.length-1;
	while(low<=high)
	{
		mid = (low+high)/2;
 		if(key==L.data[mid])
		{
			return mid;
		}
		else if(key>L.data[mid])
		{
			low = mid+1;
		}
		else
		{
			high = mid-1;
		}
	}
	return -1;
}

           时间复杂度: T(N) = O(log N)。

            这里log是省略2的。执行次数X,数组长度N,每次查找长度/2,,得出2^X = N,所以执行次数X = logN。

  例8:斐波那契的时间复杂度

        时间复杂度,是累加的,毕竟时间一去不复返。

int Fib(int N)
{
    if(N < 3)
     {
        return 1;
     }
    return Fac(N-1) + Fib(N-2);
}

         时间复杂度: T(N) = O(2 ^ N)。

        计算空间复杂度的例题,数据结构,数据结构,c语言,笔记,算法

        可以看出,斐波那契数列的时间复杂度就是等比数列求和,代入公式,利用大O渐进表示法规则,我们可以得出时间复杂度为 2^n。

计算空间复杂度的例题,数据结构,数据结构,c语言,笔记,算法

        常见的时间复杂度:

        计算空间复杂度的例题,数据结构,数据结构,c语言,笔记,算法

        O(1) < O(logN) < O(n) < O(NlogN) < O(N^2) < O(N^3) < O(2^N) < O(N !) < O(N^N)

2. 空间复杂度

        空间复杂,是对一个算法在运行过程中临时额外开辟占用的存储空间大小维度。

        空间复杂度不是程序占了多少字节,而是算的变量的数量。与时间复杂度一样,同样都采用大O渐进法表示。

        注意:函数运行时所需要的栈空间(形参,寄存器信息等)在编译期间已经确定好了,因此,空间复杂度主要通过函数在运行时申请的额外空间来确定。

        目前,随着硬件设备的提升,我们对空间复杂度不是那么关注,所以我们对代码的衡量主要关注时间复杂度。这就意味着,我们可以用空间换时间的思路,大家做题的时候,可以尝试使用一下这个思路。

  例1:创建变量

void Test(int N)
{
	int a =0;
    int b =0;
    for(int i=0;i<10;i++)
    {
        a++;
        b++;
    }
}

         空间复杂度:S(N) = O(1)

        这里1,指的是常数个变量。而不是数字1,仅有1个变量的意思。

例2:长度N的数组

void Test(int N)
{
	int* nums = (int*)malloc(sizeof(int) * N);
    for(int i=0;i<N;i++)
    {
        nums[i] = i;
    }
}

              空间复杂度:S(N) = O(N)、

                有N个变量,所以空间复杂度为N

例3:斐波那契的空间复杂度

int Fib(int N)
{
    if(N < 3)
     {
        return 1;
     }
    return Fac(N-1) + Fib(N-2);
}

            空间复杂度:S(N) = O( N)、            

           这里涉及函数栈帧的创建和销毁,大家简单的理解为,每个函数创建使用的时候都要在内存中开辟栈帧空间,函数结束时也会销毁栈帧空间。这就意味着,空间我们可以重复利用。

           当我们使用Fib(1)函数时,开辟空间,结束时,释放销毁空间,Fib(2)函数使用时可以使用Fib(1)函数销毁的函数。

3. OJ:消失的数字

面试题 17.04. 消失的数字 - 力扣(LeetCode)

数组nums包含从0n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

注意:本题相对书上原题稍作改动

示例 1:

输入:[3,0,1]
输出:2

示例 2:文章来源地址https://www.toymoban.com/news/detail-714847.html

输入:[9,6,4,2,3,5,7,0,1]
输出:8
//1
int missingNumber(int* nums, int numsSize){
    int ret = 0;
    for(int i=0;i<=numsSize;i++)
    {
        ret+=i;
    }
    for(int i=0;i<numsSize;i++)
    {
        ret-=nums[i];    
    }
    return ret;
}

//2
int missingNumber(int* nums, int numsSize)
{
    int i=0;
    int sum=0;
    
    for(i=1;i<=numsSize;i++)
    {
        sum^=i;
    }
    
    for(i=0;i<numsSize;i++)
    {
        sum^=nums[i];
    }
    return sum;
}

到了这里,关于算法 时间、空间复杂度的计算(C语言/小白/零基础/新手 + 例题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法的时间复杂度和空间复杂度

    目录 本章重点 一 时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3 常见的时间复杂度的计算 二 空间复杂度 三 常见复杂度对比 四 复杂度的oj练习 4.1 消失的数字 4.2 旋转数字 每一天都是人生限定,每一天都值得100%努力 (1)算法效率(2)时间复杂度(3)空间复

    2024年02月01日
    浏览(38)
  • 数据结构:时间复杂度和空间复杂度计算

    算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度, 而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主 要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小

    2024年02月11日
    浏览(27)
  • 算法学习22:时间复杂度 和 空间复杂度

    提示:以下是本篇文章正文内容: 😍😍😍文章链接👍👍👍 提示:这里对文章进行总结: 💕💕💕

    2024年04月22日
    浏览(64)
  • 算法的时间复杂度、空间复杂度如何比较?

    目录 一、时间复杂度BigO 大O的渐进表示法: 例题一: 例题2: 例题3:冒泡排序的时间复杂度 例题4:二分查找的时间复杂度 书写对数的讲究: 例题5:  实例6: 利用时间复杂度解决编程题 ​编辑思路一: 思路二: 源码: 思路三: 回顾位操作符 二、空间复杂度详解 概念

    2024年02月15日
    浏览(60)
  • 数据结构 --- 复杂度概念及计算讲解(时间复杂度,空间复杂度)

    今天没有sao话,今天认真学习 前言: 经常刷题的人都知道,我们在解决一道题时可能有多个解法,那么如何判断那个解法才是最优解呢? 我们通常从代码的两个方面进行判断:1.时间 2.空间。 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀

    2024年03月22日
    浏览(33)
  • 数据结构:算法(特性,时间复杂度,空间复杂度)

    算法(Algorithm)是对 特定问题求解步骤 的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。 一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。 算法必须是有穷的,而程序可以是无穷的 算法中每条指令必须有确切的含义,对于

    2024年02月06日
    浏览(40)
  • 如何衡量算法的效率?时间复杂度&&空间复杂度

    本篇博客会讲解如何衡量一个算法的效率。衡量算法的效率,主要有2个维度,分别是:时间复杂度和空间复杂度。 时间复杂度用来衡量算法的时间效率。时间复杂度越低,算法的耗时越短,效率则越高。 空间复杂度用来衡量算法的空间效率。空间复杂度越低,算法占用的空

    2023年04月20日
    浏览(29)
  • 算法时间空间复杂度

    1. 有穷性 :执行有穷步(有限步)之后结束。 2. 确定性 :只有唯一的执行路径。 3. 可行性 :代码可以执行起来。 4、 输入 :零个或多个输入。 5. 输出 :一个或多个输出。 时间效率和空间效率有时候是有矛盾的 概念: 若有某个辅助函数 f ( n ) color{pink}{f(n)} f ( n ) 使得当

    2024年02月04日
    浏览(48)
  • 八大排序算法(含时间复杂度、空间复杂度、算法稳定性)

    下列算法默认都是对数组进行升序 1.1、算法思想 插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序的具体步骤如下: 从第一个元素开始,该元素可以认为已经被排序;

    2024年02月08日
    浏览(36)
  • 数据结构与算法-时间复杂度与空间复杂度

    数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 算法就是定义良好的计算过程,他取一个或一组的值为输入,并产生一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。 算法在

    2024年02月07日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包