Java數(shù)據(jù)結(jié)構(gòu)之集合框架與常用算法詳解
1 集合框架
1.1 集合框架概念
Java 集合框架 Java Collection Framework ,又被稱為容器 container ,是定義在 java.util 包下的一組接口 interfaces和其實現(xiàn)類 classes 。
其主要表現(xiàn)為將多個元素 element 置于一個單元中,用于對這些元素進行快速、便捷的存儲 store 、檢索 retrieve 、管理 manipulate ,即平時我們俗稱的增刪查改 CRUD 。
類和接口總覽:


1.2 容器涉及的數(shù)據(jù)結(jié)構(gòu)
Collection:是一個接口,包含了大部分容器常用的一些方法
List:是一個接口,規(guī)范了ArrayList 和 LinkedList中要實現(xiàn)的方法
- ArrayList:實現(xiàn)了List接口,底層為動態(tài)類型順序表
- LinkedList:實現(xiàn)了List接口,底層為雙向鏈表
Stack:底層是棧,棧是一種特殊的順序表
Queue:底層是隊列,隊列是一種特殊的順序表
Deque:是一個接口
Set:集合,是一個接口,里面放置的是K模型
- HashSet:底層為哈希桶,查詢的時間復(fù)雜度為O(1)
- TreeSet:底層為紅黑樹,查詢的時間復(fù)雜度為O( ),關(guān)于key有序的
Map:映射,里面存儲的是K-V模型的鍵值對
- HashMap:底層為哈希桶,查詢時間復(fù)雜度為O(1)
- TreeMap:底層為紅黑樹,查詢的時間復(fù)雜度為O( ),關(guān)于key有序
2 算法
2.1 算法概念
算法(Algorithm):就是定義良好的計算過程,他取一個或一組的值為輸入,并產(chǎn)生出一個或一組值作為輸出。簡單來說算法就是一系列的計算步驟,用來將輸入數(shù)據(jù)轉(zhuǎn)化成輸出結(jié)果。
2.2 算法效率
算法效率分析分為兩種:第一種是時間效率,第二種是空間效率。時間效率被稱為時間復(fù)雜度,而空間效率被稱作空間復(fù)雜度。 時間復(fù)雜度主要衡量的是一個算法的運行速度,而空間復(fù)雜度主要衡量一個算法所需要的額外空間,在計算機發(fā)展的早期,計算機的存儲容量很小。所以對空間復(fù)雜度很是在乎。但是經(jīng)過計算機行業(yè)的迅速發(fā)展,計算機的存儲容量已經(jīng)達到了很高的程度。所以我們?nèi)缃褚呀?jīng)不需要再特別關(guān)注一個算法的空間復(fù)雜度。
3 時間復(fù)雜度
3.1 時間復(fù)雜度概念
時間復(fù)雜度的定義:在計算機科學(xué)中,算法的時間復(fù)雜度是一個數(shù)學(xué)函數(shù),它定量描述了該算法的運行時間。一個算法執(zhí)行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程序放在機器上跑起來,才能知道。但是我們需要每個算法都上機測試嗎?是可以都上機測試,但是這很麻煩,所以才有了時間復(fù)雜度這個分析方式。一個算法所花費的時間與其中語句的執(zhí)行次數(shù)成正比例,算法中的基本操作的執(zhí)行次數(shù),為算法的時間復(fù)雜度。
3.2 大O的漸進表示法
// 請計算一下func1基本操作執(zhí)行了多少次?
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 執(zhí)行的基本操作次數(shù) :F(N)=N^2+2*N+10
- N = 10 F(N) = 130
- N = 100 F(N) = 10210
- N = 1000 F(N) = 1002010
實際中我們計算時間復(fù)雜度時,我們其實并不一定要計算精確的執(zhí)行次數(shù),而只需要大概執(zhí)行次數(shù),那么這里我們使用大O的漸進表示法。
大O符號(Big O notation):是用于描述函數(shù)漸進行為的數(shù)學(xué)符號
3.3 推導(dǎo)大O階方法
- 用常數(shù)1取代運行時間中的所有加法常數(shù)。
- 在修改后的運行次數(shù)函數(shù)中,只保留最高階項。
- 如果最高階項存在且不是1,則去除與這個項目相乘的常數(shù)。得到的結(jié)果就是大O階。
使用大O的漸進表示法以后,F(xiàn)unc1的時間復(fù)雜度為:O(n^2)
- N = 10 F(N) = 100
- N = 100 F(N) = 10000
- N = 1000 F(N) = 1000000
通過上面我們會發(fā)現(xiàn)大O的漸進表示法去掉了那些對結(jié)果影響不大的項,簡潔明了的表示出了執(zhí)行次數(shù)。另外有些算法的時間復(fù)雜度存在最好、平均和最壞情況:
最壞情況:任意輸入規(guī)模的最大運行次數(shù)(上界)
平均情況:任意輸入規(guī)模的期望運行次數(shù)
最好情況:任意輸入規(guī)模的最小運行次數(shù)(下界)
例如:在一個長度為N數(shù)組中搜索一個數(shù)據(jù)x
最好情況:1次找到
最壞情況:N次找到
平均情況:N/2次找到
在實際中一般情況關(guān)注的是算法的最壞運行情況,所以數(shù)組中搜索數(shù)據(jù)時間復(fù)雜度為O(N)
4 空間復(fù)雜度
空間復(fù)雜度是對一個算法在運行過程中臨時占用存儲空間大小的量度 。空間復(fù)雜度不是程序占用了多少bytes的空間,因為這個也沒太大意義,所以空間復(fù)雜度算的是變量的個數(shù)??臻g復(fù)雜度計算規(guī)則基本跟實踐復(fù)雜度類似,也使用大O漸進表示法。
實例1:
// 計算bubbleSort的空間復(fù)雜度?
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的空間復(fù)雜度?
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的空間復(fù)雜度?
long factorial(int N) {
return N < 2 ? N : factorial(N-1)*N;
}
- 實例1使用了常數(shù)個額外空間,所以空間復(fù)雜度為 O(1)
- 實例2動態(tài)開辟了N個空間,空間復(fù)雜度為 O(N)
- 實例3遞歸調(diào)用了N次,開辟了N個棧幀,每個棧幀使用了常數(shù)個空間。空間復(fù)雜度為O(N)
到此這篇關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之集合框架與常用算法詳解的文章就介紹到這了,更多相關(guān)Java集合框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
優(yōu)化Java虛擬機總結(jié)(jvm調(diào)優(yōu))
這篇文章主要介紹了優(yōu)化Java虛擬機總結(jié)(jvm調(diào)優(yōu)),具有一定借鑒價值,需要的朋友可以參考下2018-01-01
Fluent Mybatis實現(xiàn)環(huán)境隔離和租戶隔離
我們在實際的業(yè)務(wù)開發(fā)中,經(jīng)常會碰到環(huán)境邏輯隔離和租戶數(shù)據(jù)邏輯隔離的問題。本文就詳細的來介紹一下,感興趣的小伙伴們可以參考一下2021-08-08
實戰(zhàn)干貨之基于SpringBoot的RabbitMQ多種模式隊列
RabbitMQ 是一個由Erlang語言開發(fā)的AMQP的開源實現(xiàn),支持多種客戶端。用于在分布式系統(tǒng)中存儲轉(zhuǎn)發(fā)消息,在易用性、擴展性、高可用性等方面表現(xiàn)不俗,下文將帶你深入了解 RabbitMQ 多種模式隊列2021-09-09
SpringBoot中?Jackson?日期的時區(qū)和日期格式問題解決
因為最近項目需要國際化,需要能夠支持多種國際化語言,目前需要支持三種(法語、英語、簡體中文),這篇文章主要介紹了SpringBoot中?Jackson?日期的時區(qū)和日期格式問題,需要的朋友可以參考下2022-12-12

