数据结构——算法和算法效率的度量

news2024/10/6 10:42:32

目录

一、引言

二、算法

1 算法的基本概念

 2 算法的复杂度

2.1 时间复杂度

2.1.1 概念

2.1.2 大O的渐进表示

3 算法的空间复杂度

3.1 概念

 3.2 实例

4 实例分析

5 结论


一、引言

大家在写代码的时候有没有发现写同样功能的代码有多种不同的写法,而不同的代码也会给我们的程序带去不同的影响,比如有的代码执行的快,有的代码执行的慢;有的代码申请的空间大,有的代码申请的空间小,那这是为什么呢?因为是算法不同呀,那为什么不同呢,接下来就由姜糖给大家讲讲算法这一特殊的名词。

二、算法

1 算法的基本概念

算法(Algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。此外,一个算法还具有下列五个重要特性:

  • 有穷性。一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。
  • 确定性。算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出。
  • 可行性。算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
  • 输入。一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合。
  • 输出。一个算法有一个或多个输出,这些输出是与输入有着某种特定关系的量。

通常,设计一个“好”的算法应考虑达到以下目标:

  • 正确性。算法应能够正确地解决求解问题。
  • 可读性。算法应具有良好的可读性,以帮助人们理解。
  • 健壮性。算法能对输入的非法数据做出反应或处理,而不会产生莫名其妙的输出。
  • 高效率与低存储量需求。效率是指算法执行的时间,存储量需求是指算法执行过程中所需要的最大存储空间,这两者都与问题的规模有关。


 2 算法的复杂度

算法效率的度量是通过时间复杂度和空间复杂度来描述的。

2.1 时间复杂度

说起时间可能有的人就会说,运行时间嘛我也会,把代码放在电脑上面跑一下就知道了。那大家想过没,我拿学校机房大LOL都卡的电脑和家里豪华rog全家桶来跑一个代码,他们的运行时间会一样吗?那有的人可能会说那放在同一台电脑上跑不就行了吗?那万一网卡了呢,时间不就又不一样了。所以算法中就有一个时间复杂度的概念

2.1.1 概念

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度

 那接下来我们来看一个程序来找出他的执行次数:

void Func1(int n)
{
    int count = 0;
    for(int i = 0; i < n ; i++)
    {
        for(int j = 0 ;j < n ; j++)
        {    
            count++;
        }
    }

    for(int k = 0; k<2*n ; k++)
    {
        count++;
    }

    int m = 10;
    while(m--)
    {
        count:
    }

    printf("%d\n",count);
}

次数:

F(N)=N^{2}+2*N+10

当我们发现当N足够大时,2*N+10对函数的影响可以忽略不记,所以F(N)=N^{2} 。

所有我们计算时间复杂度的时候,我们其实并不一定有计算精确的次数,只需要一个大概就好了,所有我们这里可以用大O的渐进表示法。

2.1.2 大O的渐进表示

 大O符号:是用于描述函数渐进行为的数学符号。

推导大O阶的方法:

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

所以上面例子代码的时间复杂度为:

                                                     O(N^{2})

*时间复杂度中,变量一般用N表示。

接下来再举一个让我们对大O阶渐进表示有更深一步的认识:

void Func2(int n)
{
    int count = 0;

    for(int k = 0; k<2*n ; k++)
    {
        count++;
    }

    int m = 10;
    while(m--)
    {
        count:
    }

    printf("%d\n",count);
}

 那么这个函数的时间复杂度为什么呢?

F(N)=2N+10,只保留最高项,然后去掉最高项的常数,所以最后为O(N)。

在大O渐进表示中有一些特殊的:

  • 比如有两个变量N和M,在没有特殊说明N或者M远远大于另外一个时:O(N+M);
  • O(常数)时用O(1)表示

接下来我们再来举一个例子:

const char strchr( const char* str, int character)
{
    while(*str)
    {
        if(*str==character)
            return str;

    ++str;
    }
}

这是一个在字符串中查找的函数

他的次数不固定,最好的情况为 O(1),最坏的情况是O(n),平均情况是O(n/2)。那我们该选择哪种情况呢?

这算法中我们一般选择最坏的运行情况,以保证算法的运行时间不会比它更长。

就如同我们生活中约会一样,我们到达的时间不可能比对象晚,不然后果很严重,所以我们要把最坏的时间告诉她,给我们留下充足的时间赴约。


3 算法的空间复杂度

3.1 概念

空间复杂度:也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。 空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。 空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。 注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因 此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

 3.2 实例

下面我们来看代码进行分析:

// 计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{
 if(N == 0)
 return 1;
 
 return Fac(N-1)*N;
}

该函数为阶乘递归,自身的递归每进行一次都会重新创造一个变量N,如图:

所以该函数创造的变量为N+1,用大O渐进法空间复杂度为O(N)。


4 实例分析

我们现在学习了空间复杂度和时间复杂度,那接下来我们用一道题结束今天的文章:

斐波那契数列(递归方法):

#include<stdio.h>

int Fibonacci(int N)
{
	if (N < 3)
	{
		return 1;
	}
	else
		return Fibonacci(N - 1) + Fibonacci(N - 2);
}



int main()
{
	printf("%d", Fibonacci(10));
	return 0;
}

大家想想它的时间和空间复杂度为多少呢?

在分析之前我想告诉大家的是,做这类题的时候我们画图是很有利于我们理解的,如图:

根据话题我们可以轻而易举的知道函数时间复杂度的大O为O(2^{N})(绿色部分缺少为常数所以忽略不计)

而时间复杂度呢,可能有人觉得也是O(2^{N}),答案却是错误的。那这是为什么呢?

那是因为函数是按照顺序执行的,如图函数肯定是先执行1然后执行完销毁完内存后才会执行2,

 而空间内存算的是函数执行需要的空间,当部分函数执行完的时候,空间就会被销毁,后续的函数会重新利用这一部分被销毁的空间,所以我们在这里算空间复杂度的时候,又该选择执行最大的一条如图蓝色部分,则最大申请变量为N+1,用大O渐进法表示则为:O(N)。

*大家注意

时间的消逝是回不来了的

空间是一直在的,是可以重复利用的


5 结论

姜糖最近因为特殊情况正逐步向着数据结构的方向前进,如有不足请大佬们帮我指出,姜糖也会不断去更新自己博客,不断反思完善自我,与各位一起迈入大牛之列。希望大家能一键三连,谢谢大家!

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

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

相关文章

遇见桂林山水画廊,深层互联自动讲解耳机走进漓江

遇见山水&#xff0c;听懂山水。由深层互联独家打造&#xff0c;桂林漓江山水画廊导览工程&#xff0c;于不久前正式启动&#xff0c;声情并茂的真人语音引导着游客&#xff0c;走进有声有色的山水画卷中。 桂林山水甲天下&#xff0c;得天独厚的自然景观&#xff0c;奇幻瑰丽…

matlab使用教程(92)—流线图、流带图和流管图

1.使用向量数据显示流线图 MATLAB 向量数据集 wind 代表北美地区的气流。本示例结合使用了几种方法&#xff1a; 利用流线跟踪风速 利用切片平面显示数据的横截面视图 利用切片平面上的等高线提高切片平面着色的可见性 1.1确定坐标的范围 加载数据并确定用来定位切片平面…

【WEEK15】 【DAY3】Scheduled Tasks【English Version】

2024.6.5 Wednesday Following 【WEEK15】 【DAY2】【DAY3】Email Tasks【English Version】 Contents 17. Asynchronous, Scheduled, and Email Tasks17.3. Scheduled Tasks17.3.1. Two Annotations:17.3.2. Cron Expression17.3.3. Modify Springboot09TestApplication.java …

html5实现端午节网站源码

文章目录 1.设计来源1.1 端午首页页面1.2 端午由来页面1.3 端午图集页面1.4 端午活动页面1.5 给我留言页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/139524377 ht…

工作备忘录软件有哪些 记事备忘提醒三合一的备忘录

在工作中&#xff0c;我总是觉得自己脑子好像不够用&#xff0c;一会儿是这个项目的进度要跟踪&#xff0c;一会儿是那个会议的要点要记录。每天都在忙碌与混乱中度过&#xff0c;我甚至开始怀疑自己是否适合这份工作。 备忘录不仅是一个简单的记事工具&#xff0c;像敬业签这…

【数据分享】中国高技术产业统计年鉴(2023年)

大家好&#xff01;今天我要向大家介绍一份重要的高技术产业发展情况统计数据资源——《中国高技术产业统计年鉴》。这份年鉴涵盖了从2023年中国高技术产业发展情况的全面数据&#xff0c;并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 …

Java利用Scanner实现控制台文字游戏,Java实现猜数字游戏简易文字游戏,Java实现石头剪刀布简易文字游戏

1、猜数字游戏简易文字游戏 public static void main(String[] args) {//文本扫描器Scanner scanner new Scanner(System.in);//获取本次游戏的正确数字int num new Random().nextInt(100);System.out.println("开始猜数字游戏&#xff0c;输入数字后按enter");whi…

DLL文件修复dffsetup3.3.90,带Keygen

之前分享过DirectX与4DDiGDLLFixer&#xff0c;今天再分享一款&#xff0c;名字叫DLLfiles Fixer&#xff0c;中文版带key你懂的&#xff0c;对于玩游戏人来说&#xff0c;经常因为少了某个dll文件无法运行&#xff0c;DLL-files Fixer能够非常方便的修复。 软件功能 可以消除…

提升学校管理效率,智慧校园解决方案来袭

你是不是曾为学校管理效率低下而困扰&#xff1f;是不是对传统的教育模式感到力不从心&#xff1f;现在&#xff0c;一个划时代的解决方案来啦——智慧校园&#xff01; 随着科技的不断发展&#xff0c;智慧校园正逐渐改变着学校的管理方式。通过将信息技术与教育相结合&#x…

【Java数据结构】详解LinkedList与链表(一)

&#x1f512;文章目录&#xff1a; 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.ArrayList的缺陷 3.链表的概念及结构 4.无头单向非循环链表的实现 4.1成员属性 4.2成员方法 createList display——打印链表 addFirst——头插 addLast…

70 Realistic Mountain Environment Textures Cliff(70+张真实的山地环境纹理)

大量适合山区和其他岩石环境的纹理--悬崖、岩石、砾石等等 每个纹理都是可贴的/无缝的,并且完全兼容各种不同的场景--标准Unity地形、Unity标准着色器、URP、HDRP等等都兼容。 所有的纹理都是4096x4096,并包括一个HDRP掩码,以完全支持HDRP。 特点。 70种质地 70种材料 70个地…

000002 - Hadoop环境安装

Hadoop及其大数据生态圈 1. 背景2. 实践2.1 Linux服务器准备2.2 在其中一台服务器上安装JDK2.3 在其中一台服务器上安装HADOOP2.4 本地模式运行一个hadoop案例 3. 自动化部署 1. 背景 要搭建Hadoop集群环境&#xff0c;我们需要执行如下 准备三台Linux服务器&#xff0c;服务…

【Linux驱动】【手把手配置3568寄存器】点亮RK3568的一颗LED

【硬件】 3568的LED9 &#xff1a;引脚 GPIO0 B7 【配置GPIO的复用】 找配置复用关系的寄存器基地址、偏移地址、对应配置的GPIO。 查找&#xff1a;io -r -4 0xfdc2000c 系统设置的默认值 结果为1&#xff0c;意思是只有bit 0是1&#xff0c;其他全都为0。所以系统默认就是…

【面试干货】 非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较

【面试干货】 非关系型数据库&#xff08;NoSQL&#xff09;与 关系型数据库&#xff08;RDBMS&#xff09;的比较 一、引言二、非关系型数据库&#xff08;NoSQL&#xff09;2.1 优势 三、关系型数据库&#xff08;RDBMS&#xff09;3.1 优势 四、结论 &#x1f496;The Begin…

论文合集整理推荐2024.6.4

论文合集整理推荐2024.6.4 原创 小王搬运工 时序课堂 2024-06-04 20:12 四川 ‍2012年论文合集&#xff1a;论文入口 ‍2019年论文合集&#xff1a;论文入口 2021年论文合集&#xff1a;论文入口 2022年论文合集&#xff1a;论文入口 2023年论文合集&#xff1a;论文入口…

数据结构---力扣 20.有效的括号 (C语言

1.链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09;【点击即可跳转】 思路&#xff1a; 使用 栈 来完成操作 1.左括号-- 入栈 2.右括号-- 判断出栈顶的左括号与右括号是否匹配 如果匹配-->继续 不匹配-->终止 代码中 栈 的基本实现&#xff0c;不在以下展示&…

两站图片滑动对比效果实现(VUE3)

像这种图片滑动对比的效果&#xff0c;网上还不少见吧&#xff0c;但是网上却不好找到完整现成的实现代码&#xff0c;我找到几个地方有类似的代码&#xff0c;但是都不好直接移植到代码里&#xff0c;因为很多都是使用原生htmlcssjs实现&#xff0c;太复杂了。反而不好应用到v…

【Python Cookbook】S02E04 文本模式的匹配和查找 match()、search()、findall() 以及 捕获组和 + 的含义

目录 问题解决方案讨论 问题 本文讨论一些按照特定的文本模式进行的查找和匹配。 解决方案 如果想要匹配的只是简单文字&#xff0c;通常我们使用一些内置的基本字符串方法即可&#xff0c;如&#xff1a;str.find()&#xff0c;str.startwith()&#xff0c;str.endswith() …

MySQL数据库数据恢复方案应对没有where误操作导致的大量数据更新或删除

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

二分答案-acwing-102. 最佳牛围栏

题目传送门&#xff1a;t​​​102. 最佳牛围栏 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/104/ 解题思路 整体解析 按照题目要求我们要找到一块连续的区域&#xff0c;使其里面每块地里面的平均值最大&#xff0c;且这块区域的长度要大于f 二分处理…