算法效率(时间复杂度、空间复杂度,提高算法效率的方法)

 

目录

1.复杂度的概念

2.复杂度的重要性

3.时间复杂度

3.1⼤O的渐进表⽰法

4.空间复杂度

5.提高算法效率的方法


算法效率‌是指算法执行的时间,具体来说,是通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量的‌。算法效率是衡量算法优劣的重要指标之一,主要包括时间效率和空间效率两个方面。

1.复杂度的概念

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

时间复杂度主要衡量⼀个算法的运⾏快慢,⽽空间复杂度主要衡量⼀个算法运⾏所需要的额外空间。在计算机发展的早期,计算机的存储容量很⼩。所以对空间复杂度很是在乎。但是经过计算机⾏业的迅速发展,计算机的存储容量已经达到了很⾼的程度。所以我们如今已经不需要再特别关注⼀个算法的空间复杂度。

2.复杂度的重要性

复杂度的重要性主要体现在以下几个方面‌:

  1. 评估算法效率‌:复杂度是衡量算法执行过程中所需资源(如时间和空间)的数量,通常与输入数据的大小有关。通过分析算法的复杂度,可以评估算法的效率,从而选择最优的解决方案‌1。

  2. 优化程序性能‌:在软件开发中,算法复杂度直接影响程序的运行效果和用户体验。通过优化算法复杂度,可以减少程序运行时间,降低资源消耗,提升程序的整体性能‌2。

  3. 指导算法设计‌:在设计算法时,了解复杂度的概念可以帮助开发者设计出更高效的算法。例如,通过分析时间复杂度和空间复杂度,可以选择使用更优的数据结构和算法,避免使用效率低下的方法‌3。

  4. 帮助理解算法特性‌:复杂度不仅包括时间复杂度和空间复杂度,还包括其他资源如并行计算中的处理器数量等。理解这些复杂度的分类和计算方法,有助于全面评估算法的性能和资源消耗‌3。

  5. 促进算法改进‌:通过分析算法的复杂度,可以发现算法中的瓶颈和低效部分,进而进行优化和改进。例如,通过减少循环次数、优化数据结构等方法,可以显著降低算法的时间复杂度和空间复杂度‌4。

综上所述:复杂度在评估算法效率、优化程序性能、指导算法设计、理解算法特性和促进算法改进等方面都具有重要作用。

3.时间复杂度

时间复杂度也称为‌‌时间效率,主要衡量一个算法的运行速度,在计算机科学中,算法的时间复杂度是⼀个函数式T(N),它定量描述了该算法的运⾏时间。

以下面的代码为例:

void Func1(int N)
{
int count = 0;
for (int i = 0; i < N ; ++ i)
{
for (int j = 0; j < N ; ++ j)
{
++count;
}
} f
or (int k = 0; k < 2 * N ; ++ k)
{
++count;
} i
nt M = 10;
while (M--)
{
++count;
}
}

 代码中执行的基本操作次数即++count语句执行的次数就是我们需要求的时间复杂度,下面我们来对代码进行分析:

T (N) = N^2 + 2 ∗ N + 10

• N = 10               T(N) = 130

• N = 100             T(N) = 10210

• N = 1000           T(N) = 1002010

通过对N取值分析,对结果影响最⼤的⼀项是 N^2

实际中我们计算时间复杂度时,计算的也不是程序的精确的执⾏次数,精确执⾏次数计算起来还是很⿇烦的(不同的⼀句程序代码,编译出的指令条数都是不⼀样的),计算出精确的执⾏次数意义也不⼤,因为我们计算时间复杂度只是想⽐较算法程序的增⻓量级,也就是当N不断变⼤时T(N)的差别,上⾯我们已经看到了当N不断变⼤时常数和低阶项对结果的影响很⼩,所以我们只需要计算程序能代表增⻓量级的⼤概执⾏次数,复杂度的表⽰通常使⽤⼤O的渐进表⽰法。


3.1⼤O的渐进表⽰法

时间复杂度是通过分析算法中基本操作重复执行的次数来计算的,通常用大O符号(O)表示。例如,对于简单的线性搜索算法,其时间复杂度为O(n),表示在最坏情况下需要遍历n个元素‌。

推导⼤O阶规则 
1. 时间复杂度函数式T(N)中,只保留最⾼阶项,去掉那些低阶项,因为当N不断变⼤时,
低阶项对结果影响越来越⼩,当N⽆穷⼤时,就可以忽略不计了。
2. 如果最⾼阶项存在且不是1,则去除这个项⽬的常数系数,因为当N不断变⼤,这个系数
对结果影响越来越⼩,当N⽆穷⼤时,就可以忽略不计了。
3. T(N)中如果没有N相关的项⽬,只有常数项,⽤常数1取代所有加法常数。

 根据规则我们可以知道上面的代码Func1()的时间复杂度为:O(N^2)。

4.空间复杂度

空间复杂度也称为‌‌空间效率,主要衡量一个算法所需要的额外空间。空间复杂度考虑的是算法在运行过程中临时占用存储空间的规模,包括辅助空间和输入输出数据所占用的空间‌。

空间复杂度计算规则基本跟实践复杂度类似,也使⽤⼤O渐进表⽰法。

以以下递归代码为例:

long long Fac(size_t N)
{
if(N == 0)
return 1;
return Fac(N-1)*N;
}

Fac()递归调⽤了N次,额外开辟了N个函数栈帧,每个栈帧使⽤了常数个空间

因此空间复杂度为: O(N)
 

注意:函数运⾏时所需要的栈空间(存储参数、局部变量、⼀些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运⾏时候显式申请的额外空间来确定

5.提高算法效率的方法

  1. 选择合理的存储结构‌:选择合适的存储结构可以减少访问和操作数据的时间和空间开销。
  2. 使用直接初始化‌:避免在循环中多次初始化变量,减少不必要的计算。
  3. 尽量减少值传递,多用引用来传递参数‌:这样可以避免复制大量数据。
  4. 减少除法运算的使用‌:除法运算通常比乘法、加法和减法更耗时。
  5. 避免使用多重继承‌:多重继承会增加类的复杂度和运行时的开销。
  6. 将小粒度函数声明为内联函数‌:这样可以减少函数调用的开销‌1。

通过这些方法,可以有效提高算法的执行效率和空间利用率,从而优化程序的性能。

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

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

相关文章

Python 多个版本管理 -- 最简方式

目录 一、下载Python文件 二、安装文件&#xff0c;并配置环境变量 三、重命名Python.exe 四、配置完毕&#xff0c;开始使用&#xff0c;效果图 一、下载Python文件 Python 官方地址The official home of the Python Programming Languagehttps://www.python.org/downloa…

C#的Event事件示例小白级剖析

1、委托Delegate 首先说一下delegate委托&#xff0c;委托是将方法作为参数进行传递。 // 定义了一个委托类型public delegate void MyDelegate(int num);// 定义了一个啥也不干的委托实例public MyDelegate m_delegate _ > {};// 定义了一个和委托相同格式的方法public …

流畅!HTMLCSS打造网格方块加载动画

效果演示 这个动画的效果是五个方块在网格中上下移动&#xff0c;模拟了一个连续的加载过程。每个方块的动画都是独立的&#xff0c;但是它们的时间间隔和路径被设计为相互协调&#xff0c;以创建出流畅的动画效果。 HTML <div class"loadingspinner"><…

Java Iterator 实现杨辉三角

一、问题描述 杨辉三角定义如下&#xff1a; 1/ \1 1/ \ / \1 2 1/ \ / \ / \1 3 3 1/ \ / \ / \ / \1 4 6 4 1/ \ / \ / \ / \ / \ 1 5 10 10 5 1 把每一行看做一个list&#xff0c;试写一个 Iterator&#xff0c;不断输出下一行的 list&#xf…

PostGis--几何构造函数

目录 1、简介2、ST_Centroid / ST_PointOnSurface3、ST_Buffer4、ST_Intersection5、ST_Union6、substr和substringPS: 1、简介 接着上一个文章&#xff1a; 到目前为止&#xff0c;我们看到的所有函数都“按原样”处理几何图形并返回 对象分析&#xff08;ST_Length&#xf…

衡石分析平台最佳实践-开发场景之分层级嵌入

分层级嵌入 平台整体嵌入 在这种应用场景中&#xff0c;把所有功能通过 iframe 的方式都开放给登陆用户&#xff0c;嵌入的示例如下&#xff1a; html <iframename""src"https://preview.hengshi.com/app/1"> </iframe> 1 2 3 4 单个模…

数字信号处理Python示例(5)使用实指数函数仿真PN结二极管的正向特性

文章目录 前言一、二极管的电流-电压关系——Shockley方程二、PN结二极管正向特性的Python仿真三、仿真结果分析写在后面的话 前言 使用Python代码仿真了描述二极管的电流-电压关系的Shockley方程&#xff0c;对仿真结果进行了分析&#xff0c;说明在正向偏置区域&#xff0c;…

科普之使用Lableme图像标注—盲道分割与目标检测

使用Lableme图像标注—盲道分割与目标检测 数据集格式 在介绍使用Lableme软件进行数据集的标注之前&#xff0c;首先先对计算机视觉领域最知名的两个数据集的格式来进行简单的复习或者说是重新的学习。 在读研之后自己最常用的几个数据集进行存在在磁盘中跑代码的时候在拿出来…

接口测试(十)jmeter——关联(正则表达式提取器)

一、正则表达式 常用的元字符 元字符&#xff1a;用来匹配相关字符 万能匹配表达式&#xff1a; .*? 所有log结尾的文件&#xff1a;*.log 代码说明.匹配除换行符以外的任意字符\w匹配字母或数字或下划线或汉字\s匹配任意的空白符\d匹配数字\b匹配单词的开始或结束^匹配字符…

2016年7月和8月NASA的气候成像(ATom)-1飞行活动期间测量的黑碳(BC)质量混合比(单位为ng BC / kg空气)

目录 简介 摘要 代码 引用 网址推荐 知识星球 机器学习 简介 ATom: Black Carbon Mass Mixing Ratios from ATom-1 Flights 该数据集提供了在2016年7月和8月NASA的气候成像&#xff08;ATom&#xff09;-1飞行活动期间测量的黑碳&#xff08;BC&#xff09;质量混合比&…

关于Linux系统调试和性能优化技巧有哪些?

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于Linux系统调试和性能优化技巧的相关内容…

scala Map集合

一.Map的概述 Map是一种存储键值对的数据结构&#xff0c;Map中的键都是唯一的。 idea实例 二.Map的常见操作 idea实例 三.Map中的查询元素 idea实例 四.Map的常用方法 idea实例 五.Map的遍历 idea实例

Ubuntu学习笔记 - Day2

文章目录 学习目标&#xff1a;学习内容&#xff1a;学习笔记&#xff1a;Linux系统启动过程内核引导运行init运行级别系统初始化建立终端用户登录系统 Ubuntu关机关机流程相关命令 Linux系统目录结构查看目录目录结构 文件基本属性读写权限命令 下载文件的方法安装wget工具下载…

Rust 力扣 - 2841. 几乎唯一子数组的最大和

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口&#xff0c;用一个哈希表记录窗口内的所有元素&#xff08;用来对窗口内元素去重&#xff09;&#xff0c;我们取哈希表中元素数量大于等于m的窗口总和的最大值 题解代码 use std::coll…

从 vue 源码看问题 — vue 如何进行异步更新?

前言 在上一篇 如何理解 vue 响应式&#xff1f; 中&#xff0c;了解到响应式其实是通过 Observer 类中调用 defineReactive() 即 Object.defineProperty() 方法为每个目标对象的 key&#xff08;key 对应的 value 为非数组的&#xff09; 设置 getter 和 setter 实现拦截&…

[NewStarCTF 2023 公开赛道]逃1

代码审计. 这段代码分为三部分&#xff1a;1.war函数&#xff0c;2.GetFlag类&#xff0c;3.GetFlag类对象的定义&#xff0c;waf过滤以及反序列化 . 很经典的的一道题&#xff0c;键值对逃逸&#xff0c;改变cmd的value&#xff0c;去获取flag. 而war就是我们的突破点&#xf…

分享几个可以免费使用AI的网站

1、ChatGPT 自从用上GPT后&#xff0c;我的工作效率直接翻倍啊&#xff0c;不仅任务完成得更快&#xff0c;质量也更高。现在&#xff0c;我有更多的时间来享受生活&#xff0c;工作之余也能愉快地“摸鱼”&#xff0c;嘎嘎香嘞~ ⭐⭐ 点击直达 ​ 还有AI绘画可以体验喔~ 大…

lego-loam mapOptmization 源码注释(二)

看过了main函数&#xff0c;我们来看mapOptmization的正题&#xff1a; MO.run(); void run(){if (newLaserCloudCornerLast && std::abs(timeLaserCloudCornerLast - timeLaserOdometry) < 0.005 &&newLaserCloudSurfLast && std::abs(time…

【大数据学习 | kafka】producer之拦截器,序列化器与分区器

1. 自定义拦截器 interceptor是拦截器&#xff0c;可以拦截到发送到kafka中的数据进行二次处理&#xff0c;它是producer组成部分的第一个组件。 public static class MyInterceptor implements ProducerInterceptor<String,String>{Overridepublic ProducerRecord<…

基于Spring Boot的高校物品捐赠管理系统设计与实现,LW+源码+讲解

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装高校物品捐赠管理系统软件来发挥其高效地信息处理的作用&a…