数据结构和算法学习记录——空间复杂度的计算(冒泡排序、阶乘递归、斐波那契数列递归、常见复杂度对比、栈帧、栈溢出)

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 数据结构和算法学习记录——空间复杂度的计算(冒泡排序、阶乘递归、斐波那契数列递归、常见复杂度对比、栈帧、栈溢出)

一、简单介绍

空间复杂度也是一个数学函数表达式,是对一个算法在运行过程中 临时额外占用存储空间大小的量度。 空间复杂度不是不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是额外创建的变量的个数。 空间复杂度的计算规则基本跟时间复杂度类似,也使用   大O渐进表示法  

注:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显示申请的额外空间来确定。

下面用实例来加深一下理解

二、冒泡排序的空间复杂度

2-1

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

看上面所写的冒泡排序,我们要算额外创建的变量的个数。那么就是函数内部创建的变量(即不包括int*a,int n)


其中在第一个for循环中创建了第一个变量size_t end,第二个变量int exchange,嵌套的for循环里创建了第三个变量size_t i,共计三个变量。循环一轮结束,局部变量销毁,新一轮的循环创建的变量占用的是用一块空间,是重复的。


注:空间是可以重复利用,不累积的;时间是一去不复返,可以累积。


所以冒泡排序的额外变量个数为3个,即常数个。


故而冒泡排序的空间复杂度为:O(1)。

三、阶乘递归的空间复杂度

3-1

//计算Fac的空间复杂度?
long long Fac(size_t N)
{
    if (N == 1)
        return 1;
    else
        return Fac(N - 1) * N;
}

算递归的空间复杂度,主要要看递归的深度。一次调用Fac()时额外创建的变量是常数个,空间复杂度记为O(1)。

递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间,最终这个阶乘递归的空间复杂度为:O(N)。

栈帧

栈的概念: 在数据结构中, 栈是限定仅在表尾进行插入或删除操作的线性表。栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。

栈帧的概念:

每一次函数的调用,都会在调用栈(call stack)上维护一个独立的栈帧(stack frame).每个独立的栈帧一般包括:

1. 函数的返回地址和参数

2. 临时变量: 包括函数的非静态局部变量以及编译器自动生成的其他临时变量

3. 函数调用的上下文

四、斐波那契数列递归的空间复杂度

4-1

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

一开始可能会误以为答案是 ,但一想下来,如果空间复杂度为 的话,只要给出一个N = 50就会发生栈溢出了。显然是不合理的,在前面看冒泡排序的空间复杂度的时候讲过,空间是不累积的,使用过的空间依旧能再次被使用。

或者这么想,我们把Fib(N)到Fib(0)全都调用过一遍了,其余在调用他们的时候都是在Fib(N)到Fib(0)中重复的,而重复使用的是同一块空间。所以Fib()的空间复杂度为O(N)。

栈溢出

栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。

五、常见复杂度对比(转载)

O(1) — 常数复杂度

O(log n) — 对数复杂度

O(n) — 线性复杂度

O(n log n) — 对数线性复杂度

O(nᵏ) — 多项式复杂度

O(kⁿ) — 指数复杂度

O(n!) — 阶乘复杂度

下图描绘了各种复杂度的算法中,当输入规模增长时,操作数量(运行时间)的变化趋势。

你可以看到,随着输入规模的增长,红色阴影区域中算法的运行时间急剧增长。另一方面,在黄色和绿色阴影区域中的算法,当输入规模增长时,运行时间在变化不是很大,因此它们更高效,处理大量数据时更游刃有余。


最后需要指明的一点,大 O 表示法通常用于描述当输入规模变得非常大时,算法呈现的「显著趋势」。因此,大的显著趋势会盖过一些小的细枝末节的趋势。例如,我们实际测算得到时间复杂度为 O(n²+ n) 的算法会简化为 O(n²),原因是随着 n 变得非常大时, n² 这一项的显著性远远盖过了 n 这一项的显著性。


目录
相关文章
|
9月前
|
存储 机器学习/深度学习 编解码
双选择性信道下正交啁啾分复用(OCDM)的低复杂度均衡算法研究——论文阅读
本文提出统一相位正交啁啾分复用(UP-OCDM)方案,利用循环矩阵特性设计两种低复杂度均衡算法:基于带状近似的LDL^H分解和基于BEM的迭代LSQR,将复杂度由$O(N^3)$降至$O(NQ^2)$或$O(iNM\log N)$,在双选择性信道下显著提升高频谱效率与抗多普勒性能。
502 0
双选择性信道下正交啁啾分复用(OCDM)的低复杂度均衡算法研究——论文阅读
|
12月前
|
搜索推荐 算法 Go
Go语言数组排序(冒泡排序法)—— 用最直观的方式掌握排序算法
本案例介绍使用冒泡排序对整数数组进行升序排序的实现方法,涵盖输入处理、错误检查与排序逻辑。通过代码演示和算法解析,帮助理解排序原理及Go语言切片操作,为学习更复杂排序算法打下基础。
|
12月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
747 1
|
12月前
|
搜索推荐
冒泡排序与其它排序算法比较
本内容比较了冒泡排序、选择排序和插入排序的特性。三者时间复杂度均为O(n²),但交换次数和稳定性不同。冒泡排序稳定,交换次数多,可优化至O(n);选择排序不稳定,交换次数少;插入排序交换次数最少,且二者均为稳定排序。对于有序数组,冒泡和插入可优化提升效率。
222 0
|
12月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
290 0
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
507 10
 算法系列之数据结构-二叉树
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
470 3
 算法系列之数据结构-Huffman树
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
642 22
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
624 30
|
9月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
765 0

热门文章

最新文章