Collection与数据结构 数据结构预备知识(一) :集合框架与时间空间复杂度

news2024/9/26 5:23:38

1.集合框架

1.1 什么是集合框架

Java集合框架,又被称为容器,是定义在java.util包下的一组接口和接口实现的一些.其主要的表现就是把一些数据放入这些容器中,对数据进行便捷的存储,检索,管理.集合框架底层实现原理其实就是各种数据结构的实现方法,所以在以后的学习中,我们会采用首先掌握这些集合底层的数据结构是如何实现的,学会用代码自己实现,最后我们在来掌握这些集合类的具体方法等内容.下面是集合框架的总览:
在这里插入图片描述
集合类在面试和笔试中也非常常见,所以这部分内容相当重要.

2. 如何学好数据结构和集合类

  1. 数据结构中涉及到的代码非常多,90%全是代码,所以死磕代码,磕成这样就可以了
    在这里插入图片描述
  2. 多画图,数据结构非常抽象,有些题不画图根本解不出来.
    在这里插入图片描述
  3. 学完基础知识之后,多刷题,在以后的笔试时候经常考到数据结构,包括在面试的时候,面试官很可能让你手撕数据结构.剑指offer和leetcode还有牛客网均可.
    在这里插入图片描述

leetcode链接
牛客网链接

3. 时间复杂度和空间复杂度

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

3.1 时间复杂度

3.1.1 时间复杂度的定义

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

3.1.2 大O的渐进表示法

计算下面的基本操作执行了几次

void func1(int N){
int count = 0;
for (int i = 0; i < N ; i++) {
	for (int j = 0; j < N ; j++) {//执行n^2次
		count++;
	}
}
for (int k = 0; k < 2 * N ; k++) {//执行2n次
	count++;
}
int M = 10;
while ((M--) > 0) {//执行10次
	count++;
}
	System.out.println(count);
}

由上述代码可知,F(N) = N^2+2N+10 ,但是在我们在实际计算时间复杂度的时候,我们并不一定要计算精确的次数,而只需要大概执行的次数,那么我们就用大O渐进法来表示.

3.1.3 推导大O的方法

  1. 用常数1取代运行时间中所有的加法常数
  2. 在修改后的运行次数函数中,只保留最高阶项
  3. 如果最高项存在且系数不为1,则把最高项的系数改为1即可

通过上面的分析,我们会发现,大O渐进法去除了那些对结果影响不大的项,简洁明了的表示出了执行次数.
另外有些算法的时间复杂度存在最好,平均和最坏的情况.
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)
例如:在一个长度为N数组中搜索一个数据x
最好情况:1次找到
最坏情况:N次找到
平均情况:N/2次找到
在实际情况中,我们在衡量时间复杂度的时候,一般都说的是最坏的情况,所以上述数组搜索的时间复杂度是O(N).

3.1.4 常见时间复杂度举例

[实例1]

void func2(int N) {
	int count = 0;
	for (int k = 0; k < 2 * N ; k++) {//执行2N次
		count++;
	}
	int M = 10;
	while ((M--) > 0) {//执行10次
		count++;
	}
	System.out.println(count);
}
//F(N) = 2N+10,通过大O的渐进表示法的化简,我们得到了时间复杂度为O(N).

[实例2]

void func3(int N, int M) {
	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);
}
//F(N)=M+N,根据化简后得到时间复杂度O(N+M). 

[实例3]

void func4(int N) {
	int count = 0;
	for (int k = 0; k < 100; k++) {//执行100次
		count++;
	}
	System.out.println(count);
}
//F(N)为常数,所以直接把常数改为1,不存在最高次项,所以时间复杂度为O(1).

[实例4] (冒泡排序)

void bubbleSort(int[] array) {
for (int end = array.length; end > 0; end--) {//执行N次
	boolean sorted = true;
	for (int i = 1; i < end; i++) {//执行N-1次
		if (array[i - 1] > array[i]) {
			Swap(array, i - 1, i);
			sorted = false;
		}
	}
	if (sorted == true) {
		break;
		}
	}
}
//F(N) = N*(N-1),化简后为O(N^2).

看完上述实例之后,有的同学就会问了,好像时间复杂度只看for语句的循环条件就可以了,其实这种说法不准确,我们要结合代码的具体逻辑来分析.下面我们举一个例子来推翻这种不准确的说法.
[实例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;
}

我们下面通过画图来说明问题
在这里插入图片描述
从上述分析我们可以知道,时间复杂度不可以只单单看for或while的循环条件,我们还是需要明白其中的逻辑来分析.上面我们就是通过画图来分析,也印证了数据结构的学习需要"多画图".
[实例6] (阶乘递归)

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

递归的时间复杂度 = 递归的次数*每次递归后执行的次数
阶乘从N开始,返回N*(N-1),令返回的值为x,之后算x*(N-2),以此类推…算到最后,一共算了N-1次,时间复杂度就是O(N).
[实例7] (斐波那契数列)

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

这里的斐波那契数列的递归有点类似于二叉树,关于二叉树的问题,我们后边讨论.
在这里插入图片描述
由上图和递归时间复杂度的运算法则,我们可以算出时间复杂度为O(2^n).

3.2 空间复杂度

3.2.1 空间复杂度的概念

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

3.2.2 空间度复杂度举例

[实例1]

void bubbleSort(int[] array) {
	for (int end = array.length; end > 0; end--) {
		boolean sorted = true;//sorted为额外申请的空间
	for (int i = 1; i < end; i++) {
		if (array[i - 1] > array[i]) {
			Swap(array, i - 1, i);//进行交换的时候,temp为额外申请的空间
			sorted = false;
		}
	}
	if (sorted == true) {
		break;
	}
  }
}

上述代码我们可知,额外申请的空间为2,所以空间复杂度为O(1).

[实例2]

int[] fibonacci(int n) {
	long[] fibArray = new long[n + 1];//在这里开辟了一个新的数组,空间和n有关
	fibArray[0] = 0;
	fibArray[1] = 1;
	for (int i = 2; i <= n ; i++) {
		fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
	}
	return fibArray;
}

额外申请的空间为N+1个,所以空间复杂度为O(N).

[实例3]

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

在这里插入图片描述
每次递归都在栈中创建了一个栈帧,每个栈帧都占用的是常数个额外空间,所以时间复杂度为O(N).

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

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

相关文章

2024年2月吸尘器行业线上电商(京东天猫淘宝)综合排行榜

鲸参谋监测的线上电商平台&#xff08;淘宝天猫京东&#xff09;2月吸尘器行业销售数据公开。 根据鲸参谋电商数据平台显示&#xff0c;吸尘器行业2月销量累计约53万件&#xff0c;环比上个月下滑29%&#xff0c;同比去年下滑19%&#xff1b;销售额累计约4亿&#xff0c;环比上…

​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结

接上次博客&#xff1a;Redis&#xff08;四&#xff09;&#xff1a;持久化和事务&#xff1a;RDB&#xff08;定期备份&#xff09;【触发机制、流程说明、文件的处理、优缺点】、AOF&#xff08;实时备份&#xff09;【使用AOF、命令写入、文件同步、重写机制、启动时数据恢…

Karmada 管理有状态应用 Xline 的早期探索与实践

背景与动机 目前随着云原生技术和云市场的不断成熟&#xff0c;越来越多的 IT 厂商开始投入到跨云多集群的怀抱当中。以下是 flexera 在 2023 年中关于云原生市场对多云多集群管理的接受程度的调查报告&#xff08;http://info.flexera.com&#xff09; 从 flexera 的报告中可…

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)、logisim工具

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费&#xff0c;70元。据说可以导出 Verilog &#xff01; logisim及其衍生版本 都需要安装java环境。 http://www.cburch.com/logisim/ 是原版&#xff0c; 下载页面&#…

Python实现猜数字游戏:一次编程旅程

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Nexus3 Docker 私有仓库

Nexus3 Docker 私有仓库 安装并部署 Nexus3 $ docker search nexus3$ docker pull sonatype/nexus3$ mkdir /home/tester/data/docker/nexus3/sonatype-work $ sudo chown -R 200 /home/tester/data/docker/nexus3/sonatype-work$ docker run -d --namenexus3 \ --restartalw…

【CSS浮动属性】别再纠结布局了!一文带你玩转CSS Float属性

在网页设计的世界里&#xff0c;CSS浮动属性&#xff08;float&#xff09;就像一把双刃剑。它能够让元素脱离文档流&#xff0c;实现灵活的布局&#xff0c;但如果处理不当&#xff0c;也可能引发一系列布局问题。 今天&#xff0c;我们就来深入探讨这把“剑”的正确使用方法…

T1 神奇苹果桶 (25分) - 小米前端笔试编程题解

考试平台&#xff1a; 赛码 题目类型&#xff1a; 20道选择 2道编程题 考试时间&#xff1a; 2024-03-23 &#xff08;两小时&#xff09; 题目描述 小希在森林冒险的时候发现一个神奇的木桶&#xff0c;某些时会凭空出现一些苹果&#xff0c;小希很解地大家分享了这一个神奇…

argocd cli工具使用

一、前言 ragocd除了使用web界面操作之外&#xff0c;也可以通过argocd cli工具进行操作&#xff0c;关于集群创建、gitlab仓库创建、app创建都是可以通过yaml 文件去操作&#xff0c;使用web界面创建的操作也需要使用argocd cli工具进行备份 二、使用 在argocd部署的章节已经…

fuzzywuzzy,一个好用的 Python 库!

目录 前言 安装 基本功能 1. 字符串相似度比较 2. 模糊匹配与排序 实际应用场景 1. 数据清洗 2. 文本匹配与搜索 3. 搜索引擎优化 总结 前言 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - fuzzywuzzy Github地址&#xff1a;https://github.com/seatgeek/fu…

nginx 不能访问的排查思路

场景: 在云主机上搭建了nginx服务&#xff0c;测试阶段nginx服务监听的81端口&#xff0c;但无法通过公网访问到nginx默认网页&#xff1b; Nginx安装路径&#xff1a;/www/nginx/ 尝试访问&#xff0c;发现81端口不通 允许访问81 允许81端口开放后&#xff0c;发现 于是查看n…

蓝鹏为何专注智能测量仪的加工定制?

在这个日新月异的科技时代&#xff0c;自动化工厂层出不穷&#xff0c;并且是在不断地升级改造&#xff0c;为了产品的高速高质高效的自动化生产&#xff0c;智能测量仪的重要性不言而喻。智能测量仪的种类很多&#xff0c;蓝鹏一直致力于专业仪器定制&#xff0c;但你有没有想…

python数据实时传给unity工程并绘制出来

python # 服务器端代码 import socket import random import struct import time# 创建一个服务器Socket server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 监听的地址和端口 host 127.0.0.1 port 12345# 绑定地址和端口 server_socket.bind((host, port…

UE4_官方动画内容示例1.2_动画蓝图——使用蓝图告知Actor播放动画

展示了两个示例&#xff1a;在其中一个示例中&#xff0c;使用蓝图告知Actor播放动画&#xff0c;在另外一个示例中&#xff0c;展示了告知Actor播放动画的动画蓝图&#xff08;例如&#xff0c;此示例展示了如何将变量从蓝图传递给动画蓝图&#xff0c;并演示了如何将现有姿势…

如何使用Excel创建一个物品采购表

在企业的日常运营中&#xff0c;物品采购是一个常见且重要的活动。有效的采购管理不仅可以确保企业及时获得所需物资&#xff0c;还可以控制成本、提高效率。Microsoft Excel是一个功能强大的工具&#xff0c;它可以帮助我们创建和管理物品采购表。本文将详细介绍如何使用Excel…

IDEA2023版本整合SpringBoot热部署

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

【王道训练营】第3题 判断某个年份是不是闰年,如果是闰年,请输出“yes”,否则请输出“no”

文章目录 引言闰年初始代码代码改进改进1&#xff1a;添加提示信息改进2&#xff1a;代码格式改进3&#xff1a;变量命名 其他实现方式使用if-else语句使用函数使用三元操作符 结论 引言 在公历中&#xff0c;闰年的规则如下&#xff1a;如果某个年份能被4整除但不能被100整除…

Prometheus +Grafana +node_exporter可视化监控Linux虚机

1、介绍 待补充 2、架构图 待补充 Prometheus &#xff1a;主要是负责存储、抓取、聚合、查询方面。 node_exporter &#xff1a;主要是负责采集物理机、中间件的信息。 3、搭建过程 配置要求&#xff1a;1台主服务器 n台从服务器 &#xff08;被监控的linux虚机&am…

洛谷_P3817 小A的糖果_python写法

P3817 小A的糖果 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 一开始有两个案例无法通过&#xff0c;然后看了一下测试案例发现其实是没有考虑到为0这个情况&#xff0c;因为如果为0那么无法吃掉任何一粒糖果&#xff0c;而按照之前的写法是到负数了&#xff0c;那后面的一个…

文献速递:基于SAM的医学图像分割---在医学图像中进行任何分割

Title 题目 Segment anything in medical images 在医学图像中进行任何分割 01 文献速递介绍 医学图像分割是临床实践中的关键组成部分&#xff0c;它促进了准确的诊断、治疗计划和疾病监测。 然而&#xff0c;现有的方法通常是针对特定的模态或疾病类型定制的&#xff0c…