算法与算法分析

news2024/11/15 12:19:03

目录

一.前言

二.算法的特性和要求

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

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


一.前言

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

二.算法的特性和要求

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

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

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

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

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

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

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

        在知道了这个知识点之后,后面我们在进行算法之间的比较的时候,我们一般可以把语句执行一次所需的时间看成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://www.coloradmin.cn/o/1950223.html

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

相关文章

如何根据员工的反馈来确定六西格玛培训需求?

在六西格玛的推广与实施过程中&#xff0c;最大的挑战往往不在于技术本身&#xff0c;而在于如何让每一位员工都能理解、接受并积极参与其中。员工是企业最直接的执行者&#xff0c;他们的声音直接反映了项目落地的难易程度及潜在障碍。因此&#xff0c;倾听并有效整合员工反馈…

Python Django功能强大的扩展库之channels使用详解

概要 随着实时 web 应用程序的兴起,传统的同步 web 框架已经无法满足高并发和实时通信的需求。Django Channels 是 Django 的一个扩展,旨在将 Django 从一个同步 HTTP 框架转变为一个支持 WebSockets、HTTP2 和其他协议的异步框架。它不仅能够处理传统的 HTTP 请求,还可以处…

STM32串口(串口基础)

串口整个东西可以说但凡你要碰单片机&#xff0c;想做点上点档次的东西的话那你就包用它的。32的串口配置并不难&#xff0c;哪怕是比起51其实也难不到哪去。 目录 一.通信基础 1.通信方式 2.通信速率 二.串口基础 1.串口的数据帧结构&#xff08;协议&#xff09; 2.ST…

【轨物方案】开关柜在线监测物联网解决方案

随着物联网技术的发展&#xff0c;电力设备状态监测技术也得到了迅速发展。传统的电力成套开关柜设备状态监测方法主要采用人工巡检和定期维护的方式&#xff0c;这种方法不仅效率低下&#xff0c;而且难以保证设备的实时性和安全性。因此&#xff0c;基于物联网技术的成套开关…

JDBC标准实现

JDBC是什么 Java Database Connectivity&#xff1a;Java访问数据库的解 决方案 JDBC定义了一套标准接口&#xff0c;即访问数据库的通用API&#xff0c; 不同的数据库厂商根据各自数据库的特点去实现这些接口。 JDBC希望用相同的方式访问不同的数据库&#xff0c;让具体 的…

Nacos 2.x 新增 grpc 端口,Nginx 需要配置TCP端口转发的注意事项

Nacos 2.x 开始&#xff0c;最大的变化就是端口。在默认主端口 8848 之外又新增了三个端口&#xff0c;新增端口是在配置的主端口 server.port 的基础上&#xff0c;进行一定偏移量自动生成。 8848&#xff08;主端口&#xff0c;默认8848&#xff09;web页面端口及相关http接口…

医院等保解决方案有哪些?用哪些软件可以加强等级保护?

在医疗领域&#xff0c;信息系统的安全直接关系到患者的隐私保护、医院的正常运营乃至社会的稳定。医院信息系统面临着越来越多的安全挑战。 为了确保患者信息的安全与隐私保护&#xff0c;医院需要采取有效的等保&#xff08;等级保护&#xff09;措施。那么&#xff0c;医院…

数据恢复教程:如何从硬盘、SD存储卡、数码相机中恢复误删除数据。

您正在摆弄 Android 设备。突然&#xff0c;您意外删除了一张或多张图片。不用担心&#xff0c;您总能找到一款价格实惠的数据恢复应用。这款先进的软件可帮助 Android 用户从硬盘、安全数字 (SD) 或存储卡以及数码相机中恢复已删除的数据。 Android 上数据被删除的主要原因 在…

以FastGPT为例提升Rag知识库应用中的检索召回命中率

提升Rag知识库应用中的检索召回命中率 在构建Rag&#xff08;Retrieval-Augmented Generation&#xff09;知识库应用时&#xff0c;检索召回知识片段的命中率是至关重要的。高效、准确的检索机制是确保AI系统能够精准响应用户查询的基础。当前&#xff0c;FastGPT主要采用三种…

四步实现网站HTTPS访问

随着网络安全的重要性日益凸显&#xff0c;HTTPS&#xff08;超文本传输安全协议&#xff09;已成为现代网站的标准配置。HTTPS协议作为HTTP协议的安全版本&#xff0c;通过SSL协议加密数据传输&#xff0c;不仅能保护用户数据的安全&#xff0c;还能提升搜索引擎排名&#xff…

一文带你搞懂C++友元和类型转换

6. C友元 在C中&#xff0c;一个类中可以有 public、protected、private 三种属性的成员&#xff0c;通过对象可以访问 public 成员&#xff0c;只有本类中的函数可以访问本类的 private 成员。现在&#xff0c;我们来介绍一种例外情况——友元&#xff08;friend&#xff09;。…

【ai】Easy-RAG 6:安装bge-reranker-large、 成功部署并通过frpc访问

作者用到了funasrwhisper还有RAG的rerank模型这里用的是bge-reranker-large , 要从 https://huggingface.co/BAAI/bge-reranker-large 下载。AttributeError: module ‘numba’ has no attribute ‘jit’ 【ai】Easy-RAG 4: 修复依赖项:numpy numba omegaconf 等作者的地址是…

英特尔宣布针对对Llama 3.1进行优化 以提升所有产品的性能

日前Meta正式发布了Llama 3.1开源大模型&#xff0c;以其庞大的参数量和卓越性能&#xff0c;首次在多项基准测试中击败了GPT-4o等业界领先的闭源模型。允许开发者自由地进行微调、蒸馏&#xff0c;甚至在任何地方部署&#xff0c;这种开放性为AI技术的普及和创新提供了无限可能…

关于promise的一些例题(运行步骤详细说明)

关于promise的一些例题(详细说明) 基本例题 // 直接运行 输出 1 2 const promise new Promise((resolve, reject) > {console.log(1);resolve();console.log(2); });// then后面放入微队列 promise.then(() > {console.log(3); });// 输出4 之后没有代码了所以运行为队…

秋招突击——7/23——百度提前批面试准备和正式面试

文章目录 引言一面准备面试预演一1、讲一下hashcode()和equals()关系2、equals()和有什么区别3、讲一下重载和重写的区别4、讲一下深拷贝、浅拷贝的区别5、讲一下Java异常的基类&#xff0c;运行时异常举几个例子&#xff0c;什么情况下会出现&#xff1f;6、讲一下Java中线程的…

【管控业财一体化】

1. 引言 大型集团在现代企业管理中扮演着举足轻重的角色&#xff0c;其管控业财一体化解决方案是实现企业高效运营的关键。随着数字化转型的加速&#xff0c;业财一体化不再局限于财务与业务流程的简单融合&#xff0c;而是向着更深层次的数据驱动、智能化决策和价值创造方向发…

光猫设置桥接 路由器pppoe拨号 设置正常访问光猫 (openwrt)

网络信息展示 光猫桥接很简单吧&#xff0c;就不说了。先来列出修改前的网络接口和网络信息。 光猫192.168.1.1&#xff0c;openwrt 10.0.0.0/8 初始配置 需要记录的信息&#xff1a;WAN的网络设备&#xff08;eth1&#xff09;&#xff0c;光猫的IP&#xff08;192.168.1.1&am…

RV1126 Linux 系统,接外设,时好时坏(一)应该从哪些方面排查问题

在 Linux 系统中接外设时,遇到“时好时坏”的问题,可能是由多种因素引起的。以下是一些排查问题的建议。 1. 硬件方面的排查 1.1 连接检查 物理连接: 确保外设与主板之间的连接良好,检查插头、插座及线缆是否牢固。引脚配置: 确认设备树中引脚的配置是否正确,尤其是引脚…

linux modetest常用命令

1 通过help有哪些参数 130|:/ # modetest -h usage: modetest [-acDdefMPpsCvrw]Query options:-c list connectors-e list encoders-f list framebuffers-p list CRTCs and planes (pipes)Test options:-P <plane_id><crtc_id>:<w>x&l…

Web开发:ASP.NET CORE中前端使用Ajax定时获取后端数据

一、低难度&#xff08;刷新a标签&#xff09; 1、需求 给a标签每15s刷新一次&#xff0c;显示最新的时间&#xff08;时间必须由后端获取&#xff09; 应该如何操作呢 2、代码 后端 using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Mi…