首页 > 编程语言 >ds_c01 算法性能分析.md

ds_c01 算法性能分析.md

时间:2024-05-25 12:51:06浏览次数:27  
标签:md int 复杂度 ds ++ 时间 空间 c01 sum

5. 算法性能评价指标

Big O notation is a mathematical notation that describes the limiting behavior of a function when the argument tends towards a particular value or infinity.

In computer science, big O notation is used to classify algorithms according to how their run time or space requirements grow as the input size grows.

来自:wiki: big_O_notation

在计算机中,大 O 表示法常作为衡量算法的运行时间或所需内存空间随输入规模增长而发生变化的度量;

5.1 时间复杂度的计算(大 O 表示法)

用来衡量运行时间时,它为算法在最坏情况下运行时间的上界,即为任意规模的数据的运行时间的上界。

例如,插入排序,在数据有序的情况下,时间复杂度为 O(n);如果数据是逆序的,那么插入排序的时间复杂度就是 O(n^2);对所有数据来说,最差情况下的时间复杂度为 O(n^2),所以称插入排序的时间复杂度为 O(n^2)。

以上结论和例子据说来自《算法导论》

常用的计算方法:

  • 频度计算法:
    • 假设所有的语句执行的时间相同,计算所有语句的频度 T(n);
    • T(n) 的最高次项即为 O(f(n))(不需要保留最高次项的常数);
  • 一般的计算步骤:
    • 找到所有语句中执行次数最多的那条语句作为基本语句;
    • 计算基本语句执行次数的数量级;
    • 取其数量级用大 O 表示即可;例如 O(n)、O(logn)等等;
  • 含有递归的时间复杂度的分析:
    • 每一次调用函数的时间复杂度 * 函数的调用次数
      int fact(int n) {
          if (n <= 1) return 1;
          return n * fact(n - 1);
      }
      
      在上述代码中,每次调用函数的时间复杂度为 O(1),调用次数为 O(n),所以总的时间复杂度为 O(n);
  • 一些特殊的技巧:写出第 i 次循环后,循环变量的值;
    int func(int n) {
        int i = 0, sum = 0;
        while (sum < n) sum += ++i;
        return i;
    }
    
    /***时间复杂度分析
    1: sum = 1
    2: sum = 1 + 2
    3: sum = 1 + 2 + 3
    ...
    i: sum = i(1+i)/2 < n
    因为 sum 要大于等于 n 才退出循环,
    所以 i 的上界可以为 sqrt(n)
    ***/
    
    x = 0;
    while (n >= (x+1)*(x+)) x+=1;
    
    /***时间复杂度分析
    i: (i+1)*(i+1) <= n
    O(sqrt(n)) 
    ***/
    
  • 加法法则,乘法法则;

5.2 空间复杂度的计算(大 O 表示法)

  • 非递归问题的空间复杂度分析

    int j = 0;
    int k = 0;
    for (int i = 0; i < n; i ++) {
      j ++;
      k ++;
    }
    
    /*** 空间复杂度分析
    开辟了 i、j、k 三个数据空间,所以空间复杂度为 O(1)
    ***/
    
    int *a = new int(n);
    for (int i = 0; i < n; i ++) a[i] = i;
    
    /*** 空间复杂度分析
    数组空间随着 n 的增大而增大,且保持线性的速度,
    所以空间复杂度为 O(n)
    ***/
    
  • 递归问题的空间复杂度分析

    int fib(int n) {
      if (n <= 1) return n;
      else return fib(n - 1) + fib(n - 2);
    }
    

    递归问题的空间复杂度 = 每一层的空间复杂度 * 递归深度;

    数据结构一般只考虑单个进程单个线程的情况,所以上述最大的所需的栈空间为每一层的空间复杂度 * 递归深度

    int test(int n) {
      if (n <= 1) return 1;
      test(n/2);
    }
    
    /*** 空间复杂度分析
    每一层的空间复杂度为 O(1),递归深度为 O(logn)
    所以空间复杂度为 O(logn)
    ***/
    

5.3 算法题:判断素数、最大连续子序列问题

bool isPrime(int n) {
    bool prime = true;
    for (int i = 1; i < n; i ++)
        if (n % i == 0)
            prime = false;
    
    return prime;
}

标签:md,int,复杂度,ds,++,时间,空间,c01,sum
From: https://www.cnblogs.com/tamtam/p/18212282

相关文章

  • mysql innodb purge threads
    在MySQL中InnoDB属于存储引擎层,并以插件的形式集成在数据库中。从MySQL5.5.8开始,InnoDB成为其默认的存储引擎。InnoDB存储引擎支持事务、其设计目标主要是面向OLTP的应用,主要特点有:支持事务、行锁设计支持高并发、外键支持、自动崩溃恢复、聚簇索引的方式组织表结构等。想系统学习......
  • Window GDI+ API有BUG?GetBounds测不准?
    文章目录GraphicsPath的GetBounds测不准?方法一:GetBounds()实战方法二:GetBounds(Matrix)实战GraphicsPath的GetBounds测不准?实战.NET版本的问题?C++也一样,不是.NET的问题怀疑人生MiterLimit惹得祸完美结果结束语最近,在学习系统了解WindowsGDI+绘图,并尝试复现大......
  • 【源码翻译之交互式对象包 AIS-AIS_ColoredShape.hxx文件 多颜色交互式对象
    类AIS_ColoredShape形状的呈现具有可自定义的子形状属性。此类可以将topods的子拓扑分别设置不同的颜色然后作为一个整体显示成员类型定义文档◆DataMapOfDrawerCompdtypedefNCollection_IndexedDataMap<Handle<AIS_ColoredDrawer>,TopoDS_Compound,TColStd_MapT......
  • P10298 [CCC 2024 S4] Painting Roads
    原题链接题解由易到难,先不考虑交替的事情,既然要尽量少的涂色,那么我最少要涂几条颜色的边?(由于图不一定联通,这里先考虑连通图的情况)如果一条边处于一个环内,那么这个边就可以不涂色。所以只要有环我就可以选择一条边不涂色,那么到最后,涂色的边构成一棵树接下来考虑这颗树能否实现......
  • 在AndroidStudio创建虚拟手机DUB-AI20
    1.DUB-AI20介绍        DUB-AL20是华为畅享9全网通机型。         华为畅享9采用基于Android8.1定制的EMUI8.2系统,最大的亮点是配置了1300万AI双摄、4000mAh大电池以及AI人脸识别功能,支持熄屏快拍、笑脸抓拍、声控拍照、手势拍照等特色的拍照功能,支持移......
  • cmd-字(一半)
    #include<bits/stdc++.h>#include<windows.h>#include<conio.h>//控制台输入输出文件usingnamespacestd;intmain(){HANDLEhandle=GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出的句柄COORDcoord={15,5};//保存光标坐标COORDcoord1={22,5}......
  • Mask DINO: Towards A Unified Transformer-based Framework for Object Detection an
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布!ProceedingsoftheIEEE/CVFConferenceonComputerVisionandPatternRecognition.2023. Abstract在本文中,我们提出了一个统一的对象检测和分割框架MaskDINO。MaskDINO通过添加一个支持所有图像分割任务(例如......
  • hmdp-短信验证
    基于Session实现登录流程发送验证码:用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号如果手机号合法,后台此时生成对应的验证码,同时将验证码进行保存,然后再通过短信的方式将验证码发送给用户短信验证码登录、注册:用户将验证码和手机号进行输入,后......
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Ads Kit
    1.问题描述:开屏广告效果最好的实现方式?解决方法:1、动画效果和开发者的实现方式有关,和开屏广告页面本身没什么关系的;2、示例代码中使用Router跳转的方式展示广告,主要是用于演示广告接口怎么集成。3、开发者可以不采用Router跳转的方式实现广告的展示,以下方式可供参考:方式一:可......
  • 第11章.创建MDK工程-基于自建库函数
    目录0.《STM32单片机自学教程》专栏11.1基于库函数的开发方式11.2构建自己的库函数11.2.1外设寄存器结构体定义0.《STM32单片机自学教程》专栏        本文作为专栏《STM32单片机自学教程》专栏其中的一部分,返回专栏总纲,阅读所有文章,点击Link:  STM32......