Java数据结构之集合框架与常用算法详解

 更新时间:2023年04月28日 08:59:56   作者:ZIYE_190  
Java集合框架是Java中常用的数据结构库,包括List、Set、Map等多种数据结构,支持快速的元素添加、删除、查找等操作,可以用于解决各种实际问题。Java中也有多种常用算法,如排序、查找、递归等,在数据处理和分析中有广泛应用

1 集合框架

1.1 集合框架概念

Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces和其实现类 classes 。

其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索 retrieve 、管理 manipulate ,即平时我们俗称的增删查改 CRUD 。

类和接口总览:

1.2 容器涉及的数据结构

Collection:是一个接口,包含了大部分容器常用的一些方法

List:是一个接口,规范了ArrayList 和 LinkedList中要实现的方法

  • ArrayList:实现了List接口,底层为动态类型顺序表
  • LinkedList:实现了List接口,底层为双向链表

Stack:底层是栈,栈是一种特殊的顺序表

Queue:底层是队列,队列是一种特殊的顺序表

Deque:是一个接口

Set:集合,是一个接口,里面放置的是K模型

  • HashSet:底层为哈希桶,查询的时间复杂度为O(1)
  • TreeSet:底层为红黑树,查询的时间复杂度为O( ),关于key有序的

Map:映射,里面存储的是K-V模型的键值对

  • HashMap:底层为哈希桶,查询时间复杂度为O(1)
  • TreeMap:底层为红黑树,查询的时间复杂度为O( ),关于key有序

2 算法

2.1 算法概念

算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。

2.2 算法效率

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

3 时间复杂度

3.1 时间复杂度概念

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

3.2 大O的渐进表示法

// 请计算一下func1基本操作执行了多少次?
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 执行的基本操作次数 :F(N)=N^2+2*N+10

  • N = 10 F(N) = 130
  • N = 100 F(N) = 10210
  • N = 1000 F(N) = 1002010

实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。

大O符号(Big O notation):是用于描述函数渐进行为的数学符号

3.3 推导大O阶方法

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

使用大O的渐进表示法以后,Func1的时间复杂度为:O(n^2)

  • 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 空间复杂度

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

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

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

实例3:

// 计算阶乘递归Factorial的空间复杂度?
long factorial(int N) {
	return N < 2 ? N : factorial(N-1)*N;
}
  • 实例1使用了常数个额外空间,所以空间复杂度为 O(1)
  • 实例2动态开辟了N个空间,空间复杂度为 O(N)
  • 实例3递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)

到此这篇关于Java数据结构之集合框架与常用算法详解的文章就介绍到这了,更多相关Java集合框架内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javaweb项目如何实现手机短信登录

    javaweb项目如何实现手机短信登录

    这篇文章主要介绍了javaweb项目如何实现手机短信登录,手机号登录在现在的项目中用的场景非常多,实现起来也不难,今天我们就一起来通过演示实现登录过程,需要的朋友可以参考下
    2019-07-07
  • 优化Java虚拟机总结(jvm调优)

    优化Java虚拟机总结(jvm调优)

    这篇文章主要介绍了优化Java虚拟机总结(jvm调优),具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 浅谈几种Java自定义异常处理方式

    浅谈几种Java自定义异常处理方式

    在Java中,异常是一种常见的处理机制,本文主要介绍了浅谈几种Java自定义异常处理方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java接口RandomAccess全面了解

    Java接口RandomAccess全面了解

    下面小编就为大家带来一篇Java接口RandomAccess全面了解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • jvm信息jmap使用的基本方法教程

    jvm信息jmap使用的基本方法教程

    JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,下面这篇文章主要给大家介绍了关于jvm信息jmap使用的基本方法教程,需要的朋友可以参考下
    2018-08-08
  • java 页面url传值中文乱码的解决方法

    java 页面url传值中文乱码的解决方法

    本节讲的是ajax 的URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码。
    2013-03-03
  • Fluent Mybatis实现环境隔离和租户隔离

    Fluent Mybatis实现环境隔离和租户隔离

    我们在实际的业务开发中,经常会碰到环境逻辑隔离和租户数据逻辑隔离的问题。本文就详细的来介绍一下,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 实战干货之基于SpringBoot的RabbitMQ多种模式队列

    实战干货之基于SpringBoot的RabbitMQ多种模式队列

    RabbitMQ 是一个由Erlang语言开发的AMQP的开源实现,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗,下文将带你深入了解 RabbitMQ 多种模式队列
    2021-09-09
  • SpringBoot中 Jackson 日期的时区和日期格式问题解决

    SpringBoot中 Jackson 日期的时区和日期格式问题解决

    因为最近项目需要国际化,需要能够支持多种国际化语言,目前需要支持三种(法语、英语、简体中文),这篇文章主要介绍了SpringBoot中 Jackson 日期的时区和日期格式问题,需要的朋友可以参考下
    2022-12-12
  • Java 基础语法让你弄懂类和对象

    Java 基础语法让你弄懂类和对象

    C 语言是面向过程的,而 Java 是面向对象是我们常听到的一句话,这章将带你揭晓Java 基础语法中类与对象到底是什么,需要的朋友请参考下文
    2021-08-08

最新评论