在数据结构中,用空间复杂度来衡量程序运行所需内存空间的大小,跟时间复杂度类似,它也可以使用大O记法来表示。
算法的空间复杂度是通过计算算法所需的存储空间实现的,计算公式为:S(n) = O(f(n)),其中n为问题的规模,f(n)则为语句关于问题规模n所占存储空间的函数,随着n的变动,f(n)的增长率越小越好。
一个算法程序从编译到运行有多个部分涉及存储空间的分配,具体情况如下:
程序代码本身需要占用一部分存储空间,用于存储编译后提供执行的代码,这部分的存储空间主要取决于程序的代码量,因此,为了减少这部分占用的空间,在保证算法的合理性情况下,应该尽量减少代码量。
程序中的输入输出,也需要占用一部分存储空间,这部分的占用的空间主要取决于不同算法的实现逻辑,但是大体上它们的大小都是相差不大的。
程序在运行时,不同情况下需要申请的临时空间,这部分占用的空间是对空间复杂度影响最大的,因为不同的算法实现细节可能存在较大的差异,会申请的空间也会存在比较大的不同。
一、常见的空间复杂度可以归类为以下的几种情况:
如果算法执行时所需要的空间和算法的输入值无关,对于输入数据量来说是一个常数的话,则称该算法为 原地工作 空间复杂度为O(1)。
如果随着输入数据量 n 的增大,程序申请的临时空间成线性增长,则程序的空间复杂度用 O(n) 表示。
如果随着输入数据量 n 的增大,程序申请的临时空间成 n2 关系增长,则程序的空间复杂度用 O(n2) 表示。
如果随着输入数据量 n 的增大,程序申请的临时空间成 n3 关系增长,则程序的空间复杂度用 O(n3) 表示。
等等(和时间复杂度的推送逻辑类似)