集合及数据结构第二节————算法、时间复杂度和空间复杂度

news2024/11/15 21:56:47

系列文章目录

集合及数据结构第二节————算法、时间复杂度和空间复杂度

算法、时间复杂度和空间复杂度

  1. 数据结构和算法的关系
  2. .算法的定义
  3. 算法的特性
  4. 算法设计的要求
  5. 算法效率
  6. 时间复杂度的概念
  7. 大O的渐进表示法
  8. 常见时间复杂度计算举例
  9. 常见空间复杂度计算举例

文章目录

  • 系列文章目录
    • 集合及数据结构第二节————算法、时间复杂度和空间复杂度
  • 算法、时间复杂度和空间复杂度
  • 一、算法
    • 1.数据结构和算法的关系
    • 2.算法的定义
    • 3.算法的特性( * *
      • 输入和输出
      • 有穷性
      • 确定性
      • 可行性
      • 简单性
    • 4.算法设计的要求( * * *
      • 正确性
      • 可读性
      • 健壮性
      • 高效性
    • 5.算法效率
  • 二、时间复杂度
    • 1.时间复杂度的概念
    • 2. 大O的渐进表示法( * *
    • 3.推导大O阶方法( * *
    • 4.常见时间复杂度计算举例
      • 【实例1】
      • 【实例2】
      • 【实例3】
      • 【实例4】
      • 【实例5】
      • 【实例6】
      • 【实例7】
    • 4.总结
  • 三、空间复杂度
    • 1.常见空间复杂度计算举例
      • 【实例1】
      • 【实例2】
      • 【实例3】


一、算法

1.数据结构和算法的关系

数据结构是组织和管理数据的方式,算法则是解决问题的方法。数据结构和算法是紧密相关的,因为一个好的算法必须基于一个高效的数据结构。

具体来说,数据结构提供了存储和组织数据的方式,算法则利用这些数据结构来实现特定的任务。例如,在查找某个元素时,可以使用二分查找算法,它需要一个有序的数据结构(如数组)来实现。对于不同的算法,可能需要不同的数据结构来实现。

因此,学习数据结构和算法可以帮助我们更好地理解如何使用各种数据结构来解决问题,以及如何选择最适合特定问题的算法。同时,了解不同算法的复杂度和效率,也可以帮助我们编写更高效、更优化的代码。

2.算法的定义

算法是一组用于解决特定问题或执行特定任务的有序步骤。算法通常由一系列指令或规则组成,这些指令描述了解决问题或完成任务的过程。算法可以应用于各种领域,包括计算机科学、数学、工程学和物理学等。算法的设计和优化是计算机科学领域的核心问题之一,人们一直在努力设计出更高效、更复杂、更卓越的算法来解决日益增长的问题。

3.算法的特性( * *

算法具有五个基本特性:输入、输出、有穷性、确定性和可行性等。

输入和输出

算法具有零个或多个输入,因为对与绝大多数算法类实输入是必要的。但是只要求打印时,就不需要输入任何参数。因此算法的输入可以为零。
算法至少有一个或者多个输出,如果不输出那么这个算法就没有意义。

有穷性

有穷性:算法必须能在有限步骤内完成,并且要自动结束而不出现无限循环否则就不是算法。

确定性

算法在任何时候给定相同的输入,都应该产生相同的输出,即算法的结果不受计算机硬件和软件等环境的影响。

可行性

算法必须是可行的,也就是说,无论从时间还是空间上来看,算法都必须能够在实际应用中被实现。

简单性

算法应当尽可能简单,以便于程序员的实现和维护。

4.算法设计的要求( * * *

正确性

正确性:算法是针对一个具体问题的求解而设计的。算法是否正确,通常要用某种程序设计语言将其转化为程序,然后检验,其执行结果应当满足预先规定的功能和性能要求。程序的正确性可以从下面四个层次理解:

  1. 算法程序没有语法错误
  2. 算法程序对合法的输入数据能够产生满足要求的输出结果
  3. 算法程序对于非法的输入数据能够得到满足规格说明的结果
  4. 算法程序对于精心选择的,甚至刻意为之的测试数据都有满足要求的输出结果

可读性

算法设计的一大目的是为了人的阅读和交流,其次才是为计算机执行,因此算法应该易于理解,另外,晦涩难懂大的程序容易有较多难以察觉的错误而难于调试

健壮性

算法健壮性是指算法对于输入数据的变化或异常情况具有一定的容错能力,能够正确、稳定地输出结果。在实际应用中,输入数据往往是不完美的,可能存在数据缺失、错误、异常等问题,健壮的算法能够适应这些情况,保证程序的正确性和稳定性。

高效性

算法的高效性指的是在计算资源(如时间、内存等)有限的情况下,算法能够在较短的时间内完成任务并得到正确的结果。这就要求算法具有足够的速度和空间效率(分别以算法的时间复杂度和空间复杂度来衡量),能够在处理大规模数据时保持合理的运行时间和内存占用。

算法的高效性对于实际应用非常重要,因为它可以大大提高程序的运行速度和资源利用效率,从而提高系统的整体性能。在一些特定的场景下,如大数据处理、人工智能等,算法的高效性更是至关重要的因素。

下面求斐波那契数列的算法好还是不好,为什么?该如何衡量一个算法的好坏呢?

public static long Fib(int N){
	if(N < 3){
	return 1;
	}
	 return Fib(N-1) + Fib(N-2);
}

这时候就要用到算法效率的概念了。

5.算法效率

算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。
时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,
在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

二、时间复杂度

1.时间复杂度的概念

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

2. 大O的渐进表示法( * *

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--) > 0) {
		count++;
	} 
	System.out.println(count);
}

在这里插入图片描述

Func1 执行的基本操作次数 :
在这里插入图片描述
N = 10 F(N) = 130
N = 100 F(N) = 10210
N = 1000 F(N) = 1002010

实际计算时间复杂度时,其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里就使用大O的渐进表示法。
大O符号(Big O notation):是用于描述函数渐进行为的数学符号

3.推导大O阶方法( * *

1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
使用大O的渐进表示法以后,Func1的时间复杂度为:
在这里插入图片描述

  • N = 10 F(N) = 100
  • N = 100 F(N) = 10000
  • N = 1000 F(N) = 1000000
    通过上面会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。
    另外有些算法的时间复杂度存在最好、平均和最坏情况:
    最坏情况:任意输入规模的最大运行次数(上界)
    平均情况:任意输入规模的期望运行次数
    最好情况:任意输入规模的最小运行次数(下界)
    例如:在一个长度为N数组中搜索一个数据 x
    最好情况:1次找到
    最坏情况(一般时间复杂度考虑的情况):N次找到
    平均情况:N/2次找到
    在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

4.常见时间复杂度计算举例

【实例1】

计算func2的时间复杂度

    void func2(int N) {
        int count = 0;
        for (int k = 0; k < 2 * N ; k++) {
            count++;
        }
        int M = 10;
        while ((M--) > 0) {
            count++;
        }
        System.out.println(count);
    }

在这里插入图片描述

【实例2】

计算func3的时间复杂度

void func3(int N, int M) {//M和N都属于问题的规模,在计算时间复杂度时都要用上
        int count = 0;
        for (int k = 0; k < M; k++) {//M
            count++;
        }
        for (int k = 0; k < N; k++) {//N
            count++;
        }
        System.out.println(count);

    }

在这里插入图片描述

【实例3】

计算func4的时间复杂度

oid func4(int N) {
        int count = 0;
        for (int k = 0; k < 100; k++) {
            count++;
        }
        System.out.println(count);
    }

在这里插入图片描述

【实例4】

计算bubbleSort的时间复杂度

   void bubbleSort(int[] array) {
        for (int end = array.length; end > 0; end--) {
            boolean sorted = true;
            for (int i = 1; i < end; i++) {
                if (array[i - 1] > array[i]) {//
                    Swap(array, i - 1, i);
                    sorted = false;
                }
            } if
            (sorted == true) {
                break;
            }
        }
    }

在这里插入图片描述

【实例5】

计算binarySearch(二分查找)的时间复杂度

int binarySearch(int[] array, int value) {
        int begin = 0;
        int end = array.length - 1;
        while (begin <= end) {
            int mid = begin + ((end-begin) / 2);
            if (array[mid] < value)
                begin = mid + 1;
            else if (array[mid] > value)
                end = mid - 1;
            else
                return mid;
        }
        return -1;
    }

在这里插入图片描述

【实例6】

计算阶乘递归factorial的时间复杂度
递归的时间复杂度 = 递归的次数 * 每次递归后执行的次数

    long factorial(int N) {//递归的时间复杂度 = 递归的次数 * 每次递归后执行的次数
        return N < 2 ? N : factorial(N-1) * N;
    }

在这里插入图片描述

【实例7】

计算斐波那契递归fibonacci的时间复杂度

 int fibonacci(int N) {
        return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);
    }

在这里插入图片描述

4.总结

以后常见的时间复杂度:O(logN) O(N) O(N*longN) O(N^2)

三、空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法

1.常见空间复杂度计算举例

【实例1】

计算bubbleSort的空间复杂度

void bubbleSort(int[] array) {
        for (int end = array.length; end > 0; end--) {
            boolean sorted = true;
            for (int i = 1; i < end; i++) {
                if (array[i - 1] > array[i]) {
                    Swap(array, i - 1, i);
                    sorted = false;
                }
            }
            if
            (sorted == true) {
                break;
            }
        }
    }

实例1使用了常数个额外空间,所以空间复杂度为 O(1)

【实例2】

计算fibonacci的空间复杂度

 int[] fibonacci(int n) {
        long[] fibArray = new long[n + 1];
        fibArray[0] = 0;
        fibArray[1] = 1;
        for (int i = 2; i <= n ; i++) {
            fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
        }
        return fibArray;
    }

实例2动态开辟了N个空间,空间复杂度为 O(N)

【实例3】

计算阶乘递归Factorial的空间复杂度

long factorial(int N) {
        return N < 2 ? N : factorial(N-1)*N;
    }

实例3递归调用了N次,开辟了N个栈帧(每次递归都会开辟一块空间),每个栈帧使用了常数个空间。空间复杂度为O(N)

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

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

相关文章

关于windows环境使用nginx的一些性能问题

遇到的问题 最近在一个windows环境中部署nginx&#xff0c;遇到了以下问题&#xff1a; 1. nginx启动了九个线程&#xff08;1master8woekr&#xff09;&#xff0c;但是所有链接都被1个woker接收&#xff0c;其余worker不工作 2. 用户端访问web很慢&#xff0c;登录服务器使…

xcode配置使用摄像头和相册权限,没有Info.plist文件也可以配置,解决Thread 4: signal SIGABRT报错问题

最新的Xcode更改了相册和相机的权限关键字&#xff0c;在进行真机调试&#xff0c;或真正在用户使用的时候需要添加这些权限&#xff0c;否则在程序正确时仍然会产生下面的错误&#xff1a; Thread 4: signal SIGABRT This app has crashed because it attempted to access pri…

【Web APIs】JavaScript 操作元素 ④ ( 修改元素属性示例 | 密码表单标签结构 | 密码输入框样式设置 | 右侧图标按钮设置 | JavaScript 修改元素属性示例 )

文章目录 一、案例需求二、关键要点1、密码表单标签结构2、设置盒子样式3、密码输入框样式设置4、右侧图标按钮设置5、盒子模型右侧图标按钮设置 三、JavaScript 修改元素属性示例四、完整代码示例 JavaScript 中 可以通过 DOM ( 文档对象模型 ) 操作 来 修改网页的 内容 , 结构…

牛客JS题(四十六)斐波那契数列

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 递归斐波那契数列 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><style>/* 填写样式 */</style></head><body><!-…

宝马销量崩了,不卷价格就卷铺盖

文 | AUTO芯球 作者 | 雷慢 宝马这回真天塌了&#xff0c; 还记得7月初宝马宣布涨价吗&#xff0c; 我当初就劝我那准备宝马i3的同学说&#xff0c; 别急&#xff0c;怎么涨上去的就会怎么跌回去。 这不&#xff0c;一涨价&#xff0c;价格是保住了&#xff0c;但是销量惨…

【获取本机简要配置信息】(bat)

输出结果(示例)如下 如果提示 ‘系统找不到指定的路径’ 请把set Log那行的路径换一下&#xff0c;换成一个存在的路径就行 比如直接放C盘 set LogC:\本机配置信息.txt 如果提示 “客户端没有所需的特权” 请右键后选择 “以管理员身份运行” 上代码 echo off::设置信息保存路…

【17】暴力递归改dp(下)

目录 一.两人玩游戏 二.象棋游戏 三.鲍勃存活 四.凑钱方案数问题 一.两人玩游戏 题目&#xff1a;有一个正整数数组&#xff0c;A和B两个人轮流拿数组的最左或最右的数值&#xff0c;返回最终的最高分数。 暴力递归版本 public static int win1(int[] arr) {if (arr null…

Chat App 项目之解析(三)

Chat App 项目介绍与解析&#xff08;一&#xff09;-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序&#xff0c;旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录&#xff0c;还提供了管理员登录功能&#xff0c;以便管理员可以…

webflux源码解析(1)-主流程

目录 1.关键实例的创建1.1 实例创建1.2 初始化 2.处理请求的关键流程2.1 从ReactorHttpHandlerAdapter开始2.1 DispatcherHandler的初始化2.2查找mapping handler2.3 处理请求(执行handler)2.4 返回结果处理 3.webflux的配置装配参考&#xff1a; WebFlux是Spring 5.0框架推出的…

算法的学习笔记—对称的二叉树(牛客)

&#x1f600;前言 在算法的世界中&#xff0c;二叉树是一个极其重要的数据结构。它不仅广泛应用于各种算法的设计中&#xff0c;也是面试中常见的考察点之一。今天&#xff0c;我们将深入探讨一个经典的二叉树问题——对称的二叉树&#xff0c;并且会展示如何通过Java代码来解…

趋动VAICP技术认证全球考试正式上线

8月18日&#xff0c;趋动科技主办的VAICP(VirtAl Certified Professional) Al算力池化专家认证考试正式在 Pearson VUE上线。 即日起&#xff0c;凡参加过VAICP培训的学员&#xff0c;可立即通过Pearson VUE官网注册参加考试&#xff0c;官网链接&#xff1a;https://home.pea…

是肯定,更是动力 | 一封封感谢信纷至沓来,全视通服务获赞誉

在全视通的故事里&#xff0c;有那么一群人&#xff0c;他们穿梭于全国各地&#xff0c;奔波于各种交付调试、维检。山河湖海&#xff0c;严寒酷暑&#xff0c;从晨曦至夜幕&#xff0c;他们只为兑现那份让客户更加满意的承诺。他们是使命必达的守护者——全视通服务团队。他们…

串口UART

常见通信接口 串口定义 串口定义&#xff1a; 通用串行异步收发器 通用&#xff1a;UART的应用非常广泛&#xff0c;应用领域&#xff1a;工控行业&#xff0c;电力系统等串行&#xff1a;处理器和外设之间只需连接一根信号线&#xff0c;处理器和外设数据传输是一个bit位一…

CORS跨域问题全解:原理、问题与解决方案

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

【Qt】QDesigner 源码 控件图片资源路径

qttools-5.12.12-designer-1\qttools-5.12.12-designer\qttools-5.12.12\src\designer\src\components\formeditor\images\win qttools-5.12.12-designer-1\qttools-5.12.12-designer\qttools-5.12.12\src\designer\src\components\formeditor\images\widgets

docker部署drawio

1&#xff09;介绍Drawio.io GitHub&#xff1a;GitHub - jgraph/drawio: draw.io is a JavaScript, client-side editor for general diagramming. Draw.io是一款开源的绘制流程图的工具&#xff0c;拥有大量免费素材和模板。程序本身支持中文在内的多国语言&#xff0c;创建…

【源码+文档+调试讲解】健美操评分系统

摘 要 健美操评分系统采用B/S架构&#xff0c;数据库是MySQL。系统的搭建与开发采用了先进的JAVA进行编写&#xff0c;使用了springboot框架。该系统从三个对象&#xff1a;由管理员、裁判员和用户来对系统进行设计构建。主要功能包括首页&#xff0c;个人中心&#xff0c;裁判…

2024潜力市场:工商业屋顶光伏项目开发!

随着全球对可再生能源的日益重视和“双碳”目标的持续推进&#xff0c;工商业屋顶光伏项目作为分布式光伏的主要类型之一&#xff0c;正迎来前所未有的发展机遇。 一、技术成熟度与成本降低 近年来&#xff0c;光伏技术的飞速发展显著提升了光伏组件的转换效率&#xff0c;并降…

记git仓库由局域网迁移到外网

项目管理平台&#xff1a;gitlab 一台云主机 流程&#xff1a; 1.外网机器上搭建gitlab 2.项目网站上新建空白项目 3.本机就项目切换到主分支&#xff0c;切换源&#xff1a;git remote set-url origin http://x.x.x.x:yyy/zzzz/new.git 4.登陆新平台的账号&#xff0c;使…

【吸引力法则】探究人生欲:追求深度体验与宇宙链接

文章目录 什么是人生欲&#xff1f;唤醒人生欲&#xff1a;克服配得感的三大障碍1 第一大障碍&#xff1a;法执的压制2 第二大障碍&#xff1a;家庭的继承2.1 家庭创伤的代际传递2.2 家庭文化基因的传递2.2.1 “成年人最大的美德是让自己的生活过得更加精彩。”2.2.2 荷欧波诺波…