当前位置:

首页 > 编程开发 > Java数据结构之集合框架与常用算法有哪些

Java数据结构之集合框架与常用算法有哪些

1集合框架1.1集合框架概念Java集合框架JavaCollectionFramework,又被称为容器container,是定义在java.util包下的一组接口interfaces和其实现类classes。其主要表现为将多个元素element置于一个单元中,用于对这些元素进行快速、便捷的存储store、检索retrieve、管理manipulate,即平时我们俗称的增删查改CRUD。类和接口总览:1.2容器涉及的数据结构Collection:是一个接口,包含了大部分容器常用的一些方法List:是一个接

本文目录

      1 集合框架

      1.1 集合框架概念

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

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

      类和接口总览:

      Java数据结构之集合框架与常用算法有哪些

      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)

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java
      相关文章 更多
      Java单元测试入门:使用JUnit 5编写第一个测试用例
      Java单元测试入门:使用JUnit 5编写第一个测试用例

      面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

      Java变量未初始化报错解析:局部变量与成员变量默认值差异
      Java变量未初始化报错解析:局部变量与成员变量默认值差异

      深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

      详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

      Java中final与static final常量的定义及初始化规则
      Java中final与static final常量的定义及初始化规则

      深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

      Java抽象方法与接口方法的区别及选型建议
      Java抽象方法与接口方法的区别及选型建议

      深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

      Java实现HTTP请求与JSON解析的完整代码示例
      Java实现HTTP请求与JSON解析的完整代码示例

      本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

      Java递归出现StackOverflowError的原因分析及栈空间优化方案
      Java递归出现StackOverflowError的原因分析及栈空间优化方案

      详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

      Java空指针异常(NPE)的代码排查与修复实例
      Java空指针异常(NPE)的代码排查与修复实例

      针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。