数据结构-算法和算法分析

目录

  • 前言
  • 一、算法
    • 1.1 算法与程序
    • 1.2 算法描述方法
    • 1.3 算法特性
    • 1.4 算法设计的要求
  • 二、算法分析
    • 2.1 算法时间效率的度量
      • 2.1.1 事前分析方法
        • 算法的渐进时间复杂度
        • 算法时间复杂度分析例子
        • 算法最坏时间复杂度
        • 时间复杂度的计算规则
    • 2.2 算法空间效率的度量
  • 总结

前言

程序 = 数据结构+算法
数据结构通过算法实现操作
算法根据数据结构设计程序

一、算法

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

1.1 算法与程序

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

1.2 算法描述方法

  • 自然语言:中文、英语等
  • 流程图:传统流程图、NS流程图(盒图)等
  • 伪代码:类C语言(类语言)等
  • 程序代码:C语言程序、JAVA语言程序等

1.3 算法特性

  • 有穷性
    一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成
  • 确定性
    在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出
  • 可行性
    算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现
  • 输入
    一个算法有零个或多个输入
  • 输出
    一个算法有一个或多个输出

1.4 算法设计的要求

  • 正确性(Correctness)
    如果一个算法以一组满足初始条件的输入开始,那么该算法的执行一定会终止,并且在终止时得到满足要求的输出
  • 可读性(Readability)
    一个算法的描述应该是便于人的阅读,以便于人对算法的理解
  • 健壮性(Robustness)
    算法的健壮性也叫鲁棒性,指当输入不合法的数据时,算法恰当地作出反应。
    处理出错的方法,不应是中断程序的执行,而是应该返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。
  • 高效性(Efficiency)
    要求花费尽量少的运行时间和存储空间

二、算法分析

一个好的算法首先要具备正确性,然后是健壮性,可读性,在几个方面都满足的情况下,主要考虑算法的效率,通过算法的效率高低来评判对同一个问题的不同算法的优劣程度
算法效率包含时间效率空间效率
时间效率:指的是算法执行完成后所耗费的时间
空间效率:指的是算法执行过程中所耗费的存储空间

有时候,算法的时间效率和空间效率两者之间会出现矛盾,不能既要时间效率,又要空间效率。所以,有些情况需要用时间效率换空间效率,还有些情况需要用空间效率换时间效率。
下面,分别介绍如何分析一个算法的时间效率和空间效率

2.1 算法时间效率的度量

度量算法的时间效率的方法包含以下两种:

  • 事后统计
    事后统计是指将算法使用程序设计语言实现后运行,统计其时间和空间的开销
  • 事前分析
    事前分析是指对算法所消耗的资源按照某种方法进行估算

由于事后统计这个度量方法需要编写程序实现算法,所得统计结果依赖于计算机的软硬件等环境因素,掩盖算法本身的优劣。所以,采用事前分析这个度量方法进行算法时间效率的分析。

2.1.1 事前分析方法

一个算法的运行时间是指一个算法在计算机上运行所耗费的时间大致可以等于计算机执行一种简单操作所需的时间与算法中进行简单操作次数的乘积
算法运行时间 = ∑每条语句的执行次数×该语句执行一次所需的时间
语句的执行次数又称为语句频度
每条语句执行一次所需时间,一般随机器而异。取决于机器的指令性能、速度以及编译的代码质量。是由机器本身软硬件环境决定的,与算法无关。
所以,假设执行每条语句所需的时间均为单位时间。那么对算法的运行时间的讨论就可以转化为讨论该算法中所有语句的执行次数,即频度之和。通过这样,就可忽略机器的软硬件环境。

根据以上,可得出算法运行时间 = ∑每条语句的频度

例子,两个n×n矩阵相乘的算法可描述为(类C语言描述):

for(i = 1; i <= n; i++)  								//n+1次for(j = 1; j <= n; j++){							//n*(n+1)次c[i][j] = 0;									//n*n次for(k = 0; k < n; k++)							//n*n*(n+1)次c[i][j] = c[i][j] + a[i][k] * b[k][i];		//n*n*n次}		

算法所耗费的时间定义为该算法每条语句频度之和,则上述算法的时间消耗为:
T ( n ) = n + 1 + n ∗ ( n + 1 ) + n ∗ n + n ∗ n ∗ ( n + 1 ) + n ∗ n ∗ n T(n) = n+1+n * (n+1)+n * n+n * n * (n+1)+n * n * n T(n)=n+1+n(n+1)+nn+nn(n+1)+nnn
整理得 T ( n ) = 2 n 3 + 3 n 2 + 2 n + 1 T(n) = 2n^3 +3n^2+2n+1 T(n)=2n3+3n2+2n+1
为了便于比较不同算法的时间效率,这里仅仅比较不同算法的数量级,即算法的渐进时间复杂度

算法的渐进时间复杂度

若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,即
T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))
O ( f ( n ) ) O(f(n)) O(f(n))为算法的渐进时间复杂度( O O O是数量级的符号),简称时间复杂度

那么,根据算法的渐进时间复杂度的定义,对于求解矩阵相乘问题,算法耗费时间:
T ( n ) = 2 n 3 + 3 n 2 + 2 n + 1 T(n)=2n^3+3n^2+2n+1 T(n)=2n3+3n2+2n+1
n → ∞ {n \to \infty} n时, T ( n ) / n 3 → 2 {T(n)/n^3 \to 2} T(n)/n32,那么, T ( n ) 和 n 3 T(n)和n^3 T(n)n3是同阶或同数量级,引入大 O O O记号,则 T ( n ) T(n) T(n)可记作:
T ( n ) = O ( n 3 ) T(n)=O(n^3) T(n)=O(n3)
O ( n 3 ) O(n^3) O(n3)就是求解矩阵相乘问题的算法的渐进时间复杂度。
一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作执行的次数,它是问题规模n的某个函数,用f(n)表示
算法中基本语句重复执行的次数问题规模n的某个函数f(n),算法的时间度量记作: T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))
基本语句:执行次数最多
问题规模n在不同的问题中,表示的意义不同
排序问题:问题规模n表示记录数
矩阵问题:问题规模n表示矩阵的阶数
多项式问题:问题规模n表示多项式的项数
集合问题:问题规模n表示元素的个数
树问题:问题规模n表示树的结点个数
图问题:问题规模n表示图的顶点数或边数

算法时间复杂度分析例子

定理1.1
f ( n ) = a m n m + a m − 1 n m − 1 + . . . + a 1 n + a 0 f(n)={a_m}{n^m}+a_{m-1}{n^{m-1}}+...+{a_1}{n}+{a_0} f(n)=amnm+am1nm1+...+a1n+a0是m次多项式, T ( n ) = O ( n m ) T(n)=O(n^m) T(n)=O(nm)
忽略所有低次幂项和最高次幂系数

分析算法时间复杂度的基本步骤
step1:找出语句频度最大的那条语句作为基本语句
step2:计算基本语句的频度得到问题规模n的某个函数 f ( n ) f(n) f(n)
step3:取 f ( n ) f(n) f(n)数量级用符号 O O O表示

例子1

for(i = 1; i <= n; i++)for(j = 1; j <= i; j++)for(k = 1; k <= j; k++)x = x + 1;

x = x + 1 x=x+1 x=x+1作为基本语句,则其 f ( n ) f(n) f(n)
f ( n ) = ∑ i = 1 n ∑ j = 1 i ∑ k = 1 j 1 = ∑ i = 1 n ∑ j = 1 i j = ∑ i = 1 n i ( i + 1 ) 2 = 1 2 ( ∑ i = 1 n i 2 + ∑ i = 1 n i ) = 1 2 ( n ( n + 1 ) ( 2 n + 1 ) 6 + n ( n + 1 ) 2 ) = n ( n + 1 ) ( n + 2 ) 6 \begin{aligned} f(n) ={\overset{n}{\underset{i=1}{\sum}}}{\overset{i}{\underset{j=1}{\sum}}}{\overset{j}{\underset{k=1}{\sum}}}1 ={\overset{n}{\underset{i=1}{\sum}}}{\overset{i}{\underset{j=1}{\sum}}}j &={\overset{n}{\underset{i=1}{\sum}}} \frac{i(i+1)}{2}\\ &=\frac{1}{2} ({\overset{n}{\underset{i=1}{\sum}}}i^2+{\overset{n}{\underset{i=1}{\sum}}}i)\\ &=\frac{1}{2}(\frac{n(n+1)(2n+1)}{6}+\frac{n(n+1)}{2})\\ &=\frac{n(n+1)(n+2)}{6} \end{aligned} f(n)=i=1nj=1ik=1j1=i=1nj=1ij=i=1n2i(i+1)=21(i=1ni2+i=1ni)=21(6n(n+1)(2n+1)+2n(n+1))=6n(n+1)(n+2)
综上, T ( n ) = O ( n 3 ) T(n)=O(n^3) T(n)=O(n3)

例子2

i = 1;
while(i <= n)i = i*2;

i = i ∗ 2 i=i*2 i=i2作为基本语句,则 f ( n ) f(n) f(n)
若循环执行1次: i = 1 ∗ 2 = 2 i=1*2=2 i=12=2
若循环执行2次: i = 2 ∗ 2 = 2 2 i=2*2=2^2 i=22=22
若循环执行3次: i = 3 ∗ 2 = 2 3 i=3*2=2^3 i=32=23,…,
若循环执行x次: i = 2 x i=2^x i=2x
设基本语句执行x次,由循环条件 i < = n i<=n i<=n ∴ 2 x < = n ∴ x < = log ⁡ 2 n \therefore2^x<=n \therefore x<=\log_2n 2x<=nx<=log2n
2 f ( n ) < = n , 即 f ( n ) < = log ⁡ 2 n ,取最大值 f ( n ) = log ⁡ 2 n 2^{f(n)}<=n,即f(n)<=\log_2n,取最大值f(n)=\log_2n 2f(n)<=n,f(n)<=log2n,取最大值f(n)=log2n
综上, T ( n ) = O ( log ⁡ 2 n ) T(n)=O(\log_2n) T(n)=O(log2n)

算法最坏时间复杂度

有的情况下,算法中基本操作重复执行的次数还随着输入数据集不同而不同。
例如,在一个数组中顺序查找一个数e,返回其位置

for(i = 0; i < n; i++)if(e == a[i])return i;return -1;		

最好情况:循环遍历1次
最坏情况:循环遍历n次
平均时间复杂度: O ( n ) O(n) O(n)

最好时间复杂度:指在最好情况下,算法的时间复杂度
最坏时间复杂度:指在最坏情况下,算法的时间复杂度
平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间

一般情况下,总是考虑最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。

时间复杂度的计算规则

对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大 O O O加法规则和乘法规则,计算算法的时间复杂度

  • 加法规则
    T ( n ) = T 1 ( n ) + T 2 ( n ) = O ( f 1 ( n ) ) + O ( f 2 ( n ) ) = O ( m a x ( f 1 ( n ) , f 2 ( n ) ) ) T(n)=T_1(n)+T_2(n)=O(f_1(n))+O(f_2(n))=O(max(f_1(n),f_2(n))) T(n)=T1(n)+T2(n)=O(f1(n))+O(f2(n))=O(max(f1(n),f2(n)))
    这里的 m a x ( f 1 ( n ) , f 2 ( n ) ) 表示当 n → ∞ 时,取函数值较大的那个函数 max(f_1(n),f_2(n))表示当n \to \infty时,取函数值较大的那个函数 max(f1(n),f2(n))表示当n时,取函数值较大的那个函数
    常见的函数大小关系如下:
    O ( 1 ) < O ( l o g 2 n ) < O ( n ) < O ( n l o g 2 n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) O(1)<O(log_2n)<O(n)<O(nlog_2n)<O(n^2)<O(n^3)<O(2^n) O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)
  • 乘法规则
    T ( n ) = T 1 ( n ) × T 2 ( n ) = O ( f 1 ( n ) ) × O ( f 2 ( n ) ) = O ( f 1 ( n ) × f 2 ( n ) ) T(n)=T_1(n)\times T_2(n)=O(f_1(n))\times O(f_2(n))=O(f_1(n)\times f_2(n)) T(n)=T1(n)×T2(n)=O(f1(n))×O(f2(n))=O(f1(n)×f2(n))

2.2 算法空间效率的度量

算法空间效率的度量使用渐进空间复杂度进行分析
空间复杂度:算法所需存储空间的度量,记作 S ( n ) = O ( f ( n ) ) S(n)=O(f(n)) S(n)=O(f(n))
其中,n为问题规模
算法要占据的空间:

  1. 算法本身要占据的空间,输入/输出,指令,常数,变量等
  2. 算法要使用的辅助空间

例子
将一个一维数组a中的n个数逆序存放到原数组中
算法1

//利用辅助空间变量t
for(i = 0; i < n/2; i++)
{t = a[i];a[i] = a[n-i-1];a[n-i-1] = t
}

空间复杂度 S ( n ) = O ( 1 ) S(n)=O(1) S(n)=O(1)
算法2

//利用辅助空间数组b[]
for(i = 0; i < n; i++)b[i] = a[n-i-1];
for(i = 0; i < n; i++)a[i] = b[i]	

空间复杂度 S ( n ) = O ( n ) S(n)=O(n) S(n)=O(n)

总结

在这里插入图片描述

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

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

相关文章

docker回顾--docker compose详细解释,安装,与常用命令

文章目录 Docker compose简介什么是Docker compose核心概念优势 安装常用命令总结 Docker compose简介 什么是Docker compose Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。它使得开发者可以使用一个单独的 YAML 文件来定义应用所需的所有服务、网络和卷&a…

发力采销,京东的“用户关系学”

作者 | 曾响铃 文 | 响铃说 40多岁打扮精致的城市女性&#xff0c;在西藏那曲的偏远农村&#xff0c;坐着藏民的摩托车&#xff0c;行驶在悬崖边的烂泥路上&#xff0c;只因为受顾客的“委托”&#xff0c;要寻找最原生态的藏区某款产品。 30多岁的憨厚中年男性&#xff0c;…

HTTP学习记录(基于菜鸟教程)

文章目录 1.简介1.1常用的HTTP方法1.2Http版本1.3注意事项 2.Https3.Http消息结构3.1客户端请求消息3.2响应消息 4.常见的响应头5.HTTP状态码6.Http content-type在这里插入图片描述 7.MIME类型8.HTTP2 1.简介 Http&#xff0c;被称为超文本传输协议&#xff0c;HyperText Tran…

mfc140.dll电脑文件丢失的处理方法,这4种方法能快速修复mfc140.dll

mfc140.dll文件是一个非常重要的dll文件&#xff0c;如果它丢失了&#xff0c;那么会严重的影响程序的运行&#xff0c;这时候我们要找方法去修复mfc140.dll这个文件&#xff0c;那么你知道怎么修复么&#xff1f;如果不知道&#xff0c;那么不妨看看下面的mfc140.dll文件丢失的…

海豚调度异常处理: 使用 arthas 在内存中删除启动失败的工作流

&#x1f4a1; 本系列文章是 DolphinScheduler 由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。祝开卷有益。大数据学习指南 大家好&#xff0c;我是小陶&#xff0c;DolphinSch…

晨持绪科技:抖音小店的前景究竟怎么样

随着移动互联网的迅猛发展&#xff0c;短视频平台快速崛起并逐渐成为人们日常生活中不可或缺的一部分。作为国内领先的短视频平台&#xff0c;抖音在近年推出了“抖音小店”功能&#xff0c;为商家提供了一个新兴的、流量巨大的电商渠道。这一功能的推出不仅改变了传统的购物方…

RabbitMQ安装配置,封装工具类,发送消息及监听

1. Get-Started docker安装rabbitmq 拉取镜像 [rootheima ~]# docker pull rabbitmq:3.8-management 3.8-management: Pulling from library/rabbitmq 7b1a6ab2e44d: Pull complete 37f453d83d8f: Pull complete e64e769bc4fd: Pull complete c288a913222f: Pull complet…

AI视频智能监管赋能城市管理:打造安全有序的城市环境

一、方案背景 随着城市化进程的加速和科技的飞速发展&#xff0c;街道治安问题日益凸显&#xff0c;治安监控成为维护社会稳定和保障人民安全的重要手段。当前&#xff0c;许多城市已经建立了较为完善的治安监控体系&#xff0c;但仍存在一些问题。例如&#xff0c;监控设备分…

ADS1220芯片写寄存器失败

1&#xff09;场景&#xff1a;最近调试ADS1220 的芯片&#xff0c;需要读取不同通道的AD值&#xff0c;修改寄存器0的值时一直失败 但是在单片机启动时&#xff0c;写寄存器0时&#xff0c;值能正确写入&#xff0c;并正确读出&#xff0c;之后写完读取出的都是FF或其他异常值…

新渠道+1!TDengine Cloud 入驻 Azure Marketplace

近日&#xff0c;TDengine Cloud 正式入驻微软云 Marketplace&#xff0c;为全球更多用户带来全托管的时序数据处理服务。这一举措也丰富了 TDengine 的订阅渠道&#xff0c;为用户提供了极大的便捷性。现在&#xff0c;您可以通过微软云 Marketplace 轻松订阅并部署 TDengine …

电影美学复古胶片特效视频转场模板 | Premiere Pro 项目工程文件

这个Premiere Pro项目工程文件是一个电影美学胶片特效视频转场模板&#xff0c;每个过渡效果都散发出一种有机的怀旧魅力&#xff0c;让人回忆起经典电影卷轴和模拟摄影的独特美感。 项目特点&#xff1a; 胶片烧伤过渡效果&#xff1a;包括从微妙的闪烁到大胆的爆发&#xff…

VMware虚拟机三种网络模式设置 - Bridged(桥接模式)

一、前言 由于linux目前很热门&#xff0c;越来越多的人在学习linux&#xff0c;但是买一台服务放家里来学习&#xff0c;实在是很浪费。那么如何解决这个问题&#xff1f;虚拟机软件是很好的选择&#xff0c;常用的虚拟机软件有vmware workstations和virtual box等。 在使用虚…

10 种语言文本准确渲染;Mac无需联网的本地聊天应用;多模态语言模型(MLM)基准测试的引擎;Yolo DotNet版本

✨ 1: Glyph-ByT5 10 种语言文本准确渲染&#xff0c;将文本渲染的准确性从提高到近 90% &#xff0c;同时还能实现段落渲染自动布局 Glyph-ByT5是一种定制的文本编码器&#xff0c;旨在实现准确的文字视觉渲染。其核心思想是通过细致的字形-文本配对数据集的微调&#xff0c…

JWT整合Gateway实现鉴权(RSA与公私密钥工具类)

一.业务流程 1.使用RSA生成公钥和私钥。私钥保存在授权中心&#xff0c;公钥保存在网关(gateway)和各个信任微服务中。 2.用户请求登录。 3.授权中心进行校验&#xff0c;通过后使用私钥对JWT进行签名加密。并将JWT返回给用户 4.用户携带JWT访问 5.gateway直接通过公钥解密JWT进…

最好用的智能猫砂盆存在吗?自用分享智能猫砂盆测评!

在现代都市的忙碌生活中&#xff0c;作为一名上班族&#xff0c;经常因为需要加班或频繁出差而忙碌得不可开交。急匆匆地出门&#xff0c;却忘了给猫咪及时铲屎。但是大家要知道&#xff0c;不及时清理猫砂盆会让猫咪感到不适&#xff0c;还会引发各种健康问题&#xff0c;如泌…

「6.18更新日志」JVS·智能BI、规则引擎功能更新说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架&#xff0c;主要解决企业信息化项目交付难、实施效率低、开发成本高的问题&#xff0c;采用微服务配置化的方式&#xff0c;提供了 低代码数据分析物联网的核心能力产品&#xff0c;并构建了协同办公、企业常用的管理工具等&am…

从视频创意到传播策略 | 医药产品TVC新媒体传播方案

作为营销策划人&#xff0c;你一定在寻找能够激发创意灵感、拓展策划视野的实战案例。这份最新传播方案由Unithought精心打造&#xff0c;不仅是一份详尽的策划指南&#xff0c;更是一次深入患者心灵的品牌传播实践。 何策网&#xff0c;每日收录全网方案PPT &#xff01; 方…

Ubuntu server 24 (Linux) 安装客户端(windows/linux) Zabbix 7.0 LTS Zabbix agent2

一 Ubuntu(linux)安装客户端 1 Ubuntu 24 安装Zabbix agent2 #安装agent库 sudo wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-1ubuntu24.04_all.deb sudo dpkg -i zabbix-release_7.0-1ubuntu24.04_all.deb sudo apt u…

Windows下MySQL数据库定期备份SQL文件与删除历史备份文件.bat脚本

目录 一、功能需求 二、解决方案 (1)新建文件夹及批处理文件 (2)编写备份脚本 ①完整脚本 ②参数修改 (3)编写定期删除备份脚本 ①根据文件名识别日期进行删除 ② 根据文件的修改日期删除 (4)设置定时器 (5)常见报错与处理 一、功能需求 在Windows系统下…

对比4090及4090D:国区“特供”与原版相比有何区别?

2023年12月28日 英伟达宣布正式发布GeForce RTX 4090D&#xff0c;对比于一年前上市的4090芯片&#xff0c;两者的区别与差异在哪&#xff1f;而在当前比较火热的大模型推理、AI绘画场景方面 两者各自的表现又如何呢&#xff1f; 规格与参数信息对比现在先来看看GeForce RT…