第一百零三天学习记录:数据结构与算法基础:算法和算法分析

news2024/11/25 0:44:03

在这里插入图片描述
注:截图转自王卓数据结构教学视频

算法和算法分析

算法的定义

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

算法的描述

自然语言:英文、中文
流程图:传统流程图、NS流程图
伪代码:类语言:类C语言
程序代码:C语言程序、Java语言程序……

算法与程序

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

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

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

算法设计的要求

1、正确性
在这里插入图片描述

2、可读性
在这里插入图片描述

3、健壮性
在这里插入图片描述

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

算法时间效率的度量

算法时间效率可以用依据该算法编制的程序在计算机上执行所消耗的时间来度量。
两种度量方法:
1、事后统计:
将算法实现,测算其时间和空间开销。
缺点:编写程序实现算法将花费较多的时间和精力;所得实验结果依赖于计算机的软硬件等环境因素,掩盖算法本身的优劣。
2、事前分析:
对算法所消耗资源的一种估算方法。
事前分析方法:
一个算法的运行时间是指一个算法在计算机上运行所消耗的时间大致可以等于计算机执行一种简单的操作(如赋值,比较,移动等)所需的时间与算法中进行的简单操作次数乘积。
算法运行时间 = 一个简单操作所需的时间 X 简单操作次数
也即算法中每条语句的执行时间之和
在这里插入图片描述
每条语句执行一次所需的时间,一般是随机器而异的。取决于机器的指令性能、速度以及编译的代码质量。是由机器本身软硬件环境决定的,它与算法无关。
所以,我们可假设执行每条语句所需的时间均为单位时间。此时对算法的运行时间的讨论就可转化为讨论该算法中所有语句的执行次数,即频度之和了。
这就可以独立于不同机器的软硬件环境来分析算法的时间性能了。

例如:两个nXn矩阵相乘的算法可描述为:
在这里插入图片描述
我们把算法所消耗的时间定义为该算法中每条语句的频度之和,则上述算法的时间消耗T(n)为:
在这里插入图片描述
为了便于比较不同算法的时间效率,我们仅比较它们的数量级
例如:两个不同的算法,时间消耗分别是:
在这里插入图片描述
若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则成f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),则称O(f(n))为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度。(order)

那么对于刚刚求解矩阵相乘问题,算法耗费时间:
在这里插入图片描述
一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作执行的次数,它是问题规模n的某个函数,用T(n)表示。

算法时间复杂度定义

在这里插入图片描述
在这里插入图片描述
注:以上截图均转自王卓数据结构教学视频

基本语句重复执行的次数:
1、算法中重复执行次数和算法的执行时间成正比的语句
2、对算法运行时间的贡献最大
3、执行次数最多

问题规模:
n越大算法的执行时间越长:
1、排序:n为记录数
2、矩阵:n为矩阵的阶数
3、多项式:n为多项式的项数
4、集合:n为元素个数
5、树:n为树的结点个数
6、图:n为图的顶点数或边数

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

在这里插入图片描述
类似高等数学的极限。

1、找出语句频度最大的那条语句作为基本语句
2、计算基本语句的频度得到问题规模n的某个函数f(n)
3、取其数量级用符号"O"表示

举例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
请注意:有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同
在这里插入图片描述

算法时间复杂度

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

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

对于复杂的算法,可以将它分成一个容易估算的部分,然后利用大O加法法则和乘法法则,计算算法的时间复杂度。
在这里插入图片描述

算法时间效率的比较

1、当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊。
在这里插入图片描述
在这里插入图片描述

渐进空间复杂度

空间复杂度:算法所需储存空间的度量
在这里插入图片描述
算法要占据的空间
算法本身要占据的空间,输入/输出,指令,常数,变量等。
算法要使用的辅助空间
在这里插入图片描述

设计好的算法

在这里插入图片描述

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

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

相关文章

辅助驾驶功能开发-功能规范篇(22)-2-L2级辅助驾驶方案功能规范

1.3.2 TSR 系统功能定义 1.3.2.1 状态机 1.3.2.2 状态迁移表 初始状态转移状态转移条件INITOFF系统自检过程中,为 OFF 状态,自检无故障且车辆上次掉电前,为 OFF 状态INITON自检无故障,车辆为首次上电,或者上次掉电之前,系统为非 OFF 状态INITFAILURE系统自检故障,且上…

系统架构设计师-软件工程(4)

一、软件测试 1、软件测试类型(动态测试 / 静态测试) ● 动态测试【计算机运行】 (1)白盒测试法【结构测试】:主要用于单元测试阶段。 a:控制流测试【逻辑覆盖测试(语句覆盖最弱&#…

【数据结构与算法】栈算法题

TS 实现栈 interface IStack<T> {push(e: T): void;pop(): T | undefined;peek(): T;isEmpyt(): boolean;size(): number; }// implements: 实现接口, 一个类可以实现多个接口 class ArrayStack<T> implements IStack<T> {private data: T[] []; // private…

【已解决】词云图只显示方框,无法正确显示中文

文章目录 报错及效果图报错代码解决后效果图 解决方案 报错及效果图 报错代码 from wordcloud import WordCloud def drawing_wordcloud(jieba_split):colormaps colors.ListedColormap([#33b846, #a9be70, #e50000])# 生成词云&#xff08;自定义样式&#xff09;mywc1 Wor…

docker 挂载共享文件夹

docker 挂载共享文件夹 1. 目前不太清楚怎么在已经启动的容器中挂载1.1 也不是完全没办法&#xff0c;把当前的容器打包&#xff0c;再使用-v参数重新启动就可以了 1. 目前不太清楚怎么在已经启动的容器中挂载 1.1 也不是完全没办法&#xff0c;把当前的容器打包&#xff0c;再…

运维面试题

这里写目录标题 TCP介绍一下UDP TCP介绍一下 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。它在计算机网络中负责提供可靠的数据传输和流量控制。 TCP通过使用三次握手建立一个连接&#xff0c;确…

内存函数相关讲解与模拟实现

目录 memcpy 模拟实现memcpy memmove 模拟实现memmove memcmp 结尾 memcpy 由 source指向地址为起始地址的连续n个字节的数据复制到以destination指向地址为起始地址的空间内。格式如下 void * memcpy ( void * destination, const void * source, size_t num ); 说明…

C语言 — 指针进阶篇(下)

前言 指针基础篇回顾可以详见&#xff1a; 指针基础篇&#xff08;1&#xff09;指针基础篇&#xff08;2&#xff09; 指针进阶篇分为上下两篇,上篇介绍1 — 4&#xff0c;下篇介绍5 — 6 字符指针数组指针指针数组数组传参和指针传参函数指针函数指针数组指向函数指针数组的…

SpringBoot 配置文件:什么是配置文件?配置文件是干什么?

文章目录 &#x1f387;前言1.配置文件的格式2. properties配置文件说明2.1 properties基本语法2.2 读取配置文件 3. yml 配置文件说明3.1 yml 基本语法 4.properties与yml 对比 &#x1f387;前言 学习一个东西&#xff0c;我们先要知道它有什么用处。整个项目中所有重要的数…

C语言,指针易错点

1、封装函数&#xff0c;用指针实现字符串连接 #include <stdio.h> #include <string.h> void MyStrcat(char *dest,char *src) {int i;for(i0;*(desti);i);for(int j0;*(srcj);j)*(desti)*(srcj);*(desti)0; } int main(int argc, const char *argv[]) {char des…

Spring详解(学习总结)

目录 一、Spring概述 &#xff08;一&#xff09;、Spring是什么&#xff1f; &#xff08;二&#xff09;、Spring框架发展历程 &#xff08;三&#xff09;、Spring框架的优势 &#xff08;四&#xff09;、Spring的体系结构 二、程序耦合与解耦合 &#xff08;一&…

MySQL与PostgreSQL的区别

MySQL与PostgreSQL的区别 PostgreSQL的特点包括&#xff1a; 1.PostgreSQL是一个免费的对象-关系数据库服务器 (ORDBMS)&#xff0c;在灵活的BSD许可证下发行。 2.PostgreSQL的Slogan是"世界上最先进的开源关系型数据库"。 3.PostgreSQL具有极高的可靠性&#xff…

数据结构--并查集的进一步优化

数据结构–并查集的进一步优化 Find操作的优化(压缩路径) 压缩路径 − − F i n d 操作&#xff0c;先找到根节点&#xff0c;再将查找路径上所有结点都挂到根结点下 \color{red}压缩路径 -- Find操作&#xff0c;先找到根节点&#xff0c;再将查找路径上所有结点都挂到根结点…

第二十三章:存储引擎

第二十三章&#xff1a;存储引擎 ​ 为了管理方便&#xff0c;人们把连接管理、查询缓存、语法解析、查询优化这些并不设计真实数据存储的功能划分为MySQL server的功能&#xff0c;把真实存取数据的功能划分为存储引擎的功能。所以在MySQL server完成了查询优化后&#xff0c…

各种好看的css效果收集

CSS动画特效-多种方案实现CSS光束扫过&#xff0c;扫光特效&#xff0c;ae文字过光效果&#xff0c;光效移动效果 一个集合180种免费的线性渐变网站&#xff0c;可在任何网站使用您不仅可以复制渐变的原生CSS颜色代码&#xff0c;还可以查看下载每个优质的渐变图片。 链接&…

多线程——python进阶知识

多线程与多进程的区别 多线程是单个内核通过锁的手段实现同一时间运行多个程序&#xff0c;在某些情况下可以提升总体的运行效率。同时为了防止多个线程在对同一数据进行修改时导致的不可预测的后果&#xff0c;需要借助锁、队列等保证进程的同步。 多进程是多个内核执行多个…

(赠书活动第4期)编译语言的思考过程

面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种广泛应用于编程领域的编程范式&#xff0c;对于前端和后端开发都具有重要意义。在这篇说明中&#xff0c;我们将探讨面向对象编程对于前端和后端开发的重要性&#xff0c;并探讨其优…

【Linux指令集】---mv指令(超详细)

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 演示环境&#xff1…

高效工作:ADManager Plus的利器

在当今快节奏的商业环境中&#xff0c;高效的工作是成功的关键。对于IT管理员来说&#xff0c;管理和维护Active Directory&#xff08;AD&#xff09;环境是一项重要的任务。然而&#xff0c;手动处理繁琐的AD管理任务可能会占用大量的时间和精力&#xff0c;影响工作效率。为…

可使用Linux 测试IP和端口是否能访问,查看返回状态码

一、 使用wget判断 wget是linux下的下载工具&#xff0c;需要先安装. 用法: wget ip:port wget ip:port连接存在的端口 二、使用telnet判断 telnet是windows标准服务&#xff0c;可以直接用&#xff1b;如果是linux机器&#xff0c;需要安装telnet. 用法: telnet ip port…