时间复杂度与O(n)

文章目录

  • 1 复杂度分析
    • 1.1 时间复杂度
      • 1.1.1 循环执行次数
      • 1.1.2 大O(n)表示法
    • 1.2 空间复杂度

1 复杂度分析

1.1 时间复杂度

​ 时间复杂度用来表示算法运行时间的长短,用来定性的描述程序的运行时间。要了解时间复杂度,我们需要先了解程序执行的次数。

1.1.1 循环执行次数

(1)

for (int i=0; i<n; i++)
{printf("%d\n", i);
}
//该代码段内,for() 语句将被执行 n+1 次,而不是 n 次,当 i=n-1 时,循环正常运行,当 i=n 时,for() 仍需要判断 i<n 条件是否成立,不成立,跳出 for() 循环,最后一次判断导致 for() 语句的执行次数是 n+1 次,而不是 n 次。//printf()只有在符合 i<n 条件时,才会执行printf语句,所以执行次数为n,而不是n+1。

(2)

for (int i=0; i<n; i++)
{   for (int j=0; j<n; j++){printf("i:%d,j:%d\n", i ,j);}  
} 
//该代码段内,for(i=0, i<n, i++)外部循环语句将执行 n+1 次。for(j=0 , j<n, j++)将被执行 n(n+1) 次。//printf()将执行 n*n 次。

(3)

for (i=1; i<=n; i++)
{   for (j=1; j<=i; j++){for (k=1; k<=j; k++)   {printf("i:%d, j:%d, k:%d \n", i, j , k);  }}  
} 
//该代码段内,从内到外思考 printf() 的循环次数,内部第一层循环执行 j 次,第二层循环,执行次数是 j 分别取值 0~i 的求和。可得 printf() 的执行次数为:

∑ i = 1 i = n ∑ j = 1 j = i j = 1 / 6 n ( n + 1 ) ( 2 n + 1 ) \sum_{i=1}^{i=n}\sum_{j=1}^{j=i} j = 1/6n(n+1)(2n+1) i=1i=nj=1j=ij=1/6n(n+1)(2n+1)

这里有些小伙伴会疑惑,为什么就成累加了呢?我们只考虑内部的 j 和 k 两层循环,带入具体的值想一下:

​ 假设 j 的最大值是5,j 会从 1 一直累加到 5 ,那么 j = 1 时,k <= 1,此时printf会被执行一次,之后内部循环就不满足循环条件退出了,而外部循环中的 j 就被累加到了 2 ,此时 k <= 2,此时printf会被执行两次,然后跳出循环,以此类推,执行的次数就是 1+ 2 + 3+ 4 + 5。

(4)

for (i=1; i<=n; i=i*2)
{printf("Hello World\n");
}//该代码段内,i=i*2 我们设执行次数为k,所以跳出循环的判断条件可以简化表示为:

2 k − 1 > n 即 k = l o g 2 ( n + 1 ) 2^k-1 > n 即 k = log_2 (n+1) 2k1>nk=log2(n+1)

1.1.2 大O(n)表示法

(1)对于以上四个循环例子,当 n 趋于无限大时,执行次数的系数和常数项可以忽略不计,因此,以上四个例子的 printf() 语句的时间复杂度用 O(n) 可以表示为:

  1. O ( n ) O(n) O(n)

  2. O ( n 2 ) O(n^2) O(n2)

  3. O ( n 3 ) O(n^3) O(n3)

  4. O ( l o g 2 ( n ) ) O(log_2 (n)) O(log2(n))

(2)常见的时间复杂度,以及当 n 区域无穷大时的效率:

在这里插入图片描述

(3)在用 O(n) 描述算法的时间复杂度时,我们往往一般说的是平均时间复杂度,除此之外,我们还需要考虑,最差时间复杂度,和最好时间复杂度。

1.2 空间复杂度

​ 即算法占用内存空间的大小。与时间复杂度不同,我们通常只关注最差空间复杂度。因为内存空间是硬性要求,我们必须确保在所有输入数据下都有足够的内存空间预留。

空间复杂度的推算方法与时间复杂度大致相同,只需将统计对象从 “操作数量” 转为 “使用空间大小” 我们举几个例子。

  1. O ( 1 ) :与循环无关的变量 O(1):与循环无关的变量 O(1):与循环无关的变量

  2. O ( l o g 2 ( n ) ) :例如递归树,分治算法 O(log_2 (n)):例如递归树,分治算法 O(log2(n)):例如递归树,分治算法

  3. O ( n ) :例如数组,链表,栈,队列 O(n):例如数组,链表,栈,队列 O(n):例如数组,链表,栈,队列

  4. O ( n 2 ) :例如二维数组 O(n^2):例如二维数组 O(n2):例如二维数组

  5. O ( l o g 2 ( n ) ) :例如二叉树 O(log_2 (n)):例如二叉树 O(log2(n)):例如二叉树

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

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

相关文章

机器学习(二十二):精度和召回率

一、倾斜数据集 倾斜数据集&#xff1a;一个数据集中的正面和负面例子的比例非常不平衡&#xff0c;比如数据集中&#xff0c;结果为1的占比20%&#xff0c;结果为0的占比80% 例子&#xff1a;如果数据集的结果中只有0.5%是1&#xff0c;其余结果是0。有一个模型的预测准确度…

【elasticsearch实现词重复,文档长度不影响匹配度】

elasticsearch实现词重复&#xff0c;文档长度不影响匹配度 前言BM25&#xff08;默认&#xff09;索引重建 前言 搜索场景要求&#xff1a; 关键词重复出现不影响匹配度【默认重复匹配度会提高】记录的文档长度不影响匹配度【默认文档越短&#xff0c;匹配度越高】 BM25&am…

【信创】udisk2服务异常导致U盘使用中自动移除问题解决

原文链接&#xff1a;【信创】udisk2服务异常导致U盘使用中自动移除问题解决 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在信创终端操作系统上由于udisk2服务异常导致U盘等移动设备在使用中自动移除问题的排查文章。udisk2是一个管理存储设备的服务&#xf…

restTemplate实现http远程调用

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /*** description 将RestTemplate注入到容器当中&#xff0c;让他保持单例&#xff0c;当我们哪个…

树莓派下,docker中安装部署TensorFlow java版本

在树莓派上安装和部署TensorFlow Java版本需要一些特定的步骤,尤其是当你打算使用Docker容器来运行它时。以下是详细的步骤,帮助你在树莓派上完成这一任务。 一、准备工作 确保你的树莓派操作系统已更新,并安装了Docker。如果尚未安装,使用以下命令进行安装和更新: sud…

C++学习第四天

文章目录 1. 存储变量值的内存2. 声明并初始化指针3.引用运算符4. 解除引用运算符 1. 存储变量值的内存 /* - 指针是一个变量&#xff0c;与所有变量一样&#xff0c;指针也占用内存空间- 指针的特殊之处在于&#xff0c;指针包含的值&#xff08;这里为0x558&#xff09;被解…

【计算机网络】OSPF单区域实验

一&#xff1a;实验目的 1&#xff1a;掌握在路由器上配置OSPF单区域。 2&#xff1a;学习OSPF协议的原理&#xff0c;及其网络拓扑结构改变后的变化。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS交换机、网线、内网网卡接口、Windows 2019操作系统的计算机等。…

Vue 3 实现左侧列表点击跳转滚动到右侧对应区域的功能

使用 Vue 3 实现左侧列表点击跳转到右侧对应区域的功能 1. 引言 在这篇博客中&#xff0c;我们将展示如何使用 Vue 3 实现一个简单的页面布局&#xff0c;其中左侧是一个列表&#xff0c;点击列表项时&#xff0c;右侧会平滑滚动到对应的内容区域。这种布局在很多应用场景中都…

Llama 3.1 405B 详解

2024 年 7 月 23 日星期二&#xff0c;Meta 宣布推出 Llama 3.1&#xff0c;这是其Llama 系列大型语言模型 (LLM)的最新版本。虽然只是对 Llama 3 模型进行小幅更新&#xff0c;但它特别引入了Llama 3.1 405B——一个 4050 亿参数的模型&#xff0c;这是迄今为止世界上最大的开…

力扣刷题录——链表

一、移除链表元素 移除链表元素 法一&#xff1a;不使用虚拟头节点 ListNode* removeElements(ListNode* head, int val) {//若删除头节点while(head!NULL&&head->valval)//连续删除头节点的条件{headhead->next;} //删除其他节点&#xff08;先判断是不是空链…

【Qt 关于信号和槽 的参数类型和参数顺序关系】

前言&#xff1a;信号的参数类型和参数顺序一定要严格要求并且指明&#xff08;特别是当同一信号会发出不同参数类型和顺序的信号时&#xff09;&#xff0c;槽会根据参数类型和参数顺序进行匹配相应的槽函数&#xff0c;期间槽函数的自动类型匹配也可以生效。 信号定义&#x…

运行ruoyi

nacos 数据库配置 修改nacos/conf/application.properties 单机版运行 startup.cmd -m standalone redis 运行后端 运行gateway,auth,modules/system模块 可能遇到的问题&#xff1a;端口正在使用 解决 netstat -ano | findstr 9200 taskkill -pid 18284 -f

JAVA同城圈子达人交友系统源码支持微信小程序+公众号+H5+APP

&#x1f308; 同城圈子达人交友系统&#xff0c;遇见志同道合的TA&#xff01; &#x1f389; 开篇&#xff1a;告别孤单&#xff0c;同城圈子等你来探索&#xff01; 在这个快节奏的城市生活中&#xff0c;你是否常常感到孤独&#xff0c;渴望找到一群志同道合的朋友&#…

发现洗白的公开伎俩

利益方把事件A和事件B放在一起&#xff0c;事件A和事件B有明显逻辑冲突&#xff0c;故意把A和B在一起炒大。一段时间就有人利用逻辑冲突来故意辟谣&#xff0c;把事件真实全部否定&#xff0c;达到舆论上既没有做A或其相关事项&#xff0c;也没有做B或其相关事项的目的&#xf…

Elasticsearch基础(六):使用Kibana Lens进行数据可视化

文章目录 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 二、基础可视化 1、指标可视化 2、垂直堆积条形图 3、表格 三、高级可视化 1、多图层和索引 2、子桶 3、树状图 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 在Kibana主页&#xff0c;单击页面…

【资料分享】2024钉钉杯大数据挑战赛A题思路解析+代码演示

2024第三届钉钉杯大学生大数据挑战赛今天已经开赛&#xff0c;【A题】思路解析代码&#xff0c;资料预览&#xff1a;

Conda的守护神:包兼容性测试全指南

Conda的守护神&#xff1a;包兼容性测试全指南 在软件开发中&#xff0c;确保不同软件包之间的兼容性是维护项目稳定性的关键。Conda&#xff0c;作为广泛使用的包管理器和环境管理器&#xff0c;提供了强大的工具来测试包的兼容性。本文将深入探讨如何在Conda中使用包兼容性测…

使用 Java 监听和处理 POST 请求

各类学习教程下载合集 ​​https://pan.quark.cn/s/874c74e8040e​​ 在现代 Web 开发中&#xff0c;监听和处理 HTTP POST 请求是常见的任务之一。无论是构建 RESTful API 还是处理表单提交&#xff0c;Java 都提供了强大的工具和库来实现这一功能。本文将介绍如何使用 Java…

【JAVA学习笔记】找不到依赖项 ‘org.springframework.boot:spring-boot-starter-web:3.0.5‘

如果环境都是跟着教程配的话&#xff0c;并且上网搜了一圈询问gpt都没发现对应长得像的错误&#xff0c;那么试试**刷新一下Maven项目**&#xff0c;可能问题就自己解决了。如果这样解决不了再查到底是什么地方没有配置对。&#xff08;我第一次遇到这个问题的时候搜了半天都不…

RHEL8.6配置yum仓库

记录通过Linux安装ISO挂载yum仓库&#xff0c;由于没有在线仓库只能挂载iso的软件仓库 [rootlocalhost /]# yum install libicu 正在更新 Subscription Management 软件仓库。 无法读取客户身份本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。错误&…