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

news2024/11/19 5:57:10

文章目录

  • 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/194942.html

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

相关文章

WSL-Ubuntu 安装、移动

设置” 启用或者关闭Windows功能“&#xff0c;勾选如下选项。Hyper-v若存在灰色&#xff0c;可进入BIOS-Configuration&#xff0c;Intel Virtual Technology设置Enable重启2、安装Ubuntu3、移动。Ubuntu默认安装C盘。首先D盘创建移动的目录&#xff0c;例如&#xff1a;D:\Ub…

使用kubeadm搭建高可用k8s集群

使用kubeadm搭建高可用k8s集群方案选型高可用k8s集群部署准备工作服务器统一配置配置hostname打通ssh免密登录部署etcd集群step1 在master01上生成配置相关文件step2 每台服务器上启动etcd服务step3 检查etcd集群是否正常部署负载均衡 (haproxy keepalived)step1 下载haproxy与…

SAP 分析云 2023.012023.02 版新功能抢先看

大家新年好呀&#xff01;本年度的第一篇推文来啦~本文介绍了SAP 分析云2023.01&2023.02 版本的新功能。这些新功能已经在SAP 分析云FastTrack 客户的系统上线。对于 SAP 分析云季度发布周期 (QRC) 客户&#xff0c;此版本及其功能将作为 QRC 2023 年第1季度版本的一部分提…

[Android开发基础3] Activity的生命周期、创建与配置

文章目录 生命周期 概念 生命周期周期函数 创建Activity 方法一&#xff1a;编译器自动创建与配置 方法二&#xff1a;手动创建与配置 生命周期 概念 生命周期&#xff0c;顾名思义&#xff0c;就是当前的程序单元Activity从启动到销毁之间一系列所经过的状态。 生命周期周…

怎么画室内导航地图,室内地图绘制工具

现在很多楼宇建的越来越大&#xff0c;停车场、商场、展览馆、博物馆、交通枢纽等大型室内场景规模巨大、环境复杂&#xff0c;人们置身其中&#xff0c;一不小心就走错方向&#xff0c;从而多走很多弯路&#xff0c;费时费力。室内导航一直是导航场景的一大难题&#xff0c;如…

【redis6】第十四章(Redis集群)

问题 容量不够&#xff0c;redis如何进行扩容&#xff1f; 并发写操作&#xff0c;redis如何分摊&#xff1f; 另外&#xff0c;主从模式&#xff0c;薪火相传模式&#xff0c;主机宕机&#xff0c;导致ip地址发生变化&#xff0c;应用程序中配置需要修改对应的主机地址、端…

什么是Go语言?

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注&#xff01; 作者|慕课网精英讲师 Codey 1. Go 语言的出身 Go&#xff08;又称 golang&#xff09;是 Google 开发的一种静态强类型、编译型、并发型&#xff0c;并具…

OpenMMLab AI实战课笔记-第1节课

1. 第一节课&#xff08;课程链接&#xff09; 1.1 计算机视觉任务 计算机视觉主要实现以下目标&#xff1a; 分类目标检测分割&#xff1a;语义分割、实例分割 (对像素进行精确分类, 像素粒度或细粒度)关键点检测 1.2 OpenMMLab框架 框架选择&#xff1a;PyTorchOpenMML…

多级缓存案例说明

多级缓存案例说明1.安装MySQL1.1.准备目录1.2.运行命令1.3.修改配置1.4.重启2.导入SQL3.创建Demo工程3.1.分页查询商品3.2.新增商品3.3.修改商品3.4.修改库存3.5.删除商品3.6.根据id查询商品3.7.根据id查询库存3.8.启动4.创建商品查询页面4.1.运行nginx服务4.2.反向代理为了演示…

CSS网格教程:网格布局模块/网格容器/网格项目

目录 CSS 网格布局模块 网格布局 浏览器支持 网格元素 实例 Display 属性 实例 实例 网格列&#xff08;Grid Columns&#xff09; 网格行&#xff08;Grid Rows&#xff09; 网格间隙&#xff08;Grid Gaps&#xff09; 实例 实例 实例 实例 网格行&#xff0…

java基础面试题1

目录 Java语言有哪些特点 Java都有那些开发平台&#xff1f; Jdk和Jre和JVM的区别【重要】 面向对象和面向过程的区别 什么是数据结构&#xff1f;Java的数据结构有哪些&#xff1f; 1.数组&#xff1a; 2.队列 Queue 3.链表 Linked List 4.栈Stack 5.树Tree 什么是…

13薪|初级测试工程师

"众推职聘”以交付结果为宗旨的全流程化招聘服务平台&#xff01;今日招聘信息↓【工作内容】1、制定、编写软件测试方案与计划2、根据需求文档编写测试用例&#xff0c;组织测试用例评审3、按时完成软件测试工作任务&#xff0c;执行测试&#xff0c;跟踪缺陷状态&#x…

第十四章 集合(集合框架体系、List)

一、集合框架体系 &#xff08;1&#xff09;可以动态保存任意多个对象 &#xff08;2&#xff09;提供了一系列方便的操作对象的方法&#xff1a;add、remove、set、get等 集合框架体系&#xff1a; 二、Collection 1. Collection 接口常用方法 &#xff08;1&#xff09;add…

学习QCustomPlot【3】库结构

文章目录一、前言二、库结构三、图层3.1、坐标轴层一、前言 学习一个陌生的库&#xff0c;我们首先要明确它有什么用&#xff0c;可以结合库官方examples&#xff0c;学习怎么简单的用。 但是如果要对该库有一个全面的认识&#xff0c;还是需要了解它的开发思路和库结构。 例…

2、计算机视觉之图像分类算法基础(笔记)

什么是图像分类&#xff1f; 识别图像所表示内容的任务称为图像分类。我们可以对图像分类模型进行训练以识别各类图像。例如&#xff0c;您可以训练模型来识别表示三种不同类型动物的照片&#xff1a;兔子、仓鼠和狗。 下面几个神经网络重点关注准确率的问题 上图只是训练方式…

java—for结构

for循环语句1.1循环结构循环结构的组成&#xff1a;初始化语句条件判断语句循环体语句条件控制语句循环结构对应的语法&#xff1a;初始化语句条件判断语句循环体语句条件控制语句1.2for循环语句格式//格式 for (初始化语句;条件判断语句;条件控制语句){ 循环体语句; }执行流程…

记录每日LeetCode 环形链表II Java实现

题目描述&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xf…

06_PyTorch 模型训练[学习率与优化器基类]

当数据、模型和损失函数确定&#xff0c;任务的数学模型就已经确定&#xff0c;接着就要选择一个合适 的优化器(Optimizer)对该模型进行优化。 PyTorch 中所有的优化器(如&#xff1a;optim.Adadelta、optim.SGD、optim.RMSprop 等)均是 Optimizer 的子类&#xff0c;Optimizer…

STM32串口收发、串口中断、串口波特率的理解、普通IO模拟串口

STM32串口收发、串口中断一 、串口中断二、使用DMA三、串口波特率的理解开发环境&#xff1a;stm32cubuMax Keil5一 、串口中断 1.当收到消息的时候&#xff0c;立即进入控制程序,实现通过串口控制硬件&#xff1b; 2.在stm32cubeMax中配置串口 配置全局中断 2.在main函数中…

Django项目搭建_修改目录结构

1.安装环境 使用conda下载Django项目需要的依赖 pip install django2.2.6 -i https://pypi.douban.com/simple/pip install djangorestframework -i https://pypi.douban.com/simple/pip install PymySQL -i https://pypi.douban.com/simple/pip install Pillow -i https://p…