数据结构与算法[2 算法的时间空间复杂度]

    科技2025-09-06  64

    算法的时间复杂度

    时间消耗取决于:

    算法采用的策略和方案编译产生的代码质量:无法干预问题的输入规模(输入量的多少)机器执行指令的速度 :无法干预

    事后分析估算方法:有弊端,吃硬件配置

    事前分析估算方法:这样的话,是我们在计算机程序编写之前对程序进行预估,不会有其他因素的干扰。

    只考虑核心代码的执行次数,这样可以简化分析。

    得出结论:时间复杂度的分析核心就是

    核心操作的次数

    输入规模

    函数渐进增长

    当有一个整数N,使得当n>N时,f(n)总是>g(n),那么f(n)的增长渐进要快于g(n),增长越小越好(斜率)随着输入规模的增大 算法的常数操作可以忽略不计与最高次项相乘的常数可以忽略算法函数中n的最高次幂越小,算法效率越高 (最高次项的指数大的,随着n的增长,结果也会变得增长的特别快)

    大O记法

    在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,算法的时间复杂度,就是算法的时间度量,记作T(n) = O(f(n))执行次数 = 执行时间大O记法的规则 用常数1来渠道运行时间中的所有加法常数在修改后的运行次数中,只保留最高阶如果最高阶存在,且常数因子不为1,那么去除与这个项相乘的常数

    常见大O阶

    线性阶:单层循环一般都是线性阶,因为一层循环多少次,这个算法的时间复杂度就是O几。平方阶:一般嵌套的循环属于这种时间复杂度。(2层)立方阶:一般三层嵌套循环属于这种时间复杂度。(3层)对数阶:相当于有x个2相乘后大于n,会退出循环,由于是2的x次方=n,所以x是log(2)n,这个时间复杂度就是O(logn) 因为随着输入规模的增大,不论底数是多少,增长趋势是一样的,所以我们一般会忽略底数,直接用logn来表示。 int i = 1,n=100; while(i<n) i = i*2; 常数阶:不涉及循环操作的都是常数阶,都记为O(1)就是指数越小,时间复杂度越低。在函数调用中的时间复杂度,直接在大O算法中的括号中进行运算。一个函数中,时间复杂度是相加,调用其他方法,时间复杂度是相乘。最坏情况就是执行最多次数的情况。

    算法的空间复杂度

    Java内存最基本的机制 各类数据类型占字节数: byte:1short:2int:4long:8float:4double:8boolean:1char: 2 计算机访问内存的方式都是一次一个字节对象的占字节空间: User user = new User(); 一个引用(机器地址)需要8个字节 user这个变量需要占用8个字节创建一个对象需要16个字节,保存对象的头信息: new User();这个对象需要16个字节 一般内存的使用,不够8的倍数个字节,会被自动填充成8的倍数个字节 //整型成员变量a占用4个字节;A对象本身占用16个字节,整体需要20个字节,但是不是8的倍数,会变成24个字节。 public class A { public int a = 1; } Java中的数组被限定成对象,一般会因为记录长度而需要额外的内存,一个原始数据类型的数组一般需要24字节的头信息(16个自己对象的开销4个用于保存长度以及4个填充字节<为了凑够8的倍数>),再加上保存值所需的内存 申请了几个空间,根据大O准则,使用大O方法来进行显示空间复杂度。Java中一般是不做空间复杂度的。
    Processed: 0.011, SQL: 8