复杂度分析-时间复杂度和空间复杂度

复杂度分析

  • 事后统计法:把代码跑一遍,通过统计、监控,就能得到算法执行的时间和占用的内存大小

    • 弊端:

      • 测试结果非常依赖测试环境(不同芯片电脑运行程序)
      • 测试结果受数据规模的影响很大(数据规模大和小可能测试结果不同)
  • 解决办法:需要一个不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法


时间复杂度分析

  • 概述:所有代码的执行时间 T(n) 与每行代码的执行次数 n 成正比(算法的执行时间与数据规模之间的增长关系

    • T(n) = O(f(n))
      • T(n):代码执行的时间
      • n:数据规模的大小
      • f(n):每行代码执行的次数总和
      • O:代码的执行时间 T(n) 与 f(n) 表达式成正比
  • 大 O 时间复杂度表示法:并不代表代码真正的执行时间,表示 代码执行时间与数据规模增长的变化趋势,也叫 渐进时间复杂度,简称 时间复杂度

  • 时间复杂度分析方法

    • 只关注循环执行次数最多的一段代码(忽略常量、低阶、系数)
    • 加法法则:总复杂度等于量级最大的那段代码的复杂度
    • 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
  • 几种常见时间复杂度实例分析(多项式量阶非多项式量级)

    • 常量阶 O(1)
    • 对数阶 O(logn)
    • 线性阶 O(n)
    • 线性对数阶 O(nlogn)
    • 平方阶 O(n2) 立方阶 O(n3) … k次方阶 O(nk)
    • 指数阶 O(2n)
    • 阶乘阶 O(n!)

    注意:当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加。非多项式量级只有两个:O(2n) 和 O(n!)

多项式量级时间复杂度

O(1)
  • 只要代码的执行时间不随 n 的增大而增长,这样代码的时间复杂度我们都记作 O(1)。或者说,一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。

O(logn)、O(nlogn)
i = 1;
while(i <= n){i = i*2;
}
// 时间复杂度:O(logn)

注意:对数阶时间复杂度表示法,可以忽略对数的底,统一表示为 O(logn)


O(m+n)、O(m*n)
  • 概述:代码的复杂度由两个数据的规模来决定

    int cal(int m , int n){int sum1 = 0;int i = 1;for(;i<m;++i){sum1 = sum1 + i;}int sum2 = 0;int j = 1;for(;j<n;++j){sum2 = sum2 + j;}return sum1 + sum2;
    }
    

    注意:本算法无法使用 加法法则,因为我们无法断定 m 和 n 他们两个谁大谁小,所以时间复杂度就是O(m+n)


最好、最坏情况时间复杂度
  • 最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度
  • 最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度

平均情况时间复杂度
  • 平均时间复杂度的全称应该叫加权平均时间复杂度或者期望时间复杂度
  • 什么时候使用这三种复杂度分析?
    • 只有同一块代码在不同的情况下,时间复杂度有量级的差距,我们才会使用这三种复杂度表示法来区分

均摊时间复杂度
  • 概述:出现多次 O(1),出现少次 O(n), O(n) 可以均摊给其他 O(1),这样就是均摊时间复杂度分析
  • 使用场景:对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在前后连贯的时序关系,这个时候,我们就可以将这一组操作放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上。而且,在能够应用均摊时间复杂度分析的场合,一般均摊时间复杂度就等于最好情况时间复杂度。

空间复杂度分析

  • 概述:算法的存储空间与数据规模之间的增长关系
    • 例如:
      • int a = 0;
        • O(1)
      • int[] a = new int[n];
        • O(n)

复杂度分析案例

// 全局变量,大小为 10 的数组 array 长度 len 下标 i
int array[] = new int[10];
int len = 10;
int i = 0;// 往数组中添加一个元素
void add(int element){// 数组空间不够if(i >= len){// 重新申请一个 2 倍大小的数组空间int new_array[] = new int[len*2];// 把原来 array 数组中的数据依次 copy 到 new_array 中for(int j = 0; j < len; ++j){new_array[j] = array[j];}array = new_array;len = 2*len;}// 将 element 放到下标为 i 的位置,下标 i 加一array[i] = element;++i;
}
最好情况时间复杂度:我们可以看到,在 i = (0~len-1) 时,时间复杂度都是 O(1)
最坏情况时间复杂度:如果在 i = len 时,时间复杂度为 O(len)
平均情况时间复杂度:总共有 n+1 种情况1*1/(n+1) + 1*1/(n+1)+...+n*1/(n+1) = 2n/(n+1)O(1)
均摊情况时间复杂度:前 n 种时间复杂度为 O(1) , 最后一种情况时间复杂度为 O(n),我们可以将 O(n) 平均分配给 前 n 种,所以时间复杂度为 O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

余震强度预测能力升级,Nature 刊文认证基于神经网络的模型性能优于传统模型

作者&#xff1a;李宝珠 编辑&#xff1a;李玮栋、xixi&#xff0c;三羊 地震的发生涉及诸多变量&#xff0c;「预测」存在挑战&#xff0c;但余震发生次数及强度的预测已取得重大进展。 2023 年 12 月 18 日 23 时 59 分&#xff0c;甘肃省临夏州积石山县发生 6.2 级地震&…

企鹅目标检测数据集VOC格式400张

企鹅&#xff0c;一种可爱而独特的鸟类&#xff0c;以其圆滚滚的身体、黑白相间的羽毛和独特的行走方式而备受人们喜爱。 企鹅是鸟纲、企鹅科的动物&#xff0c;它们生活在南半球&#xff0c;特别是南极地区。企鹅的体型短而肥胖&#xff0c;有着流线型的身体和黑白相间的羽毛…

excel中相同类型的数据归到一起显示

1.选中所有数据 2.开始菜单-排序和筛选-自定义排序 3.选择分类关键字 此处&#xff0c;以属性为例 4.效果 归类后的数据&#xff1a;

机器学模型 预训练模型 为什么要使用预训练模型呢?

机器学习训练模型的主要目的是为了使模型的参数尽可能地逼近真实的模型&#xff0c;以便更准确地预测新数据。这通常通过定义一个损失函数来衡量模型预测与真实目标之间的差距&#xff0c;并使用优化算法&#xff08;如梯度下降&#xff09;来调整模型参数&#xff0c;以最小化…

Windows打印后打印机没有反应

Windows点打印后打印机没有任何反应 有时候点了打印&#xff0c;打印机却没有任何反应&#xff0c;别人却可以正常打印文件&#xff0c;问题可能出在自己电脑上。 可以试试以下几个方法&#xff0c;不好使不要骂我。 可能是本地打印服务问题 可以尝试在服务中将打印机服务重…

消息队列-RockMQ-批量收发实践

批量收发实战 发送消息是需要网络连接的如果我们单条发送吞吐量可能没有批量发送好。剖来那个发送可以减少网络IO开销&#xff0c;但是也不能一批次发送太多的数据&#xff0c;需要根据每条消息的大小和网络带宽来确定量的数目。 比如网络带宽为可以支持一次性发送8M的数据包&…

复试 || 就业day05(2024.01.08)项目一

文章目录 前言代码模拟梯度下降构建函数与导函数函数的可视化求这个方程的最小值&#xff08;直接求导&#xff09;求方程最小值&#xff08;不令方程导为0&#xff09;【梯度下降】eta0.1eta 0.2eta 50eta 0.01画出eta0.1时的梯度下降x的变化过程 总结 前言 &#x1f4ab;你…

Unity中URP下使用屏幕坐标采样深度图

文章目录 前言一、Unity使用了ComputeScreenPos函数得到屏幕坐标1、 我们来看一下这个函数干了什么2、我们看一下该函数实现该结果的意义 二、在Shader中使用&#xff08;法一&#xff09;1、在Varying结构体中2、在顶点着色器中3、在片元着色器中 三、在Shader中使用&#xff…

玩转Mysql 三(权限管理)

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。 一、用户管理 1、登录MySQL服务器 语法示例&#xff1a; mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句" 详细命令…

MYSQL篇--索引高频面试题

mysql索引 1什么是索引&#xff1f; 索引说白了就是一种数据结构&#xff0c;可以协助快速查询数据&#xff0c;以及更新数据库表中的数据&#xff0c;更通俗的来说索引其实就是目录&#xff0c;通过对数据建立索引形成目录&#xff0c;便于去查询数据&#xff0c;而mysql索引…

Linux中RPM和yum管理和查询软件包

rpm管理软件包 -i&#xff1a;安装 -v&#xff1a;verbose查看详细信息 -h&#xff1a;查看进度条 -e&#xff1a;erase移除软件包 -F&#xff1a;升级已经安装过的软件包 -U&#xff1a;升级和安装软件包 --replacepkgs 重新安装&#xff0c;相当…

DES算法(Python实现)

一、具体描述 基于计算机高级语言&#xff08;如C语言&#xff09;实现DES算法 二、名词术语与相关知识 DES算法 DES&#xff08;Data Encryption Standard&#xff09;是一种对称加密算法&#xff0c;被广泛应用于数据加密领域。它使用64位密钥和64位明文&#xff0c;通过…

【⭐AI工具⭐】AI工具导航推荐

目录 零 工具导航&#x1f449;【[AI工具集导航](https://ai-bot.cn/)】&#x1f448;&#x1f449;【[iForAI](https://iforai.com/)】&#x1f448;&#x1f449;【[AInav](https://www.ainav.cn/)】&#x1f448;&#x1f449;【[Navi AI 导航](https://www.naviai.cn/)】&a…

Spring 见解 6 Spring事务控制

Spring事务控制 事务介绍 什么是事务&#xff1f; 当你需要一次执行多条SQL语句时&#xff0c;可以使用事务。通俗一点说&#xff0c;如果这几条SQL语句全部执行成功&#xff0c;则才对数据库进行一次更新&#xff0c;如果有一条SQL语句执行失败&#xff0c;则这几条SQL语句…

leetcode“位运算”——只出现一次的数字

只出现一次的数字i&#xff1a; https://leetcode.cn/problems/single-number/ 给你一个非空整数数组 nums&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现一次的元素。 class Solution { public:int singleNumber(vector<i…

外汇天眼:放弃对波动的偏爱才能追逐趋势!

无论在熊市还是牛市中&#xff0c;市场上亏损者仍然和别的状态下一样多。 在趋势不明的情况下&#xff0c;我们盼望趋势的来临; 然而趋势真正形成之时&#xff0c;我们却仍然一无所获。 趋势表面上看对我们很重要&#xff0c;然而具体交易时却又难以利用&#xff0c;在具体交易…

优优聚美团外卖代运营,提升销量的秘密武器

随着互联网的飞速发展&#xff0c;外卖平台逐渐成为人们生活中的重要组成部分。作为国内领先的外卖平台&#xff0c;美团外卖吸引了众多商家入驻。然而&#xff0c;如何在竞争激烈的市场中脱颖而出&#xff0c;成为许多商家面临的难题。此时&#xff0c;美团外卖代运营应运而生…

基于动物迁徙算法优化的Elman神经网络数据预测 - 附代码

基于动物迁徙算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于动物迁徙算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于动物迁徙优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

华清远见作业第二十三天——IO(第六天)

使用有名管道完成两个进程之间相互通信 代码&#xff1a; 创建管道&#xff1a; #include<a.h> int main(int argc, const char *argv[]) {//创建有名管道文件if(mkfifo("./myfifo1", 0664) ! 0){perror("mkfifo1 error");return -1;}printf("…

【Java集合篇】HashMap的put方法是如何实现的?

HashMap的put方法是如何实现的 ✔️典型解析✔️ 拓展知识仓✔️HashMap put方法的优缺点有哪些✔️如何避免HashMap put方法的哈希冲突✔️如何避免HashMap put方法的哈希重 ✔️源码解读✔️putVal 方法主要实现如下&#xff0c;为了更好的帮助大家阅读&#xff0c;提升效率&…