时间复杂度

复杂度的概念:

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

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

时间复杂度的概念:

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

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

找到某条基本语句与问题规模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 …

双缓冲刷新图像:避免自绘时图像闪烁

1、双缓冲的技术原理&#xff1a; 在Windows中每一种设备都在内存中有一个设备描述表与其对应&#xff0c;这个设备描述表实际上就是一个内存缓冲区。 传统的绘图是单缓冲&#xff0c;将图形绘制在设备描述表缓冲区中&#xff0c;然后由gdi自动的将设备描述表中的图像拷贝到显存…

【快捷测试模型是否可以跑通】设置一张图片的张量形式,送入自己写的模型进行测试

文章目录 1. 1. import torch.nn as nn import torch from einops import rearrange, repeat from einops.layers.torch import Rearrange import torch.nn.functional as Fclass PreNorm(nn.Module):def __init__(self, dim, fn):super().__init__()self.norm nn.LayerNorm(…

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

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

C++ 友元函数和友元类

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

leetcode_171Excel表列序号

1. 题意 把excel中列序号字符串转换为10进制数。 Excel表列序号 2. 题解 26进制转10进制 class Solution { public:int titleToNumber(string columnTitle) {int sz columnTitle.size();int ans 0;int base 1;for ( int i sz - 1; ~i; --i){int v columnTitle[i] - A …

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

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

JUC并发编程——Volatile详解(基于狂神说的学习笔记)

Volatile Volatile 是Java虚拟机提供的轻量级的同步机制 1、保证可见性 public class JMMDemo {// 在num前添加关键字volatile&#xff0c;保证num在所有线程可见&#xff0c;即修改就被通知private volatile static int num 0;public static void main(String[] args) thr…

数字电路学习

资料 元器件 电流、电压、电阻、电容、电感、保险丝、熔断器、接插件、蜂鸣器、继电器、三极管、mos管、 型号、特性、参数 数据手册 立创商城&#xff1a;https://www.szlcsc.com/?cZH 华秋商城&#xff1a;https://www.hqchip.com/ 公式 欧姆定律 IU/R 仿真软件 mu…

Crypto(5)2023xctf ezCrypto(待补)

下载地址&#xff1a; https://adworld.xctf.org.cn/match/list?event_hasha37c4ee0-1808-11ee-ab28-000c29bc20bf 题目代码分析&#xff1a; #这两行导入了Python标准库中的 random 和 string 模块&#xff0c;用于生成随机数和处理字符串 import random import stringcha…

【六: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…

LLMs之RAG:利用langchain实现RAG应用五大思路步骤—基于langchain使用LLMs(ChatGPT)构建一个问题回答文档的应用程序实战代码

LLMs之RAG:利用langchain实现RAG应用五大思路步骤—基于langchain使用LLMs(ChatGPT)构建一个问题回答文档的应用程序实战代码 目录 相关文章

基于STM32设计的小龙虾养殖系统(带手机APP)

一、项目介绍 随着人们对健康生活需求的提高,小龙虾逐渐成为现代消费者餐桌上的一道风味佳肴,并且市场需求不断扩大。然而,小龙虾的养殖需要注意许多因素,其中最重要的就是水质条件。水质不良会导致小龙虾死亡率增加,降低养殖效益。因此,为了保证小龙虾的健康生长,必须…

神经网络的发展历史

神经网络的发展历史可以追溯到上世纪的数学理论和生物学研究。以下是神经网络发展史的详细概述&#xff1a; 早期的神经元模型&#xff1a; 1943年&#xff0c;Warren McCulloch和Walter Pitts提出了一种神经元模型&#xff0c;被称为MCP神经元模型&#xff0c;它模拟了生物神经…

v-model修饰符 .lazy .number .trim

1、v-model.lazy“xxx” 默认情况下&#xff0c;v-model它是在每次输入数据时触发input事件来更新数据的 使用 .lazy 修饰符后&#xff0c;当改变数据失去焦点-触发change事件来进行更新数据 2、v-model.number"xxx" 它会自动将输入的值自动转成number 类型&#x…

使用高防服务器有什么好处?103.216.155.x

为什么建议租用高防服务器 第一&#xff0c;高防服务器由于业务的特殊性&#xff0c;本身机器的配置要求高&#xff0c;服务器的价格相比普通的贵&#xff0c;而且&#xff0c;机器还有维护费、托管费等&#xff0c;这会让运营的成本上升。 第二&#xff0c;租用高防服务器&a…

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…