【数据结构】1.4 算法和算法分析

news2024/10/6 20:34:56

文章目录

  • 1. 算法的定义及特性
    • 算法的特性
    • 算法设计的要求
  • 2. 算法的时间复杂度
    • 分析算法时间复杂度的基本方法
    • 算法时间复杂度分析例题
    • 算法时间复杂度的计算
  • 3. 算法的空间复杂度

1. 算法的定义及特性

算法的定义

  • 对特定问题求解方法和步骤的一种描述,它是指令的有限序列,其中每个指令表表示一个或多个操作。
  • 简而言之:算法是解决问题的方法和步骤

在这里插入图片描述

算法的描述

  • 自然语言:英语、中文
    • 例如:算法,求一元二次方程的根,这个算法就能用文字描述出来。.
    • 这种方法描述起来就很麻烦了。

在这里插入图片描述

  • 流程图:传统流程图、NS 流程图。
    • NS 流程图比较简洁,更适合描述结构化的程序的算法。

在这里插入图片描述

  • 伪代码:类语言:类 C 语言。

算法与程序

  • 算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法。
  • 程序是用某种程序设计语言对算法的具体实现。
    • 程序 = 数据结构 + 算法
    • 数据结构通过算法实现操作。
    • 算法根据数据结构设计程序。

算法的特性

一个算法必须具备一下五个重要特性

  1. 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
  2. 确定性:算法中的每一条指令必须有确切的含义,没有二义性,在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出。
  3. 可行性:算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现。
  4. 输入:一个算法有零个或多个输入,算法可以没有输入。
  5. 输出:一个算法有一个或多个输出,算法必须要有输出。

算法设计的要求

  • 正确性:算法满足问题的要求,能正确解决问题,算法转化为程序后要注意:
    1. 程序中不含语法错误
    2. 程序对于几组输入数据能够得出满足要求的结果;
    3. 程序对于精心选择的、典型、苛刻且带有刁难性的几组输入数据能够得出满足要求的结果;
    4. 程序对于一切合法的输入数据都能得出满足要求的结果。
  • 可读性
    1. 算法主要是为了人的阅读和交流,其次才是为计算机执行,因此算法应该易于人的理解;
    2. 另一方面,晦涩难懂的算法容易隐藏较多的错误而难以调试。
  • 健壮性
    1. 指当输入非法数据时,算法恰当的做出反应或进行相应处理,而不是产生莫名其妙的输出结果。
    2. 处理出错的方法,不应该是中断程序的执行,而应该是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。
  • 高效性:要求花费尽量少的时间和尽量低的空间。

评价算法优劣的基本标准

  • 一个好的算法首先要具备正确性,然后是健壮性、可读性,在几个方面都满足的情况下,主要考虑算法的效率,通过算法的效率高低来评判不同算法的优劣程度
  • 算法效率从以下两个方面开考虑:
    1. 时间效率:指的是算法所耗费的时间
    2. 空间效率:指的是算法执行过程中所耗费的存储空间
    • 时间效率和空间效率有时候是矛盾的。

2. 算法的时间复杂度

算法时间效率的度量

  • 算法时间效率可以用依据该算法编制的程序在计算机上执行所消耗的时间来度量。
  • 两种度量方法:
    • 事后统计
      • 将算法实现,测算其时间和空间开销。
      • 缺点:编写程序实现算法将花费较多的时间和经历;所得到的实验结果依赖于计算机的软硬件等环境因素,掩盖算法本身的优劣。
    • 事前分析
      • 对算法所消耗资源的一种估算方法。

事前分析方法

  • 一个算法的运行时间是指一个算法在计算机上运行所耗费的时间大致可以等于计算机执行的一种简单的操作(如:赋值、比较、移动等)所需要的时间与算法中进行的简单操作次数乘积
    • 算法运行时间 = 一个简单操作所需的时间 x 简单操作次数
  • 也即算法中每条语句的指向时间之和
    • 算法运行时间 = ∑ 每条语句的执行次数 x 该语句执行一次所需要的时间
    • 其中,每条语句的执行次数称为语句频度
  • 每条语句执行一次所需要的时间,一般随机器而异。取决于机器的指令性能,速度以及编译的代码质量。是由机器本身软硬件环境决定的,它与算法无关。
  • 所以,可以假设执行每条语句所需的时间单位均为单位时间。此时对对算法的运行时间的讨论就可转化为讨论该算法中所有语句的执行次数,即频度之和

举个例子:两个 n x n 矩阵相乘的算法可描述为

在这里插入图片描述

  • 将所有语句的执行次数相加
  • 把算法耗费的时间定义为该算法中每条语句的频度之和,则上述算法的时间消耗为 T(n) 为:T(n) = 2n3 + 3n2 + 2n + 1

算法时间复杂度的渐进表示法

  • 为了便于比较不同算法的时间效率,我们仅比较它们的数量级(抓次方最大的)。
    • 例如:两个不同的算法,时间消耗分别是:T₁(n) = 10n2 与 T₂(n) = 5n3 。数量级(次方)越大的越不好。
  • 若有某个辅助函数 f(n),使得当 n 趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称 f(n) 是 T(n) 的同数量级函数。记作 T(n) = O(f(n)),成 O(f(n)) 为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度

对于求解矩阵相乘问题,算法耗费时间为:

在这里插入图片描述

  • 一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作执行的次数,它是问题规模 n 的某个函数,用 T(n) 表示。

算法时间复杂度定义

  • 算法中基本语句重复执行的次数问题规模 n 的某个函数 f(n)没算法的时间量度记作:T(n) = O(f(n))
  • 它表示随着 n 的增大,算法执行的时间增长率和 f(n) 的增长率相同,成为渐进时间复杂度

在这里插入图片描述

分析算法时间复杂度的基本方法

  1. 找出语句频度最大(执行次数最多)的那条语句作为基本语句
  2. 计算基本语句(执行多少次)的频度得到问题规模 n 的某个函数 f(n);
  3. 取其数量级用符号 “O” 表示。(函数 f(n) 抓大头,并且去掉大头的系数,剩下的就是数量级)。

举个例子

在这里插入图片描述

int x = 0,y = 0;//执行1次
for(int k = 0;k < n;k++)//这条for语句执行n + 1次
{
		x++ ;//这个循环体执行n次
}
for(int i = 0;i < n;i++)//执行n + 1次
{
		for(int j = 0;j < n;j++)//外层循环每执行1次这个for循环就要执行n + 1次
                                //所以这个for循环要执行 n * (n + 1)次
		{
                y++ ;//执行n * n 次
        }
  • 循环体中,嵌套层次最深的,往往就是执行次数最多的语句。
  • 所以这段代码执行次数最多的是函数f(n)=n * (n+1) 次。
  • 抓大头之后,这段代码的数量级就是 n2,时间复杂度就是T(n) = O (n2)

算法时间复杂度分析例题

  • 时间复杂度是由嵌套最深层的语句的频度决定的

例1

在这里插入图片描述

  1. 直接先找嵌套最深层的语句。
  2. 外层循环从 0 到 m-1 执行 m 次,内层循环从 0 到 n-1 执行 n 次。外层循环每执行一次,内部循环就要执行 n 次,外面的循环总共执行了 m 次,那么总共就执行了 n * m次。
  3. 构造的函数就是 f(n) = m * n,这个函数的数量级就是 T(n) = O(m * n)。

例2】:N x N 矩阵相乘

在这里插入图片描述

  1. 去找执行次数最多的语句。
  2. 这条语句的循环次数采用瞪眼法可知为 n * n * n 次。
  3. 可知算法的时间复杂度为:T(n) = O(n3)。

在这里插入图片描述

例3

在这里插入图片描述

  1. 找到执行次数最多的语句:x = x + 1
  2. 这条最深层循环内的基本语句的频度,依赖于各层循环变量的取值,由内向外可分析出 x = x + 1 的执行次数为:

在这里插入图片描述

  1. 则该算法的时间复杂度为 T(n) = O(n3),称为立方阶

例4

在这里插入图片描述

  1. 找执行次数最多语句:i = i * 2
  2. 找出函数 f(n):
    • 若循环执行 1 次:i = 1 * 2 = 21
    • 若循环执行 2 次:i = 2 * 2 = 22
    • 若寻欢执行 3 次:i = 4 * 2 = 23
    • 若循环执行 x 次:i = 2x
    • 假设语句 2 执行次数为 x 次,由循环条件 i <= n可知,2x <= n,所以 x <= log₂n
  3. 取 f(n) <= log₂n,取最大值 f(n) = log₂n,所以该程序段的时间复杂度 T(n) = O(log₂n)

算法时间复杂度的计算

  • 在有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同。

在这里插入图片描述

  • 最好的情况是第一个元素就是要查找的元素,最坏则是最后一个元素,循环体执行的次数和 e 实际放的位置有关。
  • 平均时间复杂度为:O(n)。

在这里插入图片描述

考虑算法的时间复杂度时还应考虑

  • 最坏时间复杂度:指在最坏情况下,算法的时间复杂度。
  • 平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
  • 最好时间复杂度:指在最好情况下,算法的时间复杂度。
    • 一般总是在考虑最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。

简便表示函数数量级

  • 对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大 O 加法法则和乘法法则,计算算法的时间复杂度:
    • 加法规则:如果函数可能分成两个函数,那么就分别求解这两个函数的数量级,然后求这两个函数之间数量级的最大值。
    • 乘法法则:分成两个稍微简单点的函数,然后求这两个函数的数量级的乘积,乘积结果就是整个函数的数量级。

算法时间效率的比较

  • 当 n 取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊。
  • 在设计算法的时候,尽量设计时间复杂度低的。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. 算法的空间复杂度

  • 空间复杂度:算法所需要的存储空间的度量,
    • 记作:S(n) = O(f(n))
    • 其中 n 为问题的规模(或大小)。
  • 算法所要占据的空间:
    • 算法本身要占据的空间,输入/输出,指令,常数,变量等。
    • 算法要使用的辅助空间

算法空间复杂度分析例题

【例1】将一维数组 a 中的 n 个数逆序存放到原数组中。

在这里插入图片描述

  • 算法1:

    • 让第一个和最后一个交换,让第二个和导数第二个进行交换,依次类推。
    • 这个时候总共需要交换一半(n / 2)的元素。
    • S(n) = O(1):原地工作。

在这里插入图片描述

  • 算法2:
    • 有两个数组,a、b,将 a 数组中的元素从最后一个开始依次放到 b 数组中。
    • 将 a 数组中的元素逆序放到 b 中后,还需要放回原来的数组 a 中。
    • S(n) = O(n):a 数组有多大,作为辅助空间的 b 数组就得有多大。

在这里插入图片描述

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

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

相关文章

C++:String类应用

string对象的构造 //string() string(const string &s) string(const char *s) string(first,last) void TestString01() {string s1;string s2("hello");string s3(s2);const char* p "hello";string s4(p, p 2);cin >> s1;cout << …

微信小程序 Springboot旅游景点酒店预订管理系统 java

功能模块划分 &#xff08;1&#xff09;用户信息管理模块 用户管理模块主要是对用户信息进行管理。包括&#xff1a; 用户的注册&#xff1a;实现用户信息的注册&#xff0c;用户注册是的信息校验&#xff0c;用户信息的保存。 用户的登录&#xff1a;检验用户是否为该网站的合…

如何打造优秀高绩效的团队?Google亚里士多德计划揭开谜底!

研究人员通过亚里士多德计划开展研究&#xff0c;通过对大量团队效率进行定性&#xff08;360主观评估&#xff09;与定量&#xff08;产出成果度量&#xff09;结合的统计评估&#xff0c;筛选出左右着团队动态的五个关键支柱&#xff1a;心理安全、可靠性、结构和清晰度、意义…

Nginx与Upstream之间产生大量TIME_WAIT连接的解决办法

1. 现象 Nginx反向代理了一个Java服务&#xff0c;QPS大概是200&#xff0c;问题发生时的Nginx配置&#xff1a; location / {proxy_pass http://192.168.3.4:18600; }在上游Java服务器上可以观察到大量&#xff08;约2000个&#xff09;的TIME_WAIT状态的网络连接 从Nginx…

一位十年测试老前辈的修炼之路,希望能帮你点清现实

对于刚进入软件测试工作岗位的新人&#xff0c;如何快速、健康的在职业道路上成长&#xff0c;作者谈了几点自己看法&#xff1a; 1、兴趣是最好的老师 对于软件测试工作&#xff0c;通常是比较枯燥的&#xff0c;如果没有兴趣很难做到持久。 我最近参与了一个软件测试项目&a…

Plecs电力电子仿真专业教程-第一季 第三节 Plecs界面介绍

Plecs电力电子仿真专业教程-第一季 第三节 Plecs界面介绍 Plecs仿真软件主要包含两个部分&#xff1a;元件库窗口和电路图编辑窗口。元件库窗口主要用于选择仿真所用到的电子元器件&#xff0c;通过拖拽的方式可以将所需要的元器件放置在主电路图窗口中。 主界面窗口如下&…

网络类型、路由封装实验

实验1. 拓扑搭建2. 配置各路由器物理接口IP地址边界路由器到ISP通测试PAP认证CHAP认证R3与R5间使用HDLC封装R1与R4为GRE环境R1、R2、R3为MGRE环境私有网络基于RIP全网可达给PC配置IP地址测试ping通性环境&#xff1a;华为模拟器 实验要求 1. 拓扑搭建 2. 配置各路由器物理接口…

【目标检测】MMYOLO | 如何使用 MMYOLO 训练模型

文章目录一、MMYOLO 简介1.1 MMYOLO 的安装和简单训练1.2 详细配置参数1.3 构建 Cat 数据集的 Config 文件1.3.1 数据集分布可视化1.3.2 Anchor-based 方法中 anchor 尺寸的优化1.3.3 可视化数据处理二、MMYOLO 的框架结构2.1 以 YOLOv5 为例来说明 MMYOLO 的框架结构2.1.1 Bac…

AcWing 1077. 皇宫看守(树形DP + 状态机DP)

AcWing 1077. 皇宫看守&#xff08;树形DP 状态机DP&#xff09;一、问题二、分析1、思路分析2、状态表示3、状态转移4、循环设计5、初末状态三、代码一、问题 二、分析 1、思路分析 在讲解这道题之前&#xff0c;大家需要对状态机DP有一定的了解&#xff0c;如果不了解或者…

2022尚硅谷SSM框架跟学(九)Spring MVC基础四

2022尚硅谷SSM框架跟学 九 Spring MVC基础四14.SpringMVC执行流程14.1SpringMVC常用组件14.2DispatcherServlet初始化过程(Init)(1).初始化WebApplicationContext(2).创建WebApplicationContext(3).DispatcherServlet初始化策略14.3DispatcherServlet调用组件处理请求(Service)…

CentOS环境安装ffmpeg

这是我在网上搜罗的方法&#xff0c;亲测好用 &#xff0c;借此写篇文章&#xff0c;分享给大家。温馨提示&#xff1a;安装ffmpeg过程会很慢&#xff0c;因为它集成的功能太多了&#xff0c;所以在安装过程中不必长时间等待&#xff0c;执行命令后可暂时先去忙别的事&#xff…

Unity URP无法设置Transparency Sort Mode

Unity URP无法设置Transparency Sort Mode问题解决方案参考问题 一般使用Unity制作2D游戏时会将Transparency Sort Mode设置为Custom Axis并将Transparency Sort Axis设置为0,1,0来方便Spirte排序 但是当渲染管线切换为Universal Render Pipeline(通用渲染管线)时 Transpare…

JAVA将百万级数据高效的导出到EXCEL表单

遇到的问题 1.list集合太大&#xff0c;触发oom 2.导出excel数据量太大内存占满&#xff0c;没输出到硬盘前已经出发oom 接下来尝试用poi解决 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version&…

如何在Exchange Online中使用使用反垃圾邮件策略将域列入白名单

将域列入白名单 打开安全门户单击威胁策略单击反垃圾邮件策略单击反垃圾邮件入站策略(默认)单击“允许域”Exchange Online已启用默认的反垃圾邮件策略。策略的名称为Default。不建议使用这些电子邮件,因为它们会使你的组织容易受到来自该域或发件人的欺骗电子邮件的攻击。我…

【环境配置】在Ubuntu中使用Docker20.10.23配置FATE1.10.0(单机部署)

前言 本文讲解了在Ubuntu22中使用Docker20配置FATE1.10.0的方法 分为官方文档与我自己的实际操作两个部分 需要先安装docker&#xff0c;可以看我的上一篇文章 安装流程前言一、FATE单机部署指南&#xff08;官方&#xff09;1. 说明2. 使用Docker镜像安装FATE&#xff08;推荐…

Maven(mvn)基础

Maven&#xff08;mvn&#xff09;基础 文章目录Maven&#xff08;mvn&#xff09;基础传统项目管理状态分析Maven是什么Maven的作用下载与安装1.下载安装2.环境变量配置Maven基础概念仓库坐标本地仓库配置全局setting与用户setting第一个Maven项目(手动)Maven工程目录结构Mave…

蓝桥杯-长草

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 已知一个长度为n&#xff0c;宽度为m的长方形草地&#xff0c;但不是每一个方格里面都长满了草&#xff0c;只有部分的方格张了些草。并且每个月草会向上下左右都繁殖一个…

Linux中MMU内存管理【进阶学习】

前言 现代操作系统普遍采用虚拟内存管理&#xff08;Virtual Memory Management&#xff09;机制&#xff0c;这需要处理器中的MMU&#xff08;Memory Management Unit&#xff0c;内存管理单元&#xff09;提供支持。 MMU&#xff08;Memory Management Unit) &#xff1a;内…

微信小程序023安全科普之家在线考试错题集

开发语言&#xff1a;Java 小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 后端技术:Ssm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 本系统设计的是一个“科普之家”知识在线考试小程序的网站&#xff0c;此网站使用户实…

计算机网络基础知识点

计算机网络基础知识点计算机网络1、概述1.1 计算机网络基本概念1.2 互联网核心部分:数据交换1.3 计算机网络的性能指标1.4 计算机网络体系结构2、物理层2.1 物理层基本概念2.2 数据通信系统模型2.3 数据编码技术2.4 信道复用技术3、数据链路层3.1 概述3.2 PPP协议3.3 CSMA/CD3.…