【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)

这篇具有很好参考价值的文章主要介绍了【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

☃️个人主页:fighting小泽
🌸作者简介:目前正在学习C语言和数据结构
🌼博客专栏:数据结构
🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻

1. 空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用的额外的存储空间大小的量度 。
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。
空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

1.1 空间复杂度的例子

实例1:

计算BubbleSort的空间复杂度?
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;
 }
}

有的朋友会觉得这个冒泡排序的空间复杂度是 O(N),有的会觉得空间复杂度是 O(1)。为什么会觉得是O(N)呢,因为这里有一个数组,这个数组有N个空间。但是数组的N个空间算不算是冒泡排序的消耗?

其实是不算的,因为这个数组存储N个数据,我们对它进行排序其实是对数组的内容进行处理,它本身就要有,不是因为我们要排序而自己开的空间,在冒泡排序里面创建的end和exchange是常数个,所以它的空间复杂度是O(1).

实例2:

// 计算Fibonacci的空间复杂度?
// 返回斐波那契数列的前n项
long long* Fibonacci(size_t n)
{
 if(n==0)
 return NULL;
 
 long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));
 fibArray[0] = 0;
 fibArray[1] = 1;
 for (int i = 2; i <= n ; ++i)
 {
 fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
 }
 return fibArray;
}

正常的斐波那契数列是三个变量来回倒,它的空间复杂度就是O(1),但是我们这里是malloc了一个数组,这个数组有N+1个空间,所以它的空间复杂度就是经典的O(N)。

实例3:

 计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{
 if(N == 0)
 return 1;
 
 return Fac(N-1)*N;
}

这个时候就涉及到一个栈帧的问题了,每次函数调用会建立一个函数栈帧,相当于建立了N个栈帧,那每个栈帧开辟多少空间呢?
每个栈帧里面其实只有常数个,但是因为创建了N个栈帧,所以它的空间复杂度是O(N)。

【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)
实例4:

计算斐波那契递归Fib的空间复杂度?
long long Fib(size_t N)
{
 if(N < 3)
 return 1;
 
 return Fib(N-1) + Fib(N-2);
}

它的时间复杂度是2 ^ N,可能大多数老铁觉得它的空间复杂度也是
2 ^ N,是一样的。

实际上它不是,它的空间复杂度是不好算的,它的空间复杂度是O(N)。
为什么呢?这时候大家就要看到一个问题,递归调用是咋调的?

斐波那契第N项是不是要调用(N-1)和(N-2)啊,那我问大家它是同时调用(N-1)和(N-2)项吗?不是,它会先调用(N-1),然后调用(N-1)下面的(N-2),然后调用下面的(N-3),会一直往下调用,调用到第2项之后才回来,再调用右边再回去,再调用右边再回去。那就意味着这个栈帧的建立是这样的,最多会建立多少个栈帧呢?是0到N-2个栈帧,就是N-1个栈帧。他会先往深不断不断去走,走了回来的时候栈帧就销毁了,再调用右边的会跟左边的重复用一个栈帧空间,那最多会建立多少层呢?N层。可以认为最多就建立左边的这一列,再调用右边的会跟左边的重复用一个栈帧空间。

这里有一句话送给大家:时间是一去不复返的,空间是可以重复利用的。时间是累计计算的,空间不累计计算。

【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)
这里我们再看一个代码:

void Func1()
{
	int a = 0;
	printf("%p\n", &a);
}
void Func2()
{
	int b = 0;
	printf("%p\n", &b);
}
int main()
{
	Func1();
	Func2();

	return 0;
}

【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)
我们发现,a和b是使用同一块空间的,这时因为函数调用时创立栈帧,函数结束时栈帧也会销毁,但是销毁的这块栈帧空间不是不能使用了,而是归还操作系统了,下一次函数栈帧空间也在这里创建,所以a和b的地址是一样的。同理,刚刚斐波那契数列销毁的空间也会被下一次函数调用所利用。
【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)

2.常见复杂度对比

【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)

【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)

3.leetcode练习题

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。189 . leetcode - 旋转数组
【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)

1. 暴力求解,旋转K次

我们可以用一个 tmp 记录下最后一个元素,然后进行for循环,把每个元素向右移动一位,再把 tmp 传给第一个元素就行了。大家可以自己试一试,不够这样写在力扣过不去,会超时。

2. 三段逆置

这是个聪明人才能想出来的方法,先把前 N-K 个元素逆置,再把后 K 个逆置,再把整体逆置就完成了
【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)

void swap(int* a, int* b) {
    int t = *a;
    *a = *b, *b = t;
}

void reverse(int* nums, int start, int end) {
    while (start < end) {
        swap(&nums[start], &nums[end]);
        start += 1;
        end -= 1;
    }
}

void rotate(int* nums, int numsSize, int k) {
    k %= numsSize;
    reverse(nums, 0, numsSize - 1);
    reverse(nums, 0, k - 1);
    reverse(nums, k, numsSize - 1);
}

3. 空间换时间

我们可以创建一个新数组,把前 N-K 个元素放到后面,把后 K 个元素放到前面

注意:当 K 大于numsSize的时候相当于把数组转过了一遍,但是直接写 K 会越界,访问到后面的元素,所以我们可以令 k = (i+k)%numsSize

void rotate(int* nums, int numsSize, int k) {
    int newArr[numsSize];
        for (int i = 0; i < numsSize; i++)
    {
        newArr[(i+k)%numsSize] = nums[i];
    }
    for (int i = 0; i <numsSize; i++)
    {
        nums[i]=newArr[i];
    }
}

结尾

这些就是我给大家分享的关于算法的复杂度的知识啦,希望我们都能有所收获!
先赞后看,养成习惯!!^ _ ^
码字不易,大家的支持就是我坚持下去的动力,点赞后不要忘了关注我哦!

如有错误,还请您批评改正(。ì _ í。)文章来源地址https://www.toymoban.com/news/detail-418165.html

到了这里,关于【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构--算法的时间复杂度和空间复杂度

    算法效率是指 算法在计算机上运行时所消耗的时间和资源 。这是衡量算法执行速度和资源利用情况的重要指标。 例子: 这是一个斐波那契函数,用的是递归的计算方法,每次创建函数就会在栈区开辟一块空间,递归次数越多,开辟空间越多; 所以, 代码的简洁说明不了算

    2024年02月15日
    浏览(50)
  • 【数据结构与算法篇】时间复杂度与空间复杂度

       目录 一、数据结构和算法 1.什么是数据结构?  2.什么是算法? 3.数据结构和算法的重要性 二、算法的时间复杂度和空间复杂度 1.算法效率 2.算法的复杂度 3.复杂度在校招中的考察 4.时间复杂度 5.空间复杂度  6.常见复杂度对比 7.复杂度的OJ练习   👻内容专栏:《数据结

    2023年04月24日
    浏览(67)
  • 学习数据结构:算法的时间复杂度和空间复杂度

    衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。 算法的时间复杂度 算法中的基本操作的执行次数,为算法的时间复杂度。 算法的

    2024年04月11日
    浏览(46)
  • 【数据结构与算法】1.时间复杂度和空间复杂度

    📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 算法效率分为两种:第一种是时间效率;第二种是空间效率。时间效率又称为时间

    2024年01月20日
    浏览(54)
  • 数据结构 | 算法的时间复杂度和空间复杂度【详解】

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

    2024年02月08日
    浏览(57)
  • 【数据结构初阶】算法的时间复杂度和空间复杂度

    1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢? 比如对于以下斐波那契数列: 斐波那契数列的递归实现方式非常简洁,但简洁一定好吗?那该如何衡量其好与坏呢? 1.2 算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此

    2024年02月08日
    浏览(75)
  • 从头开始:数据结构和算法入门(时间复杂度、空间复杂度)

        目录 文章目录 前言 1.算法效率 1.1 如何衡量一个算法的好坏 1.2 算法的复杂度 2.时间复杂度  2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见时间复杂度计算 3.空间复杂度 4.常见复杂度对比 总结 前言         C语言的学习篇已经结束,今天开启新的篇章——数据结构

    2024年02月14日
    浏览(53)
  • 【数据结构与算法篇】之时间复杂度与空间复杂度

    ❤️博客主页: 小镇敲码人 🍏 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌞友友们暑假快乐,好久不见呀!!!💖💖💖 🍉 有人曾经问过我这样一个问题,“人终其一身,执着追求的东西究竟是什么?”我是这样回答的,”我们终其一生都在寻找着那个和我们灵魂极其契合

    2024年02月12日
    浏览(54)
  • 算法之时间复杂度---数据结构

    目录 前言: 1.时间复杂度 1.1时间复杂度的理解 1.2规模与基本操作执行次数 1.3大O渐进表示法 1.4计算基本操作的次数 2.常见的时间复杂度及其优劣比较 ❤博主CSDN:啊苏要学习     ▶专栏分类:数据结构◀   学习数据结构是一件有趣的事情,希望读者能在我的博文切实感受到

    2024年02月05日
    浏览(68)
  • 数据结构——算法的时间复杂度

    🌇个人主页:_麦麦_ 📚今日名言: 生命中曾经有过的所有灿烂,都终究需要用寂寞来偿还。 ——《百年孤独》 目录 一、前言 二、正文         1.算法效率                 1.1如何衡量一个算法的好坏                 1.2算法的复杂度         2. 时间复杂度      

    2024年02月03日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包