程序性能分析-时间复杂度与空间复杂度

1、时间复杂度

定性描述算法的运行时间,通常是以算法的操作单元数量来代表程序消耗的时间。

一般使用的是大O表示法:大O表示法是表示上界,O是指再数据量级突破一个点且数据量级非常大的情况下所表现出来的时间复杂度(常数项不起作用)。

O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n2)平方阶 < O(n3)立方阶 < O(2n)指数阶

递归算法的时间复杂度本质上还是在于递归的次数 和每次递归中操作次数的乘积

int function(int x, int n)
{
    if(n == 0)
    {
        return 1;
    }
    if(n % 2 == 1)
    {
        return function(x , n/2) * function(x , n/2) *x;
    }
    return function(x , n/2)*function(x, n/2);
}

 C++ 内存管理

栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等,操作方式类似于数据结构中的栈;

堆区(Heap):一般由程序员分配释放,若程序员不释放,则程序结束时可能由系统收回。

未初始化数据区(Uninitiated Data):存放未初始化的全局变量与静态变量

初始化数据区(Initialized Data):存放初始化的全局变量和静态变量

程序代码区(Text):存放函数体的二进制代码

代码区和数据区所占用的空间是固定的,而且占用的孔吉安比较小,运行时消耗的内存主要取决于可变部分;在可变部分中,栈区的数据在代码块执行结束后会被系统自动收回,而堆区的数据由程序员收回,所以堆区容易出现内存泄漏;

计算机各种数据类型所占用的内存大小:

C/C++的数据类型大小:

32位编译器:

char short int long float double 指针 (单位)byte
1 2 4 4 4 8 4

64位编译器:

char short int long float double 指针 (单位)byte
1 2 4 8 4 8 4

一个字节是8bit;

内存对齐:

跨平台的编程语言都存在字节对齐。字节对齐的主要原因如下:

1、平台原因:不是所有的硬件平台都能访问任意内存地址上的数据,某些平台只能在一些地址处获取特定类型的数据,否则会抛出异常。为了使一个程序能在多平台运行,需要进行内存对齐;

2、硬件原因:经过内存对齐以后,CPU访问内存的速度会大大提升。

空间复杂度:空间复杂度就是对一个算法在运行过程中所占用的内存空间的大小的度量。

1、空间复杂度是考虑程序运行时所占用的内存的大小,而不是可执行文件的大小。

2、空间复杂度不是准确的计算出程序运行时占用的内存值,而是预先大致评估内存使用的大小。

 

你可能感兴趣的:(算法)