复杂度分析【数据结构与算法】

news/2024/7/5 3:51:23

本篇博客是学习过程中的笔记总结和个人思考,学习原文见引用

  • 引用
  • 03 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
    • 为什么需要复杂度分析
    • 大 O 复杂度表示法

引用

  • 点击跳转 → 《极客时间:数据结构与算法之美》

03 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

数据结构和算法解决的是:如果在计算机内存更快时间、更省空间的解决问题。

从执行时间和占用空间两个维度来评估数据结构和算法的性能。

用时间复杂度和空间复杂度来描述性能,二者统称为复杂度。

复杂度描述的是算法执行时间(或占用内存空间)与数据规模的的增长关系。

复杂度分析不依赖于执行环境,成本低,效率高,易操作,指导性强。

掌握复杂度分析,编写出性能更优的代码。

算法的执行时间与每行代码的执行次数成正比,T(n) = O(f(n)),T(n)表示算法执行总时间,f(n) 表示每行代码的执行总次数,n表示数据规模。

时间复杂度(空间复杂度)描述算法的执行时间(额外占用空间)随数据规模增长变化的趋势。常量阶、低阶、系数对增长趋势不产生决定性影响,分析是可以忽略。

时间复杂度:单段代码看高频率(循环),多段代码取最大(单循环和多重循环取多重循环),嵌套代码求乘积(递归,多重新循环等),多个规模求加法(两个参数控制两个循环次数,取二者时间复杂度相加)。

复杂度级别:
多项式比例增长:O(1),O(logn),O(n),O(nlogn),O(n ^ 2),O(n ^ 3)。
非多项式暴增:O(2^n),O(n!)。

多练习分析时间复杂度。

遇到一个新的思路:数据结构横向解决运算时间快和空间省的问题,纵向解决架构和抽象的问题(数据结构和算法的泛型)。

所有数据结构和算法都会涉及时间复杂度和空间复杂度的问题。

为什么需要复杂度分析

先进行良好的设计,然后根据设计进行分析改进,最后再去执行。

事后统计法存在局限性:

  • 测试结果依赖环境。
  • 测试结果受数据规模影响很大。

举例:计算乘法。测试环境其中影响非常大的就是硬件,对于不同的指令集系统就会对结果有影响,乘法

通过时间复杂度、空间复杂度分析,进行粗略计算算法的执行效率。

很多算法都是适配固定的数据结构和应用场景,没有任何场景都是适用的完美算法。

大 O 复杂度表示法

算法的执行效率:算法代码执行时间越短,效率越高。

 int cal(int n) {
   int sum = 0;
   int i = 1;
   for (; i <= n; ++i) {
     sum = sum + i;
   }
   return sum;
 }

从CPU的角度看,每一个语句都执行着类似的操作:读数据-运算-写数据。
假设每个语句的执行时间都是一样的为unit_time。

第2行执行 1 次。
第3行执行 1 次。
第4行 i <= n 执行 n + 1次,++i 执行 n 次。
第5行执行了 n 次。

第7行执行 1 次。
这段代码总的执行时间:(3n + 4) * unit_time。

 int cal(int n) {
   int sum = 0;
   int i = 1;
   int j = 1;
   for (; i <= n; ++i) {
     j = 1;
     for (; j <= n; ++j) {
       sum = sum +  i * j;
     }
   }
 }

第2行执行 1 次。
第3行执行 1 次。
第4行执行 1 次。
第5行 i <= n 执行 n + 1次,++i 执行 n 次。
第6行执行 n 次。
第7行 j <= n 执行 n ^ 2 + 1次,++j 执行 n ^ 2 次。
第8行 n ^ 2 次。
这段代码总的执行时间:(3n ^ 2 + 3n + 5) * unit_time。

所有代码的执行时间 T(n) 与每行代码的执行次数 f(n) 成正比。


http://lihuaxi.xjx100.cn/news/1529969.html

相关文章

前端js动态切换图片文字

前端js动态切换图片文字 参考案例1uniapp案例2 参考案例1 <template><el-select v-model"selectedValue" change"handleSelectChange"><!-- 添加el-option选项 --><el-option label"选项1" value"option1">&…

2651. 计算列车到站时间

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;数学 知识回忆除法运算 写在最后 Tag 【数学】 题目来源 2651. 计算列车到站时间 题目解读 给你一个列车预计到达时间点和一个列车延误的时间&#xff0c;请返回列车实际的到达时间。 解题思路 方法一&#xff1a;数…

c++ 学习之 静态成员变量和静态成员函数

文章目录 前言正文静态成员变量初始化操作如何理解共享一份数据访问权限 静态成员函数访问方式静态成员函数只能访问静态成员变量访问权限 前言 静态成员分为 1&#xff09;静态成员变量 所有对象共享一份数据在编译阶段分配空间类内声明&#xff0c;类外初始化 2&#xff09…

企业架构LNMP学习笔记21

URL重写&#xff1a; ngx_http_rewrite_module 模块用于使用PCRE正则表达式更改请求URI&#xff0c;返回重定向&#xff0c;以及有条件地选择配置。 return 该指令用于结束结束规则的执行并返回状态码给客户端。 403 Forbidden.服务器已经理解请求,但是拒绝执行它 404 Not…

第20章 原子操作实验(iTOP-RK3568开发板驱动开发指南 )

在上一章节的实验中&#xff0c;对并发与竞争进行了实验&#xff0c;两个app应用程序之间对共享资源的竞争访问引起了数据传输错误&#xff0c;而在Linux内核中&#xff0c;提供了四种处理并发与竞争的常见方法&#xff0c;分别是原子操作、自旋锁、信号量、互斥体&#xff0c;…

插入排序(Java实现)

前言 稳定性&#xff1a;如果一个排序是稳定的&#xff0c;是可以变成不稳定的&#xff0c;此时这个排序归结为稳定&#xff0c;但是如果这个排序本身是不稳定的&#xff0c;是不可以变成稳定的&#xff0c;此时这个排序是不稳定的。 过程&#xff1a;如果数组中只有一个元素&a…

SpringBoot+Vue体育场馆预约管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootVue框架开发的体育场馆预约管理系统。首先&#xff0c;这是一个前后端分离的项目&#xff0c;代码简…

【系统设计系列】 应用层与微服务

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemart…