嵌套for循环的算法时间复杂度

嵌套for循环的算法时间复杂度

      • 1. 单层循环的时间复杂度:
      • 2.嵌套循环的时间复杂度:
      • 3. 更复杂的嵌套循环:
        • 3.1. 依赖关系的嵌套循环:
        • 3.2. 多个嵌套循环:
      • 4. 嵌套循环中有条件语句:
      • 5. 总结:
      • 举个例子:

在分析嵌套 for 循环的算法时间复杂度时,主要依据循环的嵌套层数和每一层循环的迭代次数来计算总的时间复杂度。下面是一般的计算方法和一些常见情形的分析:

1. 单层循环的时间复杂度:

如果算法只有一个简单的 for 循环,并且该循环的迭代次数为 ( n ),那么时间复杂度就是 ( O(n) )。

2.嵌套循环的时间复杂度:

当算法包含多个嵌套的 for 循环时,我们需要考虑每一层循环的迭代次数。一般的规则是,时间复杂度是每一层循环次数的乘积。

假设有两个嵌套的 for 循环:

for i in range(n):
    for j in range(n):
        # do something

在这种情况下,外层循环从 ( i = 0 ) 迭代到 ( i = n-1 ),内层循环对于每个 ( i ) 从 ( j = 0 ) 迭代到 ( j = n-1 )。因此,内外两层循环的总时间复杂度是:
O ( n ) × O ( n ) = O ( n 2 ) O(n) \times O(n) = O(n^2) O(n)×O(n)=O(n2)

也就是说,如果外层和内层循环的迭代次数都是 ( n ),则总的时间复杂度是 ( O(n^2) )。

3. 更复杂的嵌套循环:

如果循环的迭代次数不是固定的,而是随着某些变量变化的,时间复杂度的计算需要根据这些变化的规律来推导。

3.1. 依赖关系的嵌套循环:

假设外层循环迭代次数为 ( n ),内层循环的次数依赖于外层循环的变量:

for i in range(n):
    for j in range(i, n):
        # do something

在这个例子中,外层循环从 ( i = 0 ) 迭代到 ( i = n-1 ),内层循环每次迭代的次数是 ( n-i ),因此总的时间复杂度是:
O ( 1 ) + O ( 2 ) + ⋯ + O ( n ) = O ( ∑ i = 1 n i ) = O ( n ( n + 1 ) 2 ) = O ( n 2 ) O(1) + O(2) + \cdots + O(n) = O\left(\sum_{i=1}^{n} i\right) = O\left(\frac{n(n+1)}{2}\right) = O(n^2) O(1)+O(2)++O(n)=O(i=1ni)=O(2n(n+1))=O(n2)
这里的总时间复杂度仍然是 ( O(n^2) )。

3.2. 多个嵌套循环:

假设有三个嵌套的 for 循环,其中外层循环的迭代次数为 n n n,第二层循环的迭代次数为$m $,第三层循环的迭代次数为 p p p,那么总的时间复杂度是:
O ( n × m × p ) O(n \times m \times p) O(n×m×p)

例如:

for i in range(n):
    for j in range(m):
        for k in range(p):
            # do something

总时间复杂度是 O ( n × m × p ) O(n \times m \times p) O(n×m×p)

4. 嵌套循环中有条件语句:

如果嵌套循环中有条件判断,导致某些迭代次数减少,需要根据条件来计算时间复杂度。通常情况下,条件语句会影响某些循环次数,但是对于大多数情况,时间复杂度的主项还是由外层和内层的迭代次数决定。

例如:

for i in range(n):
    for j in range(i, n):
        if some_condition(i, j):
            # do something

由于内层循环依赖于外层循环,并且条件语句会导致某些迭代跳过,因此时间复杂度仍然是 O ( n 2 ) O(n^2) O(n2),但实际执行次数可能会更少,具体取决于 some_condition 的影响。

5. 总结:

  • 嵌套的 for 循环 的时间复杂度是每一层循环次数的乘积。
  • 如果每一层循环的迭代次数为 n n n,那么时间复杂度通常是 O ( n k ) O(n^k) O(nk),其中 k k k 是嵌套的层数。
  • 如果每一层的迭代次数是变量依赖的,时间复杂度的计算需要考虑这些依赖关系的累积效应。

举个例子:

假设有一个算法,内外两层循环,其中外层循环从 1 1 1 n n n 迭代,内层循环的迭代次数依赖于外层循环变量,如下所示:

for i in range(1, n+1):
    for j in range(i, n+1):
        # do something

计算时间复杂度:

  • 外层循环: i i i从 1 到 n n n,迭代 n n n 次。
  • 内层循环:对于每个 i i i,内层循环迭代 n − i + 1 n - i + 1 ni+1 次。

总时间复杂度:
O ( 1 + 2 + 3 + ⋯ + n ) = O ( n ( n + 1 ) 2 ) = O ( n 2 ) O(1 + 2 + 3 + \dots + n) = O\left(\frac{n(n+1)}{2}\right) = O(n^2) O(1+2+3++n)=O(2n(n+1))=O(n2)

因此,时间复杂度为 O ( n 2 ) O(n^2) O(n2)

例子2
对于以下嵌套 for 循环:

for i in range(n):
    for j in range(n):
        for a in range(m):
            for b in range(m):
                # do something

我们可以逐层分析每个 for 循环的迭代次数,并最终计算时间复杂度。

分析:

  1. 外层循环(i)

    • 该循环从 i = 0 i = 0 i=0 i = n − 1 i = n-1 i=n1迭代,因此它运行了 n n n 次。
  2. 第二层循环(j)

    • 对于每一次 i i i 的迭代,第二层循环 j j j 会从 j = 0 j = 0 j=0 j = n − 1 j = n-1 j=n1 迭代,所以它也运行了 n n n 次。
  3. 第三层循环(a)

    • 对于每一次 a a a 的迭代,第四层循环 b b b 会从 b = 0 b = 0 b=0 b = m − 1 b = m-1 b=m1迭代,所以它也运行了 m m m 次。
  4. 第四层循环(b)

    • 对于每一次 a a a 的迭代,第四层循环 b b b 会从 b = 0 b = 0 b=0 b = m − 1 b = m-1 b=m1迭代,所以它也运行了 m m m 次。

总时间复杂度:

  • 外层循环运行了 n n n 次。
  • 对于每次外层循环,第二层循环运行了 n n n 次。
  • 对于每次第二层循环,第三层循环运行了 m m m 次。
  • 对于每次第三层循环,第四层循环运行了 m m m 次。

因此,时间复杂度是每一层的迭代次数相乘:
O ( n ) × O ( n ) × O ( m ) × O ( m ) = O ( n 2 ⋅ m 2 ) O(n) \times O(n) \times O(m) \times O(m) = O(n^2 \cdot m^2) O(n)×O(n)×O(m)×O(m)=O(n2m2)

该嵌套 for 循环的总时间复杂度为 O ( n 2 ⋅ m 2 ) O(n^2 \cdot m^2) O(n2m2),其中 n n n 是前两层循环的迭代次数, m m m 是后两层循环的迭代次数。

通过这样的推导,你可以计算任何嵌套 for 循环的时间复杂度。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BB1-NHS ester被用于将各种生物活性分子与蛋白质或其他生物大分子进行共轭连接,2082771-52-4

CAS号:2082771-52-4 中文名:BB1-琥珀酰亚胺酯,BB1-活性酯 英文名:BB1-NHS ester,或BB1-Succinimidyl Ester 分子式:C32H32N6O4 分子量:564.63 纯度:≥95% 供应商:陕…

MongoDB在现代Web开发中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 引言 MongoDB 概述 定义与原理 发展…

激光雷达不够用,怎么办?Ubuntu如何用一个激光雷达实现两个激光雷达的扫描点云效果?点云配准ICP,点云拼接、话题转换、ROS重录制bag包。

1.首先至少得有一个激光雷达,如果没有的话,可以考虑花呗买一个,毕竟研究这东西,有个实物还是比较稳妥,这里我选择的是Livox Mid-360,哈哈哈,公司的,大概长这样: 2. 比如我们想要用激…

STM32H743ZIT6+LWIP+MPU+CUBEMX,通过stm32cubemx完成初始化,ping包亲测没问题,带解释!!

文章耗时两个月,原来写了一半,后来遇到其他项目,中间自己重新画了一块电路板。终于把初始化功能实现了,网上的教程能用的确实凤毛麟角! 一、MPU配置详解 个人对stm32H7的MPU属于新接触,为了弄懂&#xff0…

python制作一个简单的端口扫描器,用于检测目标主机上指定端口的开放状态

import argparse # 用于解析命令行参数 from socket import * # 导入 socket 库的所有内容,用于网络通信 from threading import * # 导入 threading 库的所有内容,用于多线程操作 # 创建一个信号量,初始值为 1,用于线程同步&…

网络基础Linux(整理)

计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起; 广域网WAN: 将远隔千里的计算机都连在一起; 所谓 "局域网" 和 "广域网" 只是一个…

我的第一个PyQt5程序

PyQt5的开发环境配置完成之后,开始编写第一个PyQt5的程序。 方法一:使用将.ui转换成.py文件的方法 import sys from FirstPyQt import Ui_MainWindow from PyQt5.QtWidgets import *#QtCore,QtGui,QtWidgets # from QtTest import Ui_MainWindow#导入Q…

面试:TCP、UDP如何解决丢包问题

文章目录 一、TCP丢包原因、解决办法1.1 TCP为什么会丢包1.2 TCP传输协议如何解决丢包问题1.3 其他丢包情况(拓展)1.4 补充1.4.1 TCP端口号1.4.2 多个TCP请求的逻辑1.4.3 处理大量TCP连接请求的方法1.4.4 总结 二、UDP丢包2.1 UDP协议2.1.1 UDP简介2.1.2…

Vue全栈开发旅游网项目(11)-用户管理前端接口联调

联调基本步骤 1.阅读接口文档 2.配置接口地址 3.使用axios获取数据 4.将数据设置到模型层 1.发送验证码联调 1.1 配置接口地址 文件地址:src\utils\apis.js //系统相关的接口 const SystemApis {sliderListUrl:apiHost"/system/slider/list/",//发送…

【相关分析方法】MATLAB计算滑动时滞相关系数

【相关分析方法】MATLAB计算滑动时滞相关系数 1 滑动时滞相关系数2 MATLAB代码2.1 函数代码2.2 案例参考滑动时滞相关系数(Moving Time-Lagged Cross-Correlation, TLCC) 是一种常用于分析两个时间序列之间的滞后关系的工具。它可以帮助我们确定一个时间序列相对于另一个时间…

llama-cpp模型轻量化部署与量化

一、定义 定义配置环境遇到的问题,交互模式下模型一直输出,不会停止模型量化Qwen1.5-7B 案例demo 二、实现 定义 主要应用与cpu 上的部署框架。由c完成。配置环境 https://github.com/ggerganov/llama.cpp https://github.com/echonoshy/cgft-llm/blo…

MySQl基础----Linux下数据库的密码和数据库的存储引擎(内附 实操图和手绘图 简单易懂)

绪论​ 涓滴之水可磨损大石,不是由于他力量强大,而是由于昼夜不舍地滴坠。 只有勤奋不懈地努力,才能够获得那些技巧。 ——贝多芬。新开MySQL篇章,本章非常基础,但同时需要一定的Linux基础,所以假若你没学习…

Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南

概述 随着人工智能技术的迅猛发展,多模态模型在各类应用场景中展现出强大的潜力和广泛的适用性。Qwen2-VL 作为最新一代的多模态大模型,融合了视觉与语言处理能力,旨在提升复杂任务的执行效率和准确性。本指南聚焦于 Qwen2-VL 在三个关键领域…

科技资讯|Matter 1.4 标准正式发布,低功耗蓝牙助力其发展

连接标准联盟(CSA)宣布推出最新的 Matter 1.4 版本,引入了一系列新的设备类型和功能增强,有望提高包括 HomeKit 在内的智能家居生态系统之间的互操作性。 设备供应商和平台能够依靠增强的多管理员功能改善多生态系统下的用户体验&…

群控系统服务端开发模式-应用开发-前端登录页面开发

一、清理不必要的文件 1、删除auth-redirect.vue a、在根目录src文件夹下views文件夹下找到登录文件夹login,在login文件夹中删除auth-redirect.vue文件。 b、在根目录mock文件夹下role文件夹中的routes.js文件中,删除下面的代码 {path: /auth-redirect…

深入理解接口测试:实用指南与最佳实践5.0(三)

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

mongoDB的安装及使用

mongodb的安装参考: Centos系统中mongodb的安装详解_centos安装mongodb-CSDN博客 不要下载最新的版本,新的版本中mongo命令无法使用,也就是安装后不能通过mongo命令登录,我这里使用5.0.30版本; mongodb客户端demo: …

vue3面试题1|[2024-11-12]

问题1:vue2与vue3的区别 1.vue2 和 vue3 双向绑定 方法不同 vue2:Object.defineProperty() ***使用这种方法,对于后添加的属性是劫持不到的,所以就会出现数据更新了, 但是视图没有更新,所以vue2就需要使用$…

python-24-一篇文章彻底掌握Python HTTP库Requests

python-24-一篇文章彻底掌握Python HTTP库Requests 一.简介 在 Python 中,Requests 是一个非常流行且易于使用的 Python HTTP 库,专门用于发送 HTTP/HTTPS 请求,获取请求响应; 可能觉得HTTP请求不是应该前端去做么?…

打造移动友好网站:UI设计的自适应技巧

随着移动互联网的快速发展,手机已成为人们获取信息的主要渠道之一。对于UI设计师而言,打造一个能够自适应手机屏幕的网站变得尤为重要。这不仅能够提升用户体验,还能在搜索引擎优化(SEO)中占据优势。以下是实现UI设计网…