有朋友好奇为什么这里是第零篇,实际上是因为在刷题之前我们首先是需要来深入了解一下什么是时空复杂度的,作为一个连载类文章,模块的缺少让其不够完善完整,所以这里来补一篇关于时空复杂度的文章
主题:时间复杂度,空间复杂度
大O解释
这里代表着算法时空复杂度的上限,但这个严格意义上的,在日常中我们以一般情况作为记录大O
为什么会在计算时忽略常数项以及存在默认排序呢?
因为在一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示:
O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(nlogn)线性对数阶 < O(n^2)平方阶 < O(n^3)立方阶 < O(2^n)指数阶
如何计算
这里重点是化简:
满足原则:
去除常数---留下数量级最大的项
递归算法的时间复杂度本质上是要看: 递归的次数 * 每次递归中的操作次数
关于递归:
时间复杂度不一定是O(logn) 要看具体场景,也有可能是O(n)
空间复杂度:这是考虑程序运行时占用内存的大小,而不是可执行文件的大小。
关于空间复杂度:O(logn)的情况只会出现在递归中
递归算法的空间复杂度 = 每次递归的空间复杂度 * 递归深度
每次递归所需的空间都被压到调用栈里(这是内存管理里面的数据结构,和算法里的栈原理是一样的),一次递归结束,这个栈就是就是把本次递归的数据弹出去。所以这个栈最大的长度就是递归的深度。
内存对齐
时空复杂度是算法效率的度量指标,与算法的内存对齐有关,所以不得不来谈谈这个模块
内存对齐是指在内存中分配变量的地址应该是某个特定值的整数倍。一些计算机体系结构要求特定类型的数据必须按照特定的字节对齐方式进行存储访问,否则会降低执行效率或者导致运行时错误。
一个算法的内存对齐可以影响其空间复杂度,即算法所需的内存空间量。例如,如果算法需要存储大量的结构体变量,而这些结构体变量需要按照4字节对齐,那么算法的空间复杂度就会因为额外的填充空间而增加。
此外,不同的内存对齐方式也可能导致程序执行速度差异较大,因此算法的时间复杂度也可能受到影响
CPU读取内存是按照块来的,一次读取4个字节
这是内存对齐的意义

通过内存对齐,可以使得变量按照特定的规则排列,在访问内存时减少调整的成本,提高读写数据的速度和效率,从而改善程序的运行效果和性能表现,内存对齐本质也在于此。