zoukankan      html  css  js  c++  java
  • 重拾算法与数据结构之时空复杂度

    时间复杂度和空间复杂度是学习数据结构的关键

    1.大O复杂度表示法

    举个例子:

    T(n) = unit_Time*(n^2+2n+1)  

    T(n):代码运行的总时间

    unit_Time:每行代码运行的时间

    n^2+2n+1:表示代码执行的行数

    n:一行代码的执行次数

    按照上面的例子推出大O表达式:

    T(n)=O(f(n)):n表示数据规模;f(n)表示代码执行的次数;O表示代码的执行次数与代码的执行时间成正比

    所以上面例子可以表示为 O(n^2+2n+1)

    大O时间复杂度并不表示代码的执行时间,而是表示代码的执行时间随数据规模的增长趋势,也叫渐近时间复杂度,简称时间复杂度。

    当数据规模n很大时,公式中的低阶,常量和系数都不能左右增长趋势,所以可以忽略,只需要记录最大量级,所以如果用大O表示法表示上面的例子O(n^2)

    2.时间复杂度分析

    1)只关注循环字数最多的一段代码

    2)加法原则,这段代码多处循环,总复杂度等于量级最大的代码复杂度

    3)乘法原则,嵌套代码的复杂度等于嵌套内外的代码复杂度的乘积。

    3.几种常见的时间复杂度分析

    对于复杂度量级,可以区分为两类:多项式量级和非多项式量级(O(2^n),O(n!))

    对于非多项式量级的问题我们称为NP问题,当数据规模n增加时,非多项式量级的执行时间会急剧上涨,所以非多项式量级的算法是很低效的。

    主要介绍下多项式量级的复杂度

    1)O(1):并不表示只执行一行代码,而是常量级。并不随n发生变化。

    2)O(logn),O(nlogn):

    如下代码:

    i = 1;

    while(i <= n){

    i = i*3

    }

    这段代码的执行次数是log3n 时间复杂度是O(logn)

    不管对数的底是多少,我们都可以使用logn表示时间复杂度。这是因为对数间可以相互转换。log3n*log23 = log2n。

    3)O(m+n),O(m*n)

    代码的复杂度由两个数据规模决定,不能确定m,n谁更大

    4.空间复杂度

    空间复杂度就是渐近空间复杂度,表示算法的存储空间与数据规模之间增长关系。

    int[] a = new int[n];

    空间复杂度为O(n);

    空间复杂度较为简单。

  • 相关阅读:
    【Android 应用开发】 Android 相关代码规范 更新中 ...
    【IOS 开发】Object
    【Android 应用开发】 Android APK 反编译 混淆 反编译后重编译
    【IOS 开发】Object
    Unity3D 学习教程 14 C# 旋转镜头
    Unity3D 学习教程 13 C# 销毁炮弹
    Unity3D 学习教程 12 C# 发射炮弹
    Unity3D 学习教程 11 c#脚本控制摄像头
    Unity3D 学习教程 10 复制物体
    Unity3D 学习教程 9 旋转 放大 移动 物体
  • 原文地址:https://www.cnblogs.com/xwzp/p/9760342.html
Copyright © 2011-2022 走看看