【数据结构】_1.集合与复杂度

news2025/1/6 19:39:09

目录

1. 集合框架

2. 时间复杂度

2.1 时间复杂度和空间复杂度

2.2 时间复杂度的概念

2.3 大O的渐进表示法

2.3.1 精确的时间复杂度表达式

2.3.2 大O渐进表示法的三条规则

2.3.3 时间复杂度的最好、平均与最坏情况

2.4 时间复杂度计算示例

3.空间复杂度


1. 集合框架

Java集合矿机又被称为集合容器,是定义在java.util包下的一组接口和其实现类。

主要表现为将多个元素置于同一个单元中,用于对这些元素进行快速、便捷地存储、检索、管理;

2. 时间复杂度

2.1 时间复杂度和空间复杂度

算法效率分析为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,空间效率被称为空间复杂度。时间复杂度主要衡量算法的运行速度,空间复杂度主要衡量算法的额外空间。

计算机的飞速发展使得计算机的存储容量已经达到了很高的程度,目前衡量一个算法优劣的重要标准是时间复杂度;

2.2 时间复杂度的概念

在计算机科学中,算法的时间复杂度是一个数学函数,它定量地描述了该算法的运行时间。

一个算法所花费的时间与其语句的执行次数成正比例,算法中的基本操作的执行次数就是算法的时间复杂度;

2.3 大O的渐进表示法

2.3.1 精确的时间复杂度表达式

试分析以下代码的时间复杂度:

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

 分析如下:

精确的时间复杂度表达式为:F(N) = N^2 + 2*N + 10;

实际在我们计算时间复杂度时,并不需要精确的执行次数,而只需要大概执行次数,故而引入大O渐进表示法;

2.3.2 大O渐进表示法的三条规则

(括号中的表达式与上表达式简化过程对应)

(1)用常数1取代运行时间中所有的加法常数;(F(N) = N^2 + 2*N + 1)

(2)在修改后的运行次数函数中,只保留最高阶项;(F(N) = N^2 )

(3)如果最高阶项存在且不是1,则去除与这个项目相乘的常数;

(假如表达式为F(N) = 3*N^2  则去掉3,改为F(N) = N^2 )

即大O渐进表示法是将精确的时间复杂度表达式去掉了对结果影响不大的项,更为简洁地表示出了执行次数;

2.3.3 时间复杂度的最好、平均与最坏情况

(1)最坏情况:任意输入规模的最大运行次数(上界)

(2)平均情况:任意输入规模的期望运行次数

(3)最好情况:任意输入规模的最小运行次数(下界)

一般的时间复杂度指的就是最坏情况下的时间复杂度:

如在一个长度为N的数组中查找某个元素,最好情况是1次找到,最坏情况是N次找到,平均情况是N/2次找到,但数组中搜索数据的时间复杂度是O(N)

2.4 时间复杂度计算示例

例1:

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

时间复杂度为O(N);

例2:

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

时间复杂度是O(M+N);

例3:

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

 时间复杂度是O(1);

例4:(冒泡排序)

    public 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(N^2);

注:① N代表的是当前问题规模而非程序中的变量;

② 最好情况是数组本身就有序,只需遍历一次,时间复杂度是O(N);

③ 还有稍有区别的冒泡排序写法:

public static void bubble_sort(int[] array){
        for(int i=0;i<array.length-1;i++){
            boolean flag = false;
            for(int j=0;j<array.length-1-i;j++){
                if(array[j]>array[j+1]){
                    int tmp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=tmp;
                    flag=true;
                }
            }
            if(flag==false){
                return;
            }
        }
    }

其计算复杂度过程为:

故其时间复杂度也为O(N^2); 

例5:(二分查找)

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

计算过程如下:

也可用列举法:当数据个数分别为2,4,8时,需要执行的次数依次为2,3,4,故而有:2^(x-1)=N,即x=logN+1;

有:时间复杂度是O(logN); 

例6:计算阶乘递归factorial的时间复杂度:

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

三目运算符的时间复杂度为1,执行了N次,即:时间复杂度为O(N);

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

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

求时间复杂度过程如下:

根据以上二叉树可知:时间复杂度为 O(2^N);

注:递归的时间复杂度是递归的次数*每次递归后代码的执行次数

3.空间复杂度

空间复杂度是对一个算法在运行过程中临时占用储存空间大小的量度。

空间复杂度不是程序占用了多少bytes的空间,而计算的是临时变量的个数,该空间不会随着问题规模的增大而增大;

空间复杂度与时间复杂度计算方法类似,也使用大O渐进表示法;

例1:冒泡排序

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

例2:斐波那契数列

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

该程序将计算的斐波那契数列计算的每一个数字都放在fibArray数组中,故而空间复杂度为O(N);

例3:

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

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

例4:

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

空间复杂度为O(N);

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

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

相关文章

【多线程例题】编写代码, 实现多线程数组求和.【本题学习关键点:通过一个类 进行加法】

【多线程例题】编写代码, 实现多线程数组求和. import java.util.Random;/*** 题目名称 :* 编写代码, 实现多线程数组求和.* 题目内容 :* 1. 给定一个很长的数组 (长度 1000w), 通过随机数的方式生成 1-100 之间的整数.* 2. 实现代码, 能够创建两个线程, 对这个数组的所有元素求…

CORTEX-M系列处理器

1.ARM处理器的发展 随着智能终端、人工智能、5G、物联网等技术的快速发展&#xff0c;半导体行业蓬勃发展了数十年。处理器芯片作为这些技术的“心脏”&#xff0c;迎来了井喷式的增长。世界主流的处理器分为4大类&#xff1a;Interl公司和AMD公司的的X86架构处理器&#xff0…

利用集合框架实现-超市会员管理系统

借助集合框架来实现超市会员管理系统&#xff0c;实现以下功能&#xff1a; 1.开卡 2.积分累计 3.查询剩余积分 4.积分兑换 5.修改密码 6.退出 -------------------------------------------------------------------------------------------------- 展示&#x…

第一堂棒球课:MLB棒球大联盟青训体系·野球1号位

介绍MLB棒球大联盟青训体系 1. 引言 这里我们将深入探讨MLB棒球大联盟青训体系的故事&#xff0c;了解它是如何成为全球青少年最梦寐以求的梦想&#xff0c;以及它对世界棒球运动产生的深远影响。 MLB棒球大联盟青训体系&#xff0c;即MLB Youth Coaching Program&#xff0c…

java项目之东理咨询交流论坛(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的东理咨询交流论坛。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架…

Java并发编程(10) —— ReentrantLock类详解

一、ReentrantLock介绍 ReentrantLock是juc.locks包中的一个独占式可重入锁&#xff0c;相比synchronized&#xff0c;它可以创建多个条件等待队列&#xff0c;还支持公平/非公平锁、可中断、超时、轮询等特性。 ReentrantLock实现Lock接口实现了一个锁所需的方法&#xff0c…

CSS基础特性

一、CSS概述 1.1、概述 CSS&#xff08;层叠样式表&#xff09;是一种用来表现HTML&#xff08;标准通用标记语言的一个应用&#xff09;或XML&#xff08;标准通用标记语言的一个子集&#xff09;等文件样式的计算机语言。CSS 不仅可以静态地修饰网页&#xff0c;还可以配合…

[JVM] 3. 类加载子系统(2)-- 类加载器、双亲委派机制(JDK1.8及之前)及其他

前言 JDK1.8及之前和JDK9及之后的双亲委派模型是不一样的&#xff0c;这里学习了1.8及以前的双亲委派模型&#xff0c;记录笔记 一、类加载器 1.8之前主要是这几种类加载器&#xff1a; 1. 启动类加载器(Bootstrap ClassLoader)&#xff1a; 负责将存放在<JAVA_HOME>…

JavaScript中值和变量

值是指可以存储在计算机内存中的数据。这些数据可以是数字、字符串、布尔值、对象等。变量是一种用于存储值的容器。 ● 在JS中&#xff0c;我们可以使用let参数也创建一个变量&#xff0c;使用给变量赋值&#xff0c;例如 let ITshare "IT知识一享";● 之后我们打…

力扣小技巧:如何用最简单的方式实现小写字母转换

本篇博客会讲解力扣“709. 转换成小写字母”的解题思路&#xff0c;这是题目链接。 本题的解法非常简单&#xff0c;只需利用tolower函数即可。这个函数的作用是将所有大写字母转换为小写字母&#xff0c;而对其他字符不做任何改变。 char * toLowerCase(char * s){// 把字符串…

1769_Source Insight数字前缀后缀乱码解决方法

全部学习汇总&#xff1a; GreyZhang/editors_skills: Summary for some common editor skills I used. (github.com) 这算是一个偶然的发现&#xff0c;写代码的时候发现十六进制的数字显示前缀0x显示错误。如果只输入一个0x正常&#xff0c;写成一个十六进制数据诸如0x123之后…

分析中心常见的协议字段以及语法

布尔运算符 基本语法 图中以及描述得很详细了。 日志检索高级查询语法 通配符查询&#xff1a;在一项内的单个字符用&#xff1f;去查&#xff0c;多个字符用*去查询&#xff0c;例如想查mysql和mssql就可以使用db_type:m?sql 去查询&#xff0c;而要查sql结尾就用 *sql 去…

SQL Server启用sa账户

一、简介 在安装好 SQL Server 后&#xff0c;默认 sa 用户是禁用且也没有启用 SQL Server 登陆验证&#xff0c;这需要手动开启。接下来&#xff0c;开始我们今天的教程吧。 二、sa 登陆 2.1 启用 sa 首先&#xff0c;使用 Windows 验证登陆 登陆成功后&#xff0c;找到…

Java032——反射(Reflection)

一、Java中的反射及作用 Java的反射(reflection)机制是指在程序的运行状态中&#xff1a; 可以构造任意一个类的对象&#xff0c;可以了解任意一个对象所属的类&#xff0c;可以了解任意一个类的成员变量和方法&#xff0c;可以调用任意一个对象的属性和方法。 一句话&#…

数据结构day2(2023.7.15)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;定义车的信息&#xff1a;品牌&#xff0c;单价&#xff0c;颜色&#xff0c;车牌号 struct Car{char name[20]; //品牌int price; //单价char color[10] //颜色char id[20] //车牌…

Spring【 Spring整合MyBatis、SpringAOP(AOP简介 、AOP相关术语、AOP入门)】(五)-全面详解(学习总结---从入门到深化)

目录 Spring整合MyBatis_准备数据库和实体类 Spring整合MyBatis_编写持久层接口和service类 Spring整合MyBatis_Spring整合Junit进行单元测试 Spring整合MyBatis_自动创建代理对象 SpringAOP_AOP简介 SpringAOP_AOP相关术语 SpringAOP_AOP入门 Spring整合MyBatis_准备数据…

推荐几个github上非常受欢迎的库

推荐几个github上非常受欢迎的库 The Book of Secret Knowledge the-book-of-secret-knowledge 这个仓库里边包含了一系列非常有趣的手册、备忘单、博客、黑客、单行话、cli/web 工具等。 Coding Interview University coding-interview-university 这里列出的项目可以帮助…

基于Ubuntu20.4的TMS320C6678开发环境(CCS8.3.1)的搭建

网上关于ccs的安装大多是基于ccs5及以前的版本安装介绍或基于windows版本的ccs软件的安装,没有关于linux系统上安装CCS8.3.1的集成开发环境。本文介绍在ubuntu20.4的系统上安装ccs8.3.1的DSP开发环境&#xff0c;本文包括CCS软件和插件的下载&#xff0c;安装。本文在ubuntu20.…

fpga下载程序到flash后无法在重新上电后自动加载程序

可能是接的调试器没有断电&#xff0c;断电一次再给调试器上电。如果调试器一直连着可以连续断电上电fpga开发板&#xff0c;直到成功。fpga貌似上电后什么程序都不加载则引脚为高电平&#xff0c;而vivado默认.xdc的BITSTREAM.CONFIG.UNUSEDPIN&#xff08;未使用的引脚&#…

vue3 - 01搭建工程

1. 使用vue-cli创建工程 1. 命令&#xff1a;vue create xxx2. 选择vue3版本3. 进入目录4. 运行&#xff1a; npm run serve 在执行完运行指令后如果报错请查看是否是以下错误&#xff0c;如果是可以按以下步骤进行解决&#xff1a; ERROR in Conflict: Multiple assets emit …