2. 空间复杂度
O(1) — 常量空间复杂度
不管输入数据的规模如何,算法所需的内存空间大小是固定的。
数组中查找最大元素。这个操作只需要一个变量来保存当前找到的最大值,因此空间复杂度是O(1)。
O(log n) — 对数空间复杂度
需要的空间随输入数据的规模的对数增长。
递归实现的二分查找。在每次递归调用中,问题的规模都减半,因此最大的调用深度是log n,相应地,栈的空间也是O(log n)。
O(n) — 线性空间复杂度
需要的空间与输入数据的规模成正比。
动态数组(如C++中的 std::vector)。动态数组可能需要根据输入数据的数量动态调整大小,其空间复杂度通常是O(n)。
O(n log n) — 线性对数空间复杂度
空间复杂度介于线性和平方之间,通常见于一些特殊的排序算法中。
归并排序。在归并排序中,虽然每次合并操作都需要O(n)的空间,但由于其递归的性质,通常需要O(log n)层递归调用,因此整体的空间复杂度可能表现为O(n log n)。
O(n^2) — 平方空间复杂度
需要的空间与输入数据的规模的平方成正比。
一些特定的算法问题,如存储一个n x n的二维数组。
1. 时间复杂度
O(1)
常见的就是直接访问一个数组中某个元素的内容
这种算法一般不会受到输入数据大小的影响
1return array[i];
O(n)
线性时间复杂度,一般是遍历一阶数组中的所有元素
这会随着输入数据量的大小线性增大
O(log n)
对数时间复杂度,一般自常见的是用在对分查找。
或者常见的 m 叉树结构我们有 O(logmn)O(log_m n)O(logmn) 的时间复杂度
O(n log n) - 线性对数时间复杂度
归并排序或快速排序。
说明:这些排序算法在最好或平均情况下的时间复杂度为n log n。
具体的算法的时间复杂度我们会在后面的细节讲解中提及.
O(n^2) - 平方时间复杂度
冒泡排序或选择排序。
说明:这类算法通常涉及双重循环,对每对输入元素都进行操作。
容易搞混的地方在于,我们看每一层循环都容易看出是 一阶复杂度,然后我们会认为直接加起来就是一阶求和还是一阶复杂度,这就不对了
冒泡排序的时间复杂度推导
从最差角度考虑,冒泡排序需要比较 + 替换相邻元素的次数是 (n−1)+⋯+1=n(n−1)2(n - 1) + \cdots + 1 = \frac{n ...
