昨天小偷了个懒 今天好好搞回来
今天还要复习一个概念知识,我这里只是记录我学习过程中的点子。
程序性能分析
我们先来看一个小故事 故事由chatgpt生成
时间复杂度和空间复杂度是分析算法效率和资源消耗的重要指标。
让我们逐一了解这两个概念。
时间复杂度是衡量算法执行所需时间的度量。它表示算法执行所需的操作次数与问题规模的增长率之间的关系。通常使用大O记法来表示时间复杂度。
常见的时间复杂度包括:
- O(1):常数时间复杂度,表示算法的执行时间与问题规模无关,是最理想的情况。
- O(log n):对数时间复杂度,通常出现在使用分治或二分法的算法中,问题规模每次减少一半。
- O(n):线性时间复杂度,算法的执行时间与问题规模成线性关系。
- O(n log n):线性对数时间复杂度,常见于排序算法如快速排序和归并排序。
- O(n^2):平方时间复杂度,通常出现在嵌套循环的算法中。
- O(2^n):指数时间复杂度,通常出现在穷举所有可能的算法中,问题规模每次增加一倍。
除了上述常见的时间复杂度,还有其他更高阶的时间复杂度。理解时间复杂度的含义和计算方法,可以帮助你评估算法的执行效率,并选择合适的算法来解决问题。
空间复杂度是衡量算法在执行过程中所需的额外内存空间的度量。它表示算法所使用的额外空间与问题规模的增长率之间的关系。同样,也使用大O记法来表示空间复杂度。
常见的空间复杂度包括:
- O(1):常数空间复杂度,算法所需的额外空间是固定的,与问题规模无关。
- O(n):线性空间复杂度,算法所需的额外空间与问题规模成线性关系。
- O(n^2):平方空间复杂度,通常出现在需要二维数组或矩阵存储的算法中。
在分析空间复杂度时,需要考虑算法使用的数据结构、递归调用、临时变量等因素。理解算法的空间复杂度可以帮助你合理管理内存资源,并避免不必要的内存消耗。
通过对算法的时间复杂度和空间复杂度进行分析,你可以评估算法的效率和资源消耗,并选择最合适的算法来解决问题。同时,了解这些概念也有助于优化算法,提高程序的性能。
空间复杂度
空间复杂度的组成
-
指令空间(Code Space): 指令空间是用来存储程序指令的内存空间。它包含了程序的机器指令、函数代码和其他执行指令所需的数据。指令空间通常在程序加载到内存时被分配,并且在程序执行期间保持不变。
-
数据空间(Data Space): 数据空间用于存储程序运行时所需的数据。这包括静态数据、全局变量、常量、静态分配的数据结构等。数据空间的大小在程序运行期间可能会发生变化,取决于程序的逻辑和数据的使用情况。
-
环境栈空间(Stack Space): 环境栈空间是用于存储函数调用、局部变量和函数执行上下文的内存空间。每当一个函数被调用时,会在环境栈上为该函数分配一段内存空间,用于保存函数的参数、局部变量和返回地址等。随着函数的嵌套调用和递归调用,环境栈会动态地增长和收缩。
让我们通过一个简单的示例代码来详细解释每个空间的含义。
#include <iostream> int global_var = 10; void myFunction(int parameter) { int local_var = 20; int* dynamic_var = new int(30); // 打印各个变量的地址 std::cout << "Address of global_var: " << &global_var << std::endl; std::cout << "Address of local_var: " << &local_var << std::endl; std::cout << "Address of dynamic_var: " << dynamic_var << std::endl; } int main() { int main_var = 40; myFunction(50); return 0; }
结果不唯一:
Address of global_var: 0x7ff6af133010 Address of local_var: 0x5160fff614 Address of dynamic_var: 0x223b6551a60
现在,我们逐个解释这些空间的含义:
-
指令空间:指令空间是用于存储程序指令的内存空间。它包含了程序的机器指令和函数代码。在上述代码中,编译器会将
main
函数和myFunction
函数的机器指令存储在指令空间中。这部分空间通常在程序加载到内存时被分配,且在程序执行期间保持不变。 -
数据空间:数据空间用于存储程序运行时所需的数据。这包括静态数据、全局变量和常量等。在示例代码中,
global_var
是一个全局变量,它被存储在数据空间中。数据空间的大小在程序运行期间保持不变,取决于程序中定义的数据类型和变量。 -
环境栈空间:环境栈空间用于存储函数调用、局部变量和函数执行上下文。每当一个函数被调用时,会在环境栈上为该函数分配一段内存空间。在示例代码中,当
main
函数被调用时,会在环境栈上分配一段内存空间用于存储main_var
。当myFunction
函数被调用时,会在环境栈上分配一段内存空间用于存储parameter
、local_var
和函数的返回地址。
以上述代码为例,打印的变量地址可能是不同的,但是可以通过观察地址的相对关系来更好地理解这些空间。全局变量 global_var
的地址是固定的,它存储在数据空间中。局部变量 local_var
和动态分配的变量 dynamic_var
的地址在每次函数调用时都会有所变化,它们存储在环境栈空间中。
标签:存储,函数,复杂度,c++,var,算法,空间,day From: https://www.cnblogs.com/jszs0013/p/17542490.html