从今天开始我们就要学习Java的数据据结构部分,根据前面Java语法的基础上,更加深入的了解算法的基本知识。
数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的 集合。
Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces和其实现类 classes
Java当中已经实现好的一些集合类(数据结构)
我们总体的学习框架如下图所示:

首先要有代码量,只有写的代码足够多才慢慢熟悉数据结构的基本要领;其次,学习中要时刻记得画图,做题前先画图是一个“小白”的必经之路;之后学习的过程就是总结的过程,每学到一个章节要知道总结,最后才会变成自己的东西;最后要大量刷题,我推荐两个刷题的网站力扣(LeetCode),牛客建议由易到难,由简单到复杂,慢慢来,刚开始一定慢。
解决一个问题有多种算法,那么就一定有最高效的算法,这就是算法效率:第一种是时间效率,第二种是空间效率。 但是实际上,只要能解决问题的算法都是好算法。
时间效率(时间复杂度):时间复杂度主要衡量的是一个算法的运行速度 空间效率(空间复杂度):空间复杂度主要衡量一个算法所需要的额外空间
时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间.一个算 法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。
大O符号:是用于描述函数渐进行为的数学符号。
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*N+10
使用大O的渐进表示法以后,func1的时间复杂度为:O(N²)
在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)
代码示例: 示例1:
void func2(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);
}示例1基本操作执行了2N+10次,通过推导大O阶方法知道,时间复杂度为 O(N)
示例2:
void func3(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);
}示例2基本操作执行了M+N次,有两个未知数M和N,时间复杂度为 O(N+M)
示例3:
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;
}
}
}示例3基本操作执行最好N次,最坏执行了(N(N-1))/2次,通过推导大O阶方法+时间复杂度一般看最坏,时间复杂度为 O(N²)*
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。 空间复杂度算的是变量的个数,也使用大O渐进表示法。
代码示例:
示例1:
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;
}
}
}示例1使用了常数个额外空间,所以空间复杂度为 O(1)
示例2:
int[] func4(int n) {
long[] array = new long[n + 1];
array[0] = 0;
array[1] = 1;
for (int i = 2; i <= n ; i++) {
array[i] = array[i - 1] + array [i - 2];
}
return array;
}示例2动态开辟了N个空间,空间复杂度为 O(N)
好了,到这里Java语法部分就已经结束了~ 如果这个系列博客对你有帮助的话,可以点一个免费的赞并收藏起来哟~ 可以点点关注,避免找不到我~ ,我的主页:optimistic_chen 我们下期不见不散~~Java
下期预告: Java【数据结构】----泛型