数据结构 算法的时间复杂度 计算(两种规则 加法原则+乘法原则)

news2024/12/25 16:59:59

在分析时间复杂性时,加法和乘法原则是两个基本且重要的概念,它们分别用于处理算法中顺序执行和嵌套执行的代码段的时间复杂度计算。以下是对这两个原则的详细说明:

一、加法原则

定义

加法原则适用于顺序执行的代码段。如果一个算法可以分解为几个顺序执行的部分,且每部分的时间复杂度分别为O(f(n))、O(g(n))等,则整个算法的时间复杂度为这些部分时间复杂度的和的最大值,但通常我们忽略低阶项和常数项,只保留最高阶项。

解释

  • 顺序执行:算法中的操作按照一定顺序依次执行,前一个操作的输出可能是后一个操作的输入,但每个操作都是独立完成的。
  • 时间复杂度求和:将各个顺序执行部分的时间复杂度相加,但由于大O表示法只关注最高阶项,因此实际上我们只保留和中的最高阶项。
  • 忽略低阶项和常数项:在使用大O表示法时,我们忽略时间复杂度表达式中的低阶项和常数项,因为它们对算法整体性能的影响相对较小。

示例

假设算法A由两个部分组成,第一部分的时间复杂度为O(n),第二部分的时间复杂度为O(n^2)。根据加法原则,算法A的整体时间复杂度为O(n^2),因为O(n^2)是两者中的最高阶项。

python示例:

def function_addition_example(n):  
    # 第一个操作,时间复杂度为O(n)  
    for i in range(n):  
        # 假设这里有一些操作,其时间复杂度是常数时间O(1)  
        pass  
      
    # 第二个操作,时间复杂度也为O(n)(但在这个例子中,我们假设它是O(n/2),但为了加法原则,我们仍将其视为O(n))  
    for j in range(n // 2):  # 注意:这里我们实际上降低了时间复杂度,但按加法原则,我们仍考虑O(n)  
        # 假设这里也有一些操作,其时间复杂度是常数时间O(1)  
        pass  
      
    # 由于两个操作都是O(n),所以整体时间复杂度也是O(n)(忽略低阶项)  
  
# 注意:虽然第二个循环是n/2,但在大O表示法中,我们仍将其视为O(n),因为大O只关心最高阶项

Java示例:

在这个例子中,我们定义了一个方法additionExample,它按顺序执行两个操作,每个操作都通过循环来模拟其时间复杂度。第一个操作的时间复杂度是O(n),第二个操作的时间复杂度也是O(n)(尽管在这个例子中,第二个循环迭代次数是n/2,但在大O表示法中,我们仍然将其视为O(n))。

public class TimeComplexityAddition {  
    public static void additionExample(int n) {  
        // 第一个操作,时间复杂度为O(n)  
        for (int i = 0; i < n; i++) {  
            // 这里执行一些操作,时间复杂度为O(1)  
        }  
  
        // 第二个操作,时间复杂度理论上为O(n/2),但在大O表示法中视为O(n)  
        for (int j = 0; j < n / 2; j++) {  
            // 这里也执行一些操作,时间复杂度为O(1)  
        }  
  
        // 由于两个操作都是O(n),所以整体时间复杂度也是O(n)(忽略低阶项)  
    }  
  
    public static void main(String[] args) {  
        int n = 1000; // 示例输入  
        additionExample(n);  
        // 注意:这个方法没有返回任何值,也没有打印输出,它仅仅是为了演示时间复杂度的加法原则  
    }  
}

二、乘法原则

定义

乘法原则适用于嵌套执行的代码段。如果一个算法中包含嵌套循环或递归调用等嵌套执行的代码段,且外层代码段的时间复杂度为O(f(n)),内层代码段的时间复杂度为O(g(n)),则整个嵌套执行部分的时间复杂度为两者时间复杂度的乘积,即O(f(n) * g(n))。

解释

  • 嵌套执行:算法中的某个操作(如循环或递归调用)内部还包含另一个或多个操作,这些内部操作需要在外部操作每次执行时都重复执行。
  • 时间复杂度相乘:由于内层操作需要在外层操作的每一次迭代中都执行,因此整个嵌套执行部分的时间复杂度是内外两层操作时间复杂度的乘积。

示例

假设算法B包含一个外层循环和一个内层循环,外层循环的时间复杂度为O(n),内层循环的时间复杂度也为O(n)。根据乘法原则,整个嵌套循环部分的时间复杂度为O(n * n) = O(n^2)。

python示例:

def function_multiplication_example(n):  
    # 外层循环,时间复杂度为O(n)  
    for i in range(n):  
        # 内层循环,时间复杂度为O(n)(注意:这里的n与外层循环的n相同)  
        for j in range(n):  
            # 假设这里有一些操作,其时间复杂度是常数时间O(1)  
            pass  
      
    # 由于内层循环在外层循环的每一次迭代中都执行,因此整体时间复杂度为O(n * n) = O(n^2)  
  
# 这个例子清楚地展示了乘法原则的应用:嵌套循环导致的时间复杂度是外层循环和内层循环时间复杂度的乘积

Java示例:

在这个例子中,我们定义了一个方法multiplicationExample,它包含一个嵌套循环。外层循环的时间复杂度是O(n),内层循环的时间复杂度也是O(n),因此整体时间复杂度是O(n * n) = O(n^2)。

public class TimeComplexityMultiplication {  
    public static void multiplicationExample(int n) {  
        // 外层循环,时间复杂度为O(n)  
        for (int i = 0; i < n; i++) {  
            // 内层循环,时间复杂度为O(n)  
            for (int j = 0; j < n; j++) {  
                // 这里执行一些操作,时间复杂度为O(1)  
            }  
        }  
  
        // 由于内层循环在外层循环的每一次迭代中都执行,因此整体时间复杂度为O(n * n) = O(n^2)  
    }  
  
    public static void main(String[] args) {  
        int n = 100; // 示例输入,注意为了简化演示,这里使用了较小的n值  
        multiplicationExample(n);  
        // 注意:这个方法同样没有返回任何值,也没有打印输出,它仅仅是为了演示时间复杂度的乘法原则  
    }  
}

总结

  • 加法原则:用于处理顺序执行的代码段,整体时间复杂度为各部分时间复杂度的和的最大值(忽略低阶项和常数项)。
  • 乘法原则:用于处理嵌套执行的代码段,整体时间复杂度为内外两层操作时间复杂度的乘积。

常用的渐近时间复杂度:

常数<对数<线性<(线性)(对数)<多项式<指数<阶乘<n^n

这两个原则在算法时间复杂性的分析中起着至关重要的作用,能够帮助我们快速准确地评估算法的性能。

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

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

相关文章

从Linux系统的角度看待文件-基础IO

目录 从Linux系统的角度看待文件 系统文件I/O open write read 文件操作的本质 vim中批量注释的方法 从Linux系统的角度看待文件 关于文件的共识&#xff1a; 1.空文件也要占用磁盘空间 2.文件内容属性 3.文件操作包括文件内容/文件属性/文件内容属性 4.文件路径文…

LDO实习报告(免费)-有完整电路版图

LDO实习任务书 实习目的&#xff1a; 了解LDO电路研究现状和原理结构&#xff0c;熟悉模拟电路设计流程。 week1 &#xff1a; 调研LDO应用情况及研究现状。 week2 &#xff1a; 熟悉LDO基本原理及组成。 week3 &#xff1a; 构建LDO电路。 week4 &#xff1a; 对LDO进…

从日志到洞察:轻松实现服务器安全管理的神器

在当今复杂多变的网络环境中&#xff0c;服务器安全管理已成为一项不可或缺的任务。然而&#xff0c;面对海量的日志数据&#xff0c;如何快速精准地提取有价值的信息&#xff0c;并及时发现潜在的安全威胁&#xff1f;本文将为您介绍一款强大的服务器日志检索与查杀工具&#…

pilz皮尔兹PSSuniversal分散控制平台 Dezentrale Steuerungsplattform 手测

pilz皮尔兹PSSuniversal分散控制平台 Dezentrale Steuerungsplattform 手测

WebAPI编程(第三天,第四天)

WebAPI编程&#xff08;第三天&#xff0c;第四天&#xff09; day03 - Web APIs1.1. 节点操作1.1.1 删除节点1.1.2 案例&#xff1a;删除留言1.1.3 复制&#xff08;克隆&#xff09;节点1.1.4 案例&#xff1a;动态生成表格1.1.5 创建元素的三种方式1.1.6 innerTHML和createE…

基于SSM+小程序的自习室选座与门禁管理系统(自习室1)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 1、管理员实现了首页、基础数据管理、论坛管理、公告信息管理、用户管理、座位管理等 2、用户实现了在论坛模块通过发帖与评论帖子的方式进行信息讨论&#xff0c;也能对账户进行在线充值…

深圳龙链科技:全球区块链开发先锋,领航Web3生态未来

【深圳龙链科技】是全球领先的Web3区块链技术开发公司&#xff0c;专注于为全球客户提供创新高效的区块链解决方案。 深圳龙链科技由币安资深股东携手香港领先的Web3创新枢纽Cyberport联袂打造&#xff0c;立足于香港这一国际金融中心&#xff0c;放眼全球&#xff0c;汇聚了华…

罕见,回复问询后闪电终止,业绩存下滑风险

《IPO魔女》认为&#xff0c;和美精艺利润低且大幅波动&#xff0c;报告期公司毛利率持续大幅下滑。而2023年同行业的上市公司均出现了业绩大幅下滑的情况&#xff0c;还未上市的和美精艺恐怕也存在业绩下滑的风险。此外&#xff0c;2020年至2022年&#xff0c;和美精艺研发投入…

Excel根据一个值匹配一行数据

根据一个值从一个表中匹配一行数据&#xff0c;例如从左边的表中找到指定姓名的所有行数据 使用VLOOKUP函数&#xff0c;参数&#xff1a; Lookup_value&#xff1a;需要搜索的值&#xff0c;单个值 Table_array&#xff1a;被搜索的区域&#xff0c;是个表 Col_index_num&…

JS数据类型类型转换

基本数据类型 JS中的数据类型由原始值和对象共同组成&#xff0c;原始值一共有七种原始值&#xff1a; 数值(Number)大整数(BigInt)字符串(String)布尔值(Boolean)空值(Null)未定义(Undefined)符号(Symbol) 数值和大整数 数值(Number):在js中所有的整数和浮点数都是number类型 …

【vue-router】用meta.keepAlive做缓存

网上大家都说按下面的写法 <keep-alive><router-view v-if"route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if"!route.meta.keepAlive"></router-view>但是会报错 解决方法也没找到 最后换一…

23、Presidential

难度 中 目标 root权限 2个flag 基于virtualbox启动 题目提示枚举是你的朋友 kali 192.168.86.102 靶机 192.168.86.107 信息收集 端口扫描 tcp开启的端口就两个&#xff0c;稳妥起见扫了一些常见的端口看是否有UDP协议开放的端口。同时nmap在扫描80端口提示可能存在的tra…

OCR识别系统 YOLOv8 +Paddle 方案落地

YOLOv8 PaddleOCR 技术方案落地 Yolov8相关文档Step 1 证件模型的训练Step 2 Yolov8进行图片推理Step 3 PaddleOCR进行识别Step 4 整合Yolov8 PaddleOCR 进行OCR Yolov8相关文档 《yolov8 官方网站》 《Yolov8 保姆级别安装》 Ultralytics YOLOv8 是一款尖端的、最先进的 (S…

NASA数据集:ATLAS/ICESat-2 L3B 南极和北极网格陆地冰高,第 3 版

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3B Gridded Antarctic and Arctic Land Ice Height V003 简介 ATLAS/ICESat-2 L3B 南极和北极网格陆地冰高&#xff0c;第 3 版 ATL14 和 ATL15 将 ATLAS/ICESat-2 L3B 年度陆地冰…

5 分钟快速入门 Github Action

Github Action 是一种自动化构建工具。 ‍ 介绍 什么是 GitHub Action&#xff1f;来看看阮一峰大佬的介绍&#xff1a; GitHub Actions 是 GitHub 的持续集成服务&#xff0c;于 2018 年 10 月推出。 大家知道&#xff0c;持续集成由很多操作组成&#xff0c;比如抓取代码、…

深度学习(入门)03:监督学习

1、监督学习简介 监督学习&#xff08;Supervised Learning&#xff09;是一种重要的机器学习方法&#xff0c;它的目标是通过“已知输入特征”来预测对应的标签。在监督学习中&#xff0c;每一个“特征-标签”对被称为样本&#xff08;example&#xff09;&#xff0c;这些样…

视觉分析在垃圾检测中的应用

随着城市化进程的加快&#xff0c;垃圾管理成为现代城市面临的重大挑战。有效的垃圾识别和分类不仅能提升环境保护的效率&#xff0c;还能减少资源浪费。基于视觉分析的垃圾识别算法应运而生&#xff0c;为解决这一问题提供了技术支持。 垃圾识别算法的技术实现主要依赖于深度学…

FreeRTOS-队列

FreeRTOS-消息队列 一、队列简介二、队列相关函数2.1 队列结构体2.2 队列相关API函数 三、队列操作实验 一、队列简介 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递)使用队列的情况下如图&#xff0c;在写、读队列时&#xff0c;会进入临界区&#x…

前端使用vue点击上传文件,传送给后端,后端进行文件接收

一、效果图 前端页面&#xff1a; 在java这边后端的target文件就可以接收到前端发送的文件&#xff0c;文件可以打开 接下来看具体代码是怎么实现的&#xff01; 二、代码部分 Vue代码 <template> <el-upload ref"upload" class"upload-demo&q…

黑马头条day5- 延迟任务精准发布文章

这个过程主要是流程负责 但是我没有仔细的过所有的流程 需要多刷几遍 今天只是照着md文档执行了一下 运行起来没差错 主要实现文章定时发布 通过schedule模块作为延迟队列的任务 通过redis实现的延迟任务 具体 实现还要在多走几遍流程 逻辑一点不清楚 没看网课 这节要多看几遍…