java - 数据结构,时间复杂度和空间复杂度

news2024/11/27 16:39:31

一、算法效率

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

二、时间复杂度

2.1、时间复杂度的概念

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

2.2、时间复杂度

2.2.1、大O的渐进表示法

public static 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++;
        }
    }

在这里插入图片描述

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

推导大O阶方法:

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

所以func1的时间复杂度为:O(N^2)

通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。
另外有些算法的时间复杂度存在最好、平均和最坏情况:

  • 最坏情况:任意输入规模的最大运行次数(上界)
  • 平均情况:任意输入规模的期望运行次数
  • 最好情况:任意输入规模的最小运行次数(下界)

例如:在一个长度为N数组中搜索一个数据x
最好情况:1次找到
最坏情况:N次找到
平均情况:N/2次找到
在实际中一般情况关注的是算法的 最坏 运行情况,所以数组中搜索数据时间复杂度为O(N)

2.2.2、计算func2的时间复杂度

public static 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);
    }

在这里插入图片描述
基本操作执行了2N+10次,通过推导大O阶方法知道,时间复杂度为 O(N)

2.2.3、计算func3的时间复杂度

public static void func3(int N, int M) {
        int count = 0;
        for (int k = 0; k < M; k++) {
            count++;
        }
        for (int k = 0; k < N ; k++) {
            count++;
        }
        System.out.println(count);
    }

在这里插入图片描述
基本操作执行了M+N次,有两个未知数M和N,时间复杂度为 O(N+M)

2.2.4、计算func4的时间复杂度

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

在这里插入图片描述
基本操作执行了100次,通过推导大O阶方法,时间复杂度为 O(1)

在计算时间复杂度的时候,不要只看代码,要结合思想

2.2.5、计算冒泡排序的时间复杂度

//冒泡排序
    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;
            }
        }
    }

在这里插入图片描述
基本操作执行最好N次,最坏执行了(N*(N-1))/2次,通过推导大O阶方法+时间复杂度一般看最坏,
时间复杂度为 O(N^2)

2.2.6、计算二分查找的时间复杂度

public static 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;
    }

在这里插入图片描述

基本操作执行最好1次,最坏O(logN)次,时间复杂度为 O(logN) ps:logN在算法分析中表示是底数为2,对数为N。有些地方会写成lgN。(建议通过折纸查找的方式讲解logN是怎么计算出来的)(因为二分查找每次排除掉一半的不适合值,一次二分剩下:n/2 两次二分剩下:n/2/2 = n/4)

2.2.7、计算阶乘递归factorial的时间复杂度

// 计算阶乘递归factorial的时间复杂度?
    public static long factorial(int N) {
        return N < 2 ? N : factorial(N-1) * N;
    }

在这里插入图片描述
通过计算分析发现基本操作递归了N次,时间复杂度为O(N)

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

// 计算斐波那契递归fibonacci的时间复杂度?
    public static int fibonacci(int N) {
        return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);
    }

在这里插入图片描述
通过计算分析发现基本操作递归了2N次,时间复杂度为O(2N)。(建议画图递归栈帧的二叉树讲解)

三、空间复杂度

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

3.1、计算bubbleSort的空间复杂度

// 计算bubbleSort的空间复杂度?
    public static 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;
            }
        }
    }

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

3.2、计算fibonacci的空间复杂度

// 计算fibonacci的空间复杂度?
    public static 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;
    }

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

3.3、计算阶乘递归Factorial的时间复杂度

// 计算阶乘递归Factorial的时间复杂度?
    long factorial(int N) {
        return N < 2 ? N : factorial(N-1)*N;
    }
    

递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)

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

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

相关文章

子不语发生工商变更:注册资本增至3000万元,预计全年净利润下滑

近日&#xff0c;浙江子不语电子商务有限公司&#xff08;下称“子不语”&#xff09;发生工商变更&#xff0c;其中注册资本由2600万元增至3000万元。据天眼查信息显示&#xff0c;子不语的全资股东为ZIBUYU INTERNATIONAL LIMITED&#xff0c;法定代表人为华丙如。 据了解&am…

【前端验证】验证自动化脚本的最后一块拼图补全——gen_tb

我们的目标是┏ (゜ω゜)=☞芯片前端全栈工程师~喵! 前言 在完成了 【芯片前端】可能是定向验证的巅峰之作——auto_testbench_尼德兰的喵的博客-CSDN博客 【python脚本】用于生成简单握手接口与自测环境的gen_uvm_agent脚本_尼德兰的喵的博客-CSDN博客 两个工具之后,对于…

[附源码]计算机毕业设计springboot体育器材及场地管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Unity数字孪生UI设计——导入视频

Unity导入mp4或URL链接 1、准备视频 Uinty3D常用视频格式: mov、.mpg、.mpeg、.mp4、.avi .asf 如果都不识别,试试转换成ogv格式 转换完成之后,将视频素材文件拖入Uinty Assets文件夹内 2、创建UI及添加组件 1、右键Assets文件夹或任意文件夹→Create→Render Texture纹理渲…

七、Sleuth分布式链路请求跟踪

SpringCloud Sleuth分布式链路请求跟踪 概述 为什么会出现这个技术&#xff1f;需要解决哪些问题&#xff1f; 问题 在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果&#xff0c;每一个前端请求都会形…

[附源码]计算机毕业设计springboot面向高校活动聚App

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

半正定Toeplitz矩阵的范德蒙德分解

半正定Toeplitz矩阵的范德蒙德分解 Toeplitz矩阵的定义&#xff1a;Matrices whose entries are constant along each diagonal are called Toeplitz matrices. 形如 T[r0r1r2r3r−1r0r1r2r−2r−1r0r1r−3r−2r−1r0](1)\boldsymbol{T}\left[ \begin{matrix} r_0& r_1&…

前端开发调试技巧

1、alert弹框调试 正对js代码的调试&#xff0c;我们往往需要获取某些变量的值&#xff0c;于是在早期我们往往通过alert方法将变量的值通过弹窗的形式进行打印。 <script>alert(测试弹框) </script>2、console控制台打印 alert方法对于我们来说或许仍然比较繁琐…

专题·AC自动机

初见安——&#xff01;&#xff01;这里是咕咕咕好久好久的樱狸QvQ 考完初赛了 有一点点的空闲时间 来整理一下博客【因为发现忘性很大……超过一个月没用的东西就记不住了QAQ 前置知识&#xff1a;KMP&#xff0c;tire树。 一、AC自动机 其实AC自动机就是在tire树上KMP。 …

点击化学PEG试剂DBCO-PEG4-NHS,1427004-19-0知识特点总结

一、描述&#xff1a; DBCO-PEG4-NHS酯是一种含有NHS酯的点击化学PEG试剂&#xff0c;能够在中性或稍碱性条件下与伯胺&#xff08;例如赖氨酸残基的侧链或氨基硅烷涂层表面&#xff09;特异有效地反应&#xff0c;形成共价键。亲水性PEG间隔臂提高了水溶性&#xff0c;并提供了…

ConcurrentHashMap

我们说ConcurrentHashMap是用在多并发环境下的HashMap JDK1.7 segment数组HashEntry数组链表&#xff08;即两个数组挂一个链表&#xff09; 上锁的时候锁的是segment数组&#xff0c;采用分段锁&#xff0c;每一把锁只锁一个Segment&#xff0c;默认是这个数组大小为16&…

【D3.js】1.13-动态设置每个 Bar 的坐标

title: 【D3.js】1.13-动态设置每个 Bar 的坐标 date: 2022-12-01 16:33 tags: [JavaScript,CSS,HTML,D3.js,SVG] 虽然创建了多个rect&#xff0c;但是都重叠在一起&#xff0c;如何将他们分列开来呢&#xff1f; 一、学习目标 使用回调函数动态设置坐标 .attr(“x”,(d,i)>…

laravel vue tailwind

下载laravel最新7.x composer create-project --prefer-dist laravel/laravle blog 7.x-dev cd blog valet link blog valet links blog.test 测试通过后&#xff0c;开始安装tailwind npm i npm i tailwindcss autoprefixer postcss7 都是最新版应该也没有什么问题 在根目录下…

UE的Blend Profile

参考&#xff1a;Animation Blend Profile in Unity 参考&#xff1a;Unreal Engine - How to make a Blend Profile 参考&#xff1a;blend-masks-and-blend-profiles-in-unreal-engine 什么是Blend Profile Animation Blend Profile is a UE4 animation system feature that …

aws eks 使用keycloak集成eks oidc访问apiserver

资料 OpenID Connect Tokens Kubernetes 与 OpenID 集成 SSO 登录测试 Introducing OIDC identity provider authentication for Amazon EKS Understanding Amazon Cognito user pool OAuth 2.0 grants 在 Kubernetes 中使用 Keycloak OIDC Provider 对用户进行身份验证 深…

Koa2基础笔记

目录 一、快速入门 二、中间件 链式调用 洋葱圈模型 异步处理 三、路由 koa-router 四、请求参数解析 处理URL参数 处理body参数 五、错误处理 原生的错误处理 使用中间件 一、快速入门 新建文件夹使用VSCode打开&#xff0c;终端运行npm init -y生成package.json…

[附源码]计算机毕业设计springboot水果管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

冬季寒冷,普通空调如何做到智能控制,增温又降耗的?

寒冷的冬日总少不得取暖的工具&#xff0c;空调成为人们的优先选择。但是&#xff0c;在办公大楼、商场等需要长时间空调供暖&#xff0c;空调又多的地方&#xff0c;空调控制让不少人感觉到了困扰。上下班时间空调多&#xff0c;检查慢&#xff0c;如果漏掉其中一个&#xff0…

C++——类和对象讲解

C——类和对象讲解总览 本篇文章的讲解将按照上述的方式&#xff0c;逐层递进&#xff0c;进一步帮你拿捏C类和对象这部分。 类和对象上&#xff08;基础篇&#xff09; 1、初识面向对象编程&#xff1a; 初步了解面向过程和面向对象的区别 举个比较感人的例子用来帮助铁子…

Qt视频监控系统一个诡异问题的解决思路(做梦都想不到)

一、前言 由于Qt版本众多&#xff0c;几百个版本之间存在不兼容的情况&#xff0c;为此如果要兼容很多版本&#xff0c;没有取巧的办法和特殊的捷径&#xff0c;必须自己亲自安装各个版本编译运行并测试&#xff0c;大问题一般不会有&#xff0c;除非缺少模块&#xff0c;小问…