时间复杂度

复杂度的概念:

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般 是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。

时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。

时间复杂度的概念:

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。

一个算法所花费的时间与其中语句的执行次数成正比例算法中的基本操作的执行次数,为算法 的时间复杂度。

找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。 

而这种数学表达式通常是使用大O的渐进表示法。 

大O的渐进表示法:

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。

推到大O渐进表示法:

//请计算一下Func1中++count语句总共执行了多少次?void Func1(int N)
{int count = 0;for (int i = 0; i < N; ++i){for (int j = 0; j < N; ++j){++count;}}for (int k = 0; k < 2 * N; ++k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}

Func1 执行的基本操作次数 :

  • N = 10 F(N) = 130
  • N = 100 F(N) = 10210
  • N = 1000 F(N) = 1002010 

分析,由于此处的基本操作是三个循环:且因为时间复杂度的本质是算法中的基本操作的执行次数。

所以,本代码的时间复杂度是  2*N+N*N+10

  • 但是按照大O渐进表示法的规则,取数学表达式中的最大一项,且若最大一项是常数,则用1表达,若最大一项有系数,则删除系数。

所以以上代码用大O渐进表示法表示为  O(N^2) 


//嵌套循环for (int i = 0; i < N; ++i){for (int j = 0; j < N; ++j){++count;}}//普通循环1:for (int k = 0; k < 2 * N; ++k){++count;}//普通循环2:int M = 10;while (M--){++count;}

大O渐进表示法的关系和大小:

一般来说,大O渐进表示法的表达式是:O(N)、O(N^2)、O(1)

  • 其中的N表达的是某一算法中的基本操作的运行次数。
  • 1也表示一种次数,但不是表示运行一次,而是使用数学关系式计算出,时间复杂度最后是一个常数,又因为计算机的cpu功能,处理和运行一个时间复杂度是常数的代码,它的运行和处理速度是非常快的,哪怕这个常数是一亿。 
  • 需要注意,O(N)、O(N^2)、O(1)中,运行性能和速度的大小关系是:O(1) > O(N) > O(N^2)

注意:这个常数必须要在类型(如int、long long、long)的范围内,不然会溢出。 

其他的代码的时间复杂度: 

 在一个长度为N数组中搜索一个数据X:

const char * strchr ( const char * str, int character )
{while(*str){if(*str == character)return str;}++str;}

根据时间复杂度的本质,"算法中的基本操作的执行次数,就是时间复杂度",而本代码中的多次运行的操作是移动,移动指针查找是数组中的元素是否是我们需要的

所以从指针开始遍历数组,直到找到需要的元素,这一段查找确认的次数就是时间复杂度。

而找到元素,这个是难以确认的,我们不知道元素是否在哪,所以这里有一种不确定性。

而对于这种不确定性,我们选择了一种最坏的结果,那就是没有找到元素,而没有找到元素就是要先将数组用指针遍历一遍,所以,这个代码的时间复杂度就转化为了:要把指针移动几次,才能将数组遍历一遍。

而数组的长度是N,那么指针则需要遍历N次,才能将数组遍历完一遍。 

交换位置(冒泡排序): 

void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end)//每次交换所需要的趟数{int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i-1] > a[i]){Swap(&a[i-1], &a[i]);exchange = 1;}}if (exchange == 0)break;}}

 根据时间复杂度的本质,"算法中的基本操作的执行次数,就是时间复杂度",而本代码中的多次运行的操作是每次交换所需要的趟数!

注意该代码中的交换是使用了调用函数,所以不需要算上交换的次数。

  • 从我们的初步运算,得知交换的趟数是N*(N-1+1-1)/2 ,最后算出(N^2)/2
  • 按照大O渐进法,得到该代码的时间复杂度是O(N^2) 

 

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

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

相关文章

IoT 物联网共享充电桩场景中设备资产定位和地理围栏开发实践

基于经纬度的设备资产定位和地理围栏在物联网场景中应用广泛 01 物联网 GEO 场景架构方案 首先&#xff0c;IoT 终端设备通过卫星定位模块获取当前经纬度&#xff1b;然后&#xff0c;将坐标信息实时上报到物联网平台&#xff1b;最后&#xff0c;存储到 Redis GEO 数据库中。 …

百度智能云推出,国内首个大模型全链路生态支持体系

在10月17日举行的百度世界2023上&#xff0c;百度智能云宣布&#xff0c;百度智能云千帆大模型服务平台已服务17000多家客户&#xff0c;覆盖近500个场景。 同时&#xff0c;新的企业和开发者还正在不断地涌入千帆&#xff0c;大模型调用量高速攀升。平台上既有年龄仅14岁的小…

USRP-2944 配件讲解,如何选择对应的配件

USRP-2944 产品图片 产品官网价格信息 查看附件和价格 硬件服务 NI硬件服务计划通过简化物流&#xff0c;延长正常运行时间以及根据业界标准维护数据的可追溯性&#xff0c;帮助您节省系统组装、设置和维护所需的时间和金钱。这些计划涵盖多年期维修服务&#xff0c;同时还提…

Adobe产品2024

一、软件下载&#xff1a; 二、软件介绍&#xff1a; Adobe公司旗下的产品在影视后期、平面设计等领域有着无可取代的地位。在创意和设计领域中&#xff0c;产品有多达 21 个&#xff0c;包括 Photoshop、Illustrator、InDesign、Premiere Pro、After Effects 和 Acrobat Pro …

excel怎么固定前几行前几列不滚动?

在Excel中&#xff0c;如果你想固定前几行或前几列不滚动&#xff0c;可以通过以下几种方法来实现。详细的介绍如下&#xff1a; **固定前几行不滚动&#xff1a;** 1. 选择需要固定的行数。例如&#xff0c;如果你想要固定前3行&#xff0c;应该选中第4行的单元格。 2. 在E…

C++ 友元函数和友元类

前言 在本文中&#xff0c;您将学习在C 中创建友元函数和友元类&#xff0c;并在程序中有效地使用它们。OOP的重要概念之一是数据隐藏&#xff0c;即非成员函数无法访问对象的私有或受保护的数据。但是&#xff0c;有时这种限制可能迫使程序员编写冗长而复杂的代码。因此&#…

使用 ClickHouse 深入了解 Apache Parquet (一)

​ 【squids.cn】 全网zui低价RDS&#xff0c;免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 自2013年作为Hadoop的列存储发布以来&#xff0c;Parquet几乎已经成为一种无处不在的文件交换格式&#xff0c;它提供了高效的存储和检索。这种采纳使其成为更近期的…

【六:pytest框架介绍】

常见的请求对象requests.get()requests.post()requests.delete()requests.put()requests.request()常见的响应对象reprequests.request()//返回字符串格式数据print(req.text)//返回字节格式数据print(req.content)//返回字典格式数据print(req.json)#状态码print(req.status_c…

GC overhead limit exceeded问题

1.问题现象 程序包运行时候发生了java.lang.OutOfMemoryError: GC overhead limit exceeded异常&#xff0c; 详细信息如下 org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.jboss.util.NestedSQLException: Error; - nested t…

【斗罗二】冰帝两次险些杀死雨浩,天梦哥求助伊老遭拒绝,霍云儿现身救儿子

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析绝世唐门。 斗罗大陆动画第二部绝世唐门已经更新了&#xff0c;霍雨浩与冰帝完美融合&#xff0c;成功觉醒了第二武魂&#xff0c;霍挂的时代正式到来。只是在整个第19集中&#xff0c;官方做了大量的改编&#xff0c;不但…

AC修炼计划(AtCoder Regular Contest 167)

传送门&#xff1a;AtCoder Regular Contest 167 - AtCoder 再次感谢樱雪喵大佬的题解&#xff0c;讲的很详细&#xff0c;Orz。 大佬的博客链接如下&#xff1a;Atcoder Regular Contest 167 - 樱雪喵 - 博客园 (cnblogs.com) 第一题很签到&#xff0c;就省略掉了。 第二题…

数据结构——二叉树的公共祖先问题

数据结构——二叉树的公共祖先问题 236. 二叉树的最近公共祖先思路 235. 二叉搜索树的最近公共祖先思路1.递归2.迭代 236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#x…

(矩阵) 289. 生命游戏 ——【Leetcode每日一题】

❓ 289. 生命游戏 难度&#xff1a;中等 根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一…

16-spring AOP核心对象的创建

文章目录 1. aop的几个重要概念2. aop bean definition3. AspectJPointcutAdvisor4.AopConfigUtils5.AnnotationAwareAspectJAutoProxyCreator6. 循环依赖 1. aop的几个重要概念 参考官方解释&#xff1a;https://docs.spring.io/spring-framework/docs/5.2.9.RELEASE/spring-…

大数据之LibrA数据库系统概览

实时监控 “实时监控”页面如图1所示&#xff0c;用户可单击刷新按钮手动刷新当前页面&#xff0c;也可在点刷新按钮前选择自动刷新时长&#xff0c;刷新时长包括&#xff1a;每30秒刷新一次、每60秒刷新一次、停止刷新。 实时监控数据&#xff08;监控时间轴产生的新曲线&am…

Oracle数据中如何在 where in() 条件传参

一、问题场景描述 在sql 条件中&#xff0c;如何在 where in()中想传入参数&#xff0c;如果直接 where in(:seqList)&#xff0c;当传入单个值&#xff0c;seqList: ‘80’ 是没问题的&#xff0c;但是初入多个值时&#xff0c;seqList: ‘80,90’ &#xff0c;因缺少单引号&…

2 用TensorFlow构建一个简单的神经网络

上一篇&#xff1a;1 如何入门TensorFlow-CSDN博客 环境搭建 后续介绍的相关代码都是在pycharm运行&#xff0c;pycharm安装略。 打开pycharm&#xff0c;创建一个新的项目用于tensorflow编码练习&#xff0c;在Terminal输入命令&#xff1a; # 依赖最新版本的pip pip inst…

Pytest自动化测试框架之Allure报告详解

简介 Allure Framework是一种灵活的、轻量级、多语言测试报告工具。 不仅可以以简洁的网络报告形式非常简洁地显示已测试的内容&#xff0c; 而且还允许参与开发过程的每个人从日常执行中提取最大程度的有用信息和测试。 从开发/测试的角度来看&#xff1a; Allure报告可以…

线性代数的本质笔记

课程来自b站发现的《线性代数的本质》&#xff0c;可以帮助从直觉层面理解线性代数的一些基础概念&#xff0c;以及把一些看似不同的数学概念解释之后&#xff0c;发现其实有内在的关联。 这里只对部分内容做一个记录&#xff0c;完整内容请自行观看视频~ 01-向量究竟是什么 …

LeetCode 2316. 统计无向图中无法互相到达点对数::广度优先搜索(BFS)

【LetMeFly】2316.统计无向图中无法互相到达点对数&#xff1a;广度优先搜索&#xff08;BFS&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-unreachable-pairs-of-nodes-in-an-undirected-graph/ 给你一个整数 n &#xff0c;表示一张 无向图 中…