算法与算法分析

目录

一.前言

二.算法的特性和要求

三.分析算法--时间效率

四. 分析算法--空间效率


一.前言

        算法就是对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中,每个指令表示一个或多个操作。总而言之,我们数据结构就是通过算法实现操作。而我们的算法又是根据数据结构来设计程序。程序=数据结构+算法

二.算法的特性和要求

        算法一共有五个特性:有穷性,确定性,可行性,输入,输出。其中输入输出就是我们的算法一定要有输入和输出。

        算法设计的要求有四个,分别是正确性,可读性,健壮性,高效性。其中健壮性就是指我们在输入非法数据的时候,算法恰当的作出反应或进行相应处理,而不是产生莫名其妙的大额输出结果。

三.分析算法--时间效率

        我们评价一个算法的好坏主要从它的算法效率来看,而算法效率又可以通过以下两个方面来考虑:时间效率和空间效率。尽管二者有时候是矛盾的。

        我们首先来分析下时间效率。通过分析可以得到:

其中,每条语句的执行次数我们也称作语句的频度。 

        由于算法中每条语句执行一次所需的时间是由机器本身软硬件环境决定的,所以我们可以假设执行每条语句所需的时间均为单位时间。

        在知道了这个知识点之后,后面我们在进行算法之间的比较的时候,我们一般可以把语句执行一次所需的时间看成1,不影响算法的时间效率。所以我们通常把算法所耗费的时间定义为该算法中每条语句的频度之和,也就是执行次数之和。

下面我们来看一个简单的案例:

for(int i=1;i<=n;i++){   //执行n+1次for(int j=1;j<=n;j++){    //执行n*(n+1)次a[j]=a[i]+j;        //执行n*n次}
}

我们来分析下上面这段算法,分析它的时间效率。所以我们可以考虑得出这个算法每条语句的频度。第一行的代码会执行n+1次,因为在执行完n次之后,虽然i已经等于n+1次了,但它还是得继续判断i是否小于等于n,然后不满足条件才结束循环。所以总共会执行n+1次。同理,第二行代码外层循环每执行一次,它就执行n+1次,而外层循环总共执行n次(因为在执行第n+1次的时候,i>n,不满足条件),所以第二行代码的语句频度为n*(n+1)。第三行代码则执行n*n次。

综上所述,所以我们上面这个算法的运行时间也就是T(n)=n*n+n*(n+1)+n+1=2n*n+2n+1。

        由于我们这里的n次,具体的数值我们并不清楚,n可能很小,也可能很大。所以在这里我们需要引入渐进时间复杂度的概念。如下所示:

也就是说,我们为了方便比较不同算法的时间效率,我们仅仅比较它们的数量级。

        通过分析我们可以看出,算法中执行次数最多的那条语句往往就是我们时间复杂度的不去除系数的数值。所以下面我们来介绍下分析算法时间复杂度的基本方法:

1)首先找出语句频度最大的那条语句作为基本语句。

2)计算基本语句的频度得到问题规模n的某个函数f(n)

3) 取它的数量级并用符号"O"表示。

4)最后,时间复杂度T(n)=O(f(n))

         接着我们介绍一种特殊情况,也就是算法基本操作执行的次数还随问题的输入数据集不同而发生变化。所以这里我们需要引入平均时间复杂度的概念。

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

        最后,我们在得到了时间复杂度之后,我们该怎么评价它的复杂度呢?这里就涉及到复杂度的大小顺序了,如下所示:

从左到右,复杂度依次递增。

四. 分析算法--空间效率

        所谓算法的空间效率我们可以用算法的空间复杂度来衡量,也就是算法所需存储空间的度量。记作S(n)=O(f(n))。其中n为问题的规模,f(n)也就是上面所介绍的基本语句的执行次数所对应包含n的函数,这里把执行次数换成了空间大小。

        那我们算法所占用的空间有哪些呢?总共分为两种:一种就是算法本身要占据的空间,输入/输出,指令,常数,变量等。第二种就是算法要使用的辅助空间。我们看下面两个案例:

for(int i=0;i<n/2;i++){t=a[i];a[i]=a[n-i-1];a[n-i-1]=t;
}

上面这段代码由于只使用了t这一个辅助空间,因此它的空间复杂度就是1,也就相当于原地工作。

而我们接着看下面这段代码:

for(int i=0;i<n;i++){b[i]=a[n-i-1];
{
for(int i=0;i<n;i++){a[i]=b[i];
}

 这段代码由于使用了数组b作为辅助空间,所以它的空间复杂度就不再为1,而是为数组b的大小,也就是n,即S(n)=O(n)。

 

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

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

相关文章

全球CG盛事:世界3D渲染大赛震撼开幕!

在数字艺术的浪潮中&#xff0c;CG&#xff08;计算机图形学&#xff09;已经成为现代视觉艺术不可或缺的一部分。它不仅推动了电影、游戏和动画产业的发展&#xff0c;更激发了无数艺术家的创造力。今天&#xff0c;我们迎来了一个全球CG界的盛事——世界3D渲染大赛的震撼开幕…

【Unity2D 2022:UI】TextMeshPro组件无法显示中文

在Unity中创建了一个预制体Card&#xff0c;上面挂载了一些Text Mesh Pro组件用来显示卡牌信息。但是在输入文字后&#xff0c;发现无法显示中文&#xff1a; 解决方法如下&#xff1a; 一、导入字体文件&#xff08;ttf格式&#xff09;和常用字字集&#xff08;txt格式&…

【LLM大模型】LLaMA3微调部署真不难!拿走这份教程,轻松掌握LLaMA大模型微调!

今天给大家分享一个爆火的llama3教程&#xff0c;也就是下面这份&#xff1a; 这个项目是基于Meta最新发布的新一代开源大模型Llama-3开发的&#xff0c;是Chinese-LLaMA-Alpaca开源大模型相关系列项目的第三期。本项目开源了中文Llama-3基座模型和中文Llama-3-Instruct指令精…

使用curl测试websocket服务是否能正常连入

部分场景&#xff0c;前端连接不上websocket服务&#xff0c;需要从后台验证websocket服务是否能连入&#xff0c;判断防火墙是否开通&#xff0c;反向代理是否配置正确&#xff0c;可以使用curl测试服务器websocket服务是否正常。 分行命令 curl --include \--no-buffer \--…

自监督学习概述(Self-Supervised Learning,SSL)

自监督学习&#xff08;Self-Supervised Learning&#xff0c;SSL&#xff09;是一种机器学习方法&#xff0c;旨在利用未标记数据进行训练。这种方法通过从数据本身生成伪标签&#xff0c;来创建监督信号&#xff0c;使得模型能够学习有效的数据表示。自监督学习在深度学习领域…

Vue的安装配置

1.安装node js Node.js — 在任何地方运行 JavaScript (nodejs.org) 2.测试nodejs是否安装成功 node -v npm -v3.通过npm 安装 vue npm install -g vue/cli4.测试vue是否安装成功 vue --version5.打开PyCharm&#xff0c;创建项目&#xff1a;flask-web vue create flask…

论文快过(图像配准|Coarse_LoFTR_TRT)|适用于移动端的LoFTR算法的改进分析 1060显卡上45fps

项目地址&#xff1a;https://github.com/Kolkir/Coarse_LoFTR_TRT 创建时间&#xff1a;2022年 相关训练数据&#xff1a;BlendedMVS LoFTR [19]是一种有效的深度学习方法&#xff0c;可以在图像对上寻找合适的局部特征匹配。本文报道了该方法在低计算性能和有限内存条件下的…

【已解决】TypeError: argument of type ‘int’ is not iterable

【已解决】TypeError: argument of type ‘int’ is not iterable 在Python编程中&#xff0c;TypeError: argument of type int is not iterable是一个常见的错误。此错误表明你尝试对一个整数&#xff08;int&#xff09;执行迭代操作&#xff0c;但整数是不可迭代的。本文将…

微信小程序模拟扫码进入调试

1 2 参数就是namekeyaaa&#xff0c;上面的%3D是经过encodeURIComponent编码&#xff0c;必须使用%3D&#xff0c;不然等号会当作新的key。

【单片机毕业设计选题24081】-路灯无线数据采集器

系统功能: 手机开启2.4G WiFi热点后再给系统上电 系统操作说明&#xff1a; 上电后OLED显示 “欢迎使用智能路灯系统请稍后”&#xff0c;两秒后显示Connecting...表示 正在连接阿里云&#xff0c;正常连接阿里云后显示第一页面&#xff0c;如长时间显示Connecting...请 检…

Redis的操作以及SpringCache框架

目录 一.什么是Redis&#xff1f; 二.Redis的相关知识&#xff1a; 三.如何操作Redis&#xff1f; 1&#xff0c;常用命令&#xff1a; 2.Spring Data Redis &#xff08;1&#xff09; pom.xml 配置&#xff1a; &#xff08;2&#xff09;配置Redis数据源&#xff1a; …

转置卷积 transposed convolution

1. 转置卷积 转置卷积&#xff08;Transposed Convolution&#xff09;也叫Fractionally-strided Convolution和Deconvolution&#xff0c;但用的最多的是Transposed Convolution。 注意&#xff1a; 转置卷积不是卷积的逆运算&#xff0c;只会大小恢复为原本大小。转置卷积…

SPSS个人版是什么软件

SPSS是一款数据统计、分析软件&#xff0c;它由IBM公司出品&#xff0c;这款软件平台提供了文本分析、大量的机器学习算法、数据分析模型、高级统计分析功能等&#xff0c;软件易学且功能非常强大&#xff0c;可以使用SPSS制作图表&#xff0c;例如柱状、饼状、折线等图表&…

APP逆向 day21大姨妈逆向

一.前言 今天来和大家说一款app名叫DYM&#xff0c;我们选择版本v8.6.0&#xff0c;今天通过这个可以学到的知识点有绕过root检测&#xff0c;通过frida-rpc和自己编写一款小的app来调用so文件&#xff0c;然后再来破解登录接口 二.绕过root检测 我们进入app后发现&#xff…

C++从入门到起飞之——初始化列表类型转换static成员 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、初始化列表 2、 类型转换 3. static成员 4、完结散花 1、初始化列表 • 之前我们实现构造函数…

Qwen2模型Text2SQL微调​以及GGUF量化

Qwen2-1.5B微调 准备python环境 conda create --name llama_factory python=3.11 conda activate llama_factory部署llama-factory git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip3 install -e ".[torch,metrics]" # 如…

算法日记day 20(二叉搜索树)

一、验证二叉搜索树 题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也…

IE11添加收藏、关闭窗口时弹出的对话框字体又大又粗很难看的解决办法

原因已查明&#xff0c;在win7 sp1 32位系统下&#xff0c;安装“2020-01 适用于基于 x86 的系统的 Windows 7 月度安全质量汇总&#xff08;KB4534310&#xff09;”这个更新会导致IE11的窗口字体变大变粗&#xff0c;把这个更新卸载了就可以了&#xff0c;无需重装IE11浏览器…

【四】jdk8基于m2芯片arm架构Ubuntu24虚拟机下载与安装

文章目录 1. 安装版本2. 开始安装3. 集群安装 1. 安装版本 如无特别说明&#xff0c;本文均在root权限下安装。进入oracle官网&#xff1a;https://www.oracle.com/java/technologies/downloads/找到最下面Java SE 看到java 8&#xff0c;下载使用 ARM64 Compressed Archive版…

探索 Electron:快捷键与剪切板操作

Electron是一个开源的桌面应用程序开发框架&#xff0c;它允许开发者使用Web技术&#xff08;如 HTML、CSS 和 JavaScript&#xff09;构建跨平台的桌面应用程序&#xff0c;它的出现极大地简化了桌面应用程序的开发流程&#xff0c;让更多的开发者能够利用已有的 Web 开发技能…