您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

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

2024/5/10 9:49:07发布29次查看
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 空间复杂度对于一个算法而言,空间复杂度表示它在执行期间所需的临时存储空间大小。空间复杂度的计算方式并非程序所占用的字节数量,因为这并没有太大的意义;实际上,空间复杂度的计算基于变量的数量。大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数据结构之集合框架与常用算法有哪些的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product