【算法LearnNO.1】算法介绍以及算法的时间复杂度和空间复杂度

news2024/11/22 12:45:39

目录

一、算法

1、算法概述

2、算法的5个特性

3、设计算法的标准

二、时间复杂度

1、时间复杂度的介绍

2、渐进时间复杂度的求法

3、计算时间复杂度的代码举例(平方阶示例)

4、时间复杂度排序

三、空间复杂度


一、算法

1、算法概述

算法就是解决问题的方法。以数据结构来表示出来对于问题的解决方法。一般算法的表示有三种方法:①自然语言表示②程序代码③类C语言。

2、算法的5个特性

有穷性:算法的实现是通过又穷步就可完成,且每一步都是有穷时间内完成的。

确定性:算法实现的输出结果唯一,对于算法中的所要执行的操作有确切的规定,不会存在二义性。

可行性:所有操作在有限时间内可实现。

输入:一个算法有零个或多个输入。

输出:一个算法有一个或多个输出。

3、设计算法的标准

正确性:不单单是程序语法正确,还要在运行一些能涵盖所有情况的特殊数据后能够准确的得到及结构。

可读性:算法是给人看的,要让读者能够读懂,而不会在阅读中有很多看不明白的地方。多增加注释,在很多变量和语句中增加解释,让算法变得清晰。

健壮性:随机应变能力。当输入非法的数据时,不会乱七八糟的随意输出,而会做出正确的反应或者得到错误提醒的输出语句。

高效性:高效分为时间高效和空间高效。效率高,则时间短,所需空间小。但是有时候时间效率和空间效率是矛盾的,想要时间效率高有时候会消耗很大的空间。

二、时间复杂度

算法时间效率是依据程序在计算机上运行所消耗的时间来度量的。度量方法有事后统计和事前分析两种方法,而人们一般会用后者,在编写程序之前对算法所消耗资源进行估算。

1、时间复杂度的介绍

一个算法的运行时间是=每条语句的执行次数ⅹ该语句执行一次所需要的时间

for(i=0;i<n;i++){           //频度为n+1
    for(i=0;i<n;i++){       //频度为n*(n+1)
        k=k*2;
    }
}

上面代码段的运行时间用含n的函数表示为f(n)=n²+2n+1,

上式函数的同阶函数为n²,

我们用"O"来表示数量级,则T(n)=O(f(n))=O(n²);T(n)即为上述算法的渐进时间复杂度,简称时间复杂度。

2、渐进时间复杂度的求法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:

  • 用常数1取代运行时间中的所有加法常数。
  • 在修改后的运行次数函数中,只保留最高阶项。
  • 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

3、计算时间复杂度的代码举例(平方阶示例)

    int x=0;y=0;    
    for(k=1;k<=n;k++){
        x++;
    } 
    for(i=1;i<=n;i++){
         for(j=1;j<=n;j++){
              y++; 
         }
    }

对循环语句只需考虑循环体中语句的执行次数,以上程序段中频度最大的语句是第(7)行,其频度为f(n)=n²,所以该算法的时间复杂度为T(n)=O(n²),称为平方阶。

笔者的理解是算法的时间复杂度是由最深层循环内的基本语句的频度f(n)决定的,最深处的语句就是频度最大的语句。

4、时间复杂度排序

时间复杂度T(n)按数量级递增顺序为(从左到右复杂度升高):

三、空间复杂度

时代发展,科技进步,人们都不是很关注空间的占用情况了,因为现在的计算机的存储空间都很大很大。

空间复杂度:算法所需存储空间(寄存器)的量度。

                        记作:S(n)=O(f(n))

算法所占用的空间包括:

①算法本身所占用的空间:输入输出以及定义的变量等所占用的空间。

②算法要使用的辅助空间。

笔者认为计算空间复杂度是注重在于寻找定义,因为变量是在定义的时候才会被分配空间,在程序中寻找总共分配了多少个空间给变量,空间复杂度就是多少,空间复杂度的差异取决于辅助空间的大小分配,辅助空间分配的多少就能间接的体现出来空间复杂度的大小。

值得注意的是:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

今天的分享就到这啦😉


如果我的文章对您有帮助,

希望可以 “点赞” “收藏” “关注” 一键三连支持一下哦!

想了解更多知识请前往故里♡927的博客

如果以上内容有什么问题,欢迎留言,大家一起学习,共同进步。


我们下期见😉~~

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

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

相关文章

蔚来试水辅助驾驶订阅,NOP+能否吃蟹?

作者 | 德新 编辑 | 王博2021年的NIO Day上&#xff0c;随着当时ET7发布&#xff0c;蔚来最早宣布了智能驾驶订阅服务&#xff1a;NAD&#xff0c;月费680元。 两年后&#xff0c;辅助驾驶订阅模式终于开始落地&#xff1a;蔚来将从7月1日起&#xff0c;对NOP进行收费&#xff…

Nginx基础教程

Nginx 目标 Nginx简介【了解】 Nginx安装配置【掌握】 一、Nginx简介 Nginx称为:负载均衡器或 静态资源服务器:html,css,js,img ​ Nginx(发音为“engine X”)是俄罗斯人编写的十分轻量级的HTTP服务器,是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/P…

索引优化、优化,你又是一个好MongoDB!!!博学谷狂野架构师

MongoDB索引优化 作者: 博学谷狂野架构师GitHub&#xff1a;GitHub地址 &#xff08;有我精心准备的130本电子书PDF&#xff09;只分享干货、不吹水&#xff0c;让我们一起加油&#xff01;&#x1f604; 索引简介 索引通常能够极大的提高查询的效率&#xff0c;如果没有索引&a…

【pg数据库状态监控相关参数展示】

1、最近项目中做了一个postgresql数据库监控状态功能的需求&#xff0c;需求如下图 2、研究好久&#xff0c;终于在pg数据库的官方文档中找到了相关视图参数&#xff0c; 文档连接如下&#xff1a; 数据库基础信息&#xff1a; http://www.postgres.cn/docs/9.3/functions-in…

开源项目:数据库表结构生成文档工具

目录 一、软件介绍 二、技术框架 三、功能介绍 四、代码展示 1、获取数据库信息部分代码 2、导出Html文档代码 五、运行效果 六、项目开源地址 一、软件介绍 今天给大家分享我自己编写的数据库表结构文档生成工具&#xff0c;方便大家在实际开发当中&#xff0c;可以很方便导出…

JAVA常用工具-文件操作相关IO

IO技术在JDK中算是极其复杂的模块&#xff0c;文件管理都依赖IO技术&#xff0c;而且都是编程的难点&#xff0c;想要整体理解IO流&#xff0c;先从Linux操作系统开始&#xff0c; Linux空间隔离 Linux使用是区分用户的&#xff0c;这个是基础常识&#xff0c;其底层也区分用…

【MQTT协议】使用Mosquitto实现mqtt协议(二):编写视频帧的发布/订阅服务

目录一、Mosquitto中的QoS定义QoS1和3区别二、安装base64库三、cjson简介四、主程序代码五、调用Mosquitto库使用的cmakelist更多内容详见 【MQTT协议】使用c实现mqtt协议&#xff08;Mosquitto源码编译&#xff09;一、Mosquitto中的QoS定义 MQTT协议中的QoS&#xff08;Qual…

CLIP论文拜读及理解

文章目录一、clip论文阅读二、prompt1.除prompt之外的预训练语言模型2.prompt2.1. prompt定义2.2. prompt类型2.3. prompt重构2.3.1 prompt template2.3.2 Answer engineering2.4 多个 prompt的使用2.5 prompt的训练总结参考&#xff08;博文、论文&#xff09;一、clip论文阅读…

Windows系统安装WSL,并安装docker服务

背景 因为工作需要&#xff0c;要在电脑上执行sh脚本&#xff0c;并启动docker服务执行具体逻辑。因为我的电脑是windows系统&#xff0c;对做本任务来说&#xff0c;比较吃力&#xff0c;所以想到使用wsl&#xff0c;让windows电脑具有linux电脑的能力。 什么是 WSL 2 WSL 2 …

JVM的类加载的过程以及双亲委派模型

目录 1、加载 &#xff08;加载字节码文件&#xff0c;生成.class对象&#xff09; 2、验证&#xff08;验证Class文件是否符合规范&#xff09; 3、准备 &#xff08;为静态变量分配内存并设置变量初始值&#xff09; 4、解析&#xff08;初始化常量池中的一些常量&#…

索引的分类

1.唯一索引 给表中某一列设置为了唯一约束(这列不允许出现重复数据)后&#xff0c;数据库会为将这一列设置索引&#xff0c;这个索引叫做唯一索引&#xff08;主键那一列是一个特殊的唯一索引&#xff0c;不仅要满足唯一索引这一列不可以出现重复数据&#xff0c;而且这一列还…

Android opencv

install cmake cpp folder,新建c项目 获取 OpenCV4Android SDK O4A_SDK 下载&#xff0c;并解压 ~/Downloads/OpenCV-android-sdk$ tree -d -L 2 . ├── apk ├── samples │ ├── 15-puzzle │ ├── camera-calibration │ ├── color-blob-detection │ ├…

文件:IO流

1. 什么是IO /O 即输入Input/ 输出Output的缩写&#xff0c;其实就是计算机调度把各个存储中&#xff08;包括内存和外部存储&#xff09;的数据写入写出的过程&#xff1b;java中用“流&#xff08;stream&#xff09;”来抽象表示这么一个写入写出的功能&#xff0c;封装成一…

Vue学习笔记(7. axios异步请求)

1. axios请求方式 方式1&#xff1a;axios({method:"GET",url:"..."}) 方式2&#xff1a;axios({method:"POST",url:"...",data:"..."}) 方式3&#xff1a;axios.get("url...") 方式4&#xff1a;axios.post(…

Python中的35个关键字

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;零基础入门篇 &#x1f4ac;个人格言&#xff1a;不断的翻越一座…

【 Spring MVC 核心功能(二) - 获取参数(下)】

文章目录一、使用 RequestBody 接收JSON对象二、使用 RequestPart 上传⽂件三、获取 Cookie四、获取 Header五、存储和获取 Session5.1 存储 Session5.2 获取 Session一、使用 RequestBody 接收JSON对象 有时客户端会通过 post 方式发送 json 格式的请求&#xff0c;那后端就可…

2.3.5双链表

单链表vs双链表 就是既有前驱指针也有后继指针&#xff0c;由line改为double。 双链表的插入怎么实现&#xff1f; s->nextp->next; p->next->priors s->priorp //把p赋给s的前驱指针指向的位置 p->nexts; 如果p刚好是最后一个元素。 p->next->prio…

基于ArcGIS的电子地图矢量化方法

一、电子地图及纸质地图矢量化的目的 地图数据来源有很多&#xff0c;其中栅格数据数字化是地图数据的重要来源。栅格数据的矢量化包括地理配准以及矢量化。矢量化后的地图数据往往可以为我们的空间统计分析提供实验依据&#xff0c;从而探究地理分布的时空差异性。 空间参考&a…

完整指南:如何安装Man手册

Man手册简介 man手册是Unix和类Unix操作系统中的命令行工具&#xff0c;用于提供关于特定命令、函数和文件的帮助文档。它通常包含命令的语法、选项、参数、示例以及其他相关信息。man手册可以通过在终端输入"man"命令&#xff0c;后跟要查看的命令或函数名称来访问…

huggingface transformer模型介绍

总结&#xff1a; 模型提高性能&#xff1a;新的目标函数&#xff0c;mask策略等一系列tricks Transformer 模型系列 自从2017&#xff0c;原始Transformer模型激励了大量新的模型&#xff0c;不止NLP任务&#xff0c;还包括预测蛋白质结构&#xff0c;时间序列预测。 有些模…