欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java數(shù)據(jù)結(jié)構(gòu)之集合框架與常用算法詳解

 更新時(shí)間:2023年04月28日 08:59:56   作者:ZIYE_190  
Java集合框架是Java中常用的數(shù)據(jù)結(jié)構(gòu)庫(kù),包括List、Set、Map等多種數(shù)據(jù)結(jié)構(gòu),支持快速的元素添加、刪除、查找等操作,可以用于解決各種實(shí)際問(wèn)題。Java中也有多種常用算法,如排序、查找、遞歸等,在數(shù)據(jù)處理和分析中有廣泛應(yīng)用

1 集合框架

1.1 集合框架概念

Java 集合框架 Java Collection Framework ,又被稱為容器 container ,是定義在 java.util 包下的一組接口 interfaces和其實(shí)現(xiàn)類 classes 。

其主要表現(xiàn)為將多個(gè)元素 element 置于一個(gè)單元中,用于對(duì)這些元素進(jìn)行快速、便捷的存儲(chǔ) store 、檢索 retrieve 、管理 manipulate ,即平時(shí)我們俗稱的增刪查改 CRUD 。

類和接口總覽:

1.2 容器涉及的數(shù)據(jù)結(jié)構(gòu)

Collection:是一個(gè)接口,包含了大部分容器常用的一些方法

List:是一個(gè)接口,規(guī)范了ArrayList 和 LinkedList中要實(shí)現(xiàn)的方法

  • ArrayList:實(shí)現(xiàn)了List接口,底層為動(dòng)態(tài)類型順序表
  • LinkedList:實(shí)現(xiàn)了List接口,底層為雙向鏈表

Stack:底層是棧,棧是一種特殊的順序表

Queue:底層是隊(duì)列,隊(duì)列是一種特殊的順序表

Deque:是一個(gè)接口

Set:集合,是一個(gè)接口,里面放置的是K模型

  • HashSet:底層為哈希桶,查詢的時(shí)間復(fù)雜度為O(1)
  • TreeSet:底層為紅黑樹(shù),查詢的時(shí)間復(fù)雜度為O( ),關(guān)于key有序的

Map:映射,里面存儲(chǔ)的是K-V模型的鍵值對(duì)

  • HashMap:底層為哈希桶,查詢時(shí)間復(fù)雜度為O(1)
  • TreeMap:底層為紅黑樹(shù),查詢的時(shí)間復(fù)雜度為O( ),關(guān)于key有序

2 算法

2.1 算法概念

算法(Algorithm):就是定義良好的計(jì)算過(guò)程,他取一個(gè)或一組的值為輸入,并產(chǎn)生出一個(gè)或一組值作為輸出。簡(jiǎn)單來(lái)說(shuō)算法就是一系列的計(jì)算步驟,用來(lái)將輸入數(shù)據(jù)轉(zhuǎn)化成輸出結(jié)果。

2.2 算法效率

算法效率分析分為兩種:第一種是時(shí)間效率,第二種是空間效率。時(shí)間效率被稱為時(shí)間復(fù)雜度,而空間效率被稱作空間復(fù)雜度。 時(shí)間復(fù)雜度主要衡量的是一個(gè)算法的運(yùn)行速度,而空間復(fù)雜度主要衡量一個(gè)算法所需要的額外空間,在計(jì)算機(jī)發(fā)展的早期,計(jì)算機(jī)的存儲(chǔ)容量很小。所以對(duì)空間復(fù)雜度很是在乎。但是經(jīng)過(guò)計(jì)算機(jī)行業(yè)的迅速發(fā)展,計(jì)算機(jī)的存儲(chǔ)容量已經(jīng)達(dá)到了很高的程度。所以我們?nèi)缃褚呀?jīng)不需要再特別關(guān)注一個(gè)算法的空間復(fù)雜度。

3 時(shí)間復(fù)雜度

3.1 時(shí)間復(fù)雜度概念

時(shí)間復(fù)雜度的定義:在計(jì)算機(jī)科學(xué)中,算法的時(shí)間復(fù)雜度是一個(gè)數(shù)學(xué)函數(shù),它定量描述了該算法的運(yùn)行時(shí)間。一個(gè)算法執(zhí)行所耗費(fèi)的時(shí)間,從理論上說(shuō),是不能算出來(lái)的,只有你把你的程序放在機(jī)器上跑起來(lái),才能知道。但是我們需要每個(gè)算法都上機(jī)測(cè)試嗎?是可以都上機(jī)測(cè)試,但是這很麻煩,所以才有了時(shí)間復(fù)雜度這個(gè)分析方式。一個(gè)算法所花費(fèi)的時(shí)間與其中語(yǔ)句的執(zhí)行次數(shù)成正比例,算法中的基本操作的執(zhí)行次數(shù),為算法的時(shí)間復(fù)雜度。

3.2 大O的漸進(jìn)表示法

// 請(qǐng)計(jì)算一下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

實(shí)際中我們計(jì)算時(shí)間復(fù)雜度時(shí),我們其實(shí)并不一定要計(jì)算精確的執(zhí)行次數(shù),而只需要大概執(zhí)行次數(shù),那么這里我們使用大O的漸進(jìn)表示法。

大O符號(hào)(Big O notation):是用于描述函數(shù)漸進(jìn)行為的數(shù)學(xué)符號(hào)

3.3 推導(dǎo)大O階方法

  • 用常數(shù)1取代運(yùn)行時(shí)間中的所有加法常數(shù)。
  • 在修改后的運(yùn)行次數(shù)函數(shù)中,只保留最高階項(xiàng)。
  • 如果最高階項(xiàng)存在且不是1,則去除與這個(gè)項(xiàng)目相乘的常數(shù)。得到的結(jié)果就是大O階。

使用大O的漸進(jìn)表示法以后,F(xiàn)unc1的時(shí)間復(fù)雜度為:O(n^2)

  • N = 10 F(N) = 100
  • N = 100 F(N) = 10000
  • N = 1000 F(N) = 1000000

通過(guò)上面我們會(huì)發(fā)現(xiàn)大O的漸進(jìn)表示法去掉了那些對(duì)結(jié)果影響不大的項(xiàng),簡(jiǎn)潔明了的表示出了執(zhí)行次數(shù)。另外有些算法的時(shí)間復(fù)雜度存在最好、平均和最壞情況:

最壞情況:任意輸入規(guī)模的最大運(yùn)行次數(shù)(上界)

平均情況:任意輸入規(guī)模的期望運(yùn)行次數(shù)

最好情況:任意輸入規(guī)模的最小運(yùn)行次數(shù)(下界)

例如:在一個(gè)長(zhǎng)度為N數(shù)組中搜索一個(gè)數(shù)據(jù)x

最好情況:1次找到

最壞情況:N次找到

平均情況:N/2次找到

在實(shí)際中一般情況關(guān)注的是算法的最壞運(yùn)行情況,所以數(shù)組中搜索數(shù)據(jù)時(shí)間復(fù)雜度為O(N)

4 空間復(fù)雜度

空間復(fù)雜度是對(duì)一個(gè)算法在運(yùn)行過(guò)程中臨時(shí)占用存儲(chǔ)空間大小的量度 。空間復(fù)雜度不是程序占用了多少bytes的空間,因?yàn)檫@個(gè)也沒(méi)太大意義,所以空間復(fù)雜度算的是變量的個(gè)數(shù)??臻g復(fù)雜度計(jì)算規(guī)則基本跟實(shí)踐復(fù)雜度類似,也使用大O漸進(jìn)表示法。

實(shí)例1:

// 計(jì)算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;
		}
	}
}

實(shí)例2:

// 計(jì)算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;
}

實(shí)例3:

// 計(jì)算階乘遞歸Factorial的空間復(fù)雜度?
long factorial(int N) {
	return N < 2 ? N : factorial(N-1)*N;
}
  • 實(shí)例1使用了常數(shù)個(gè)額外空間,所以空間復(fù)雜度為 O(1)
  • 實(shí)例2動(dòng)態(tài)開(kāi)辟了N個(gè)空間,空間復(fù)雜度為 O(N)
  • 實(shí)例3遞歸調(diào)用了N次,開(kāi)辟了N個(gè)棧幀,每個(gè)棧幀使用了常數(shù)個(gè)空間??臻g復(fù)雜度為O(N)

到此這篇關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之集合框架與常用算法詳解的文章就介紹到這了,更多相關(guān)Java集合框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javaweb項(xiàng)目如何實(shí)現(xiàn)手機(jī)短信登錄

    javaweb項(xiàng)目如何實(shí)現(xiàn)手機(jī)短信登錄

    這篇文章主要介紹了javaweb項(xiàng)目如何實(shí)現(xiàn)手機(jī)短信登錄,手機(jī)號(hào)登錄在現(xiàn)在的項(xiàng)目中用的場(chǎng)景非常多,實(shí)現(xiàn)起來(lái)也不難,今天我們就一起來(lái)通過(guò)演示實(shí)現(xiàn)登錄過(guò)程,需要的朋友可以參考下
    2019-07-07
  • 優(yōu)化Java虛擬機(jī)總結(jié)(jvm調(diào)優(yōu))

    優(yōu)化Java虛擬機(jī)總結(jié)(jvm調(diào)優(yōu))

    這篇文章主要介紹了優(yōu)化Java虛擬機(jī)總結(jié)(jvm調(diào)優(yōu)),具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 淺談幾種Java自定義異常處理方式

    淺談幾種Java自定義異常處理方式

    在Java中,異常是一種常見(jiàn)的處理機(jī)制,本文主要介紹了淺談幾種Java自定義異常處理方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Java接口RandomAccess全面了解

    Java接口RandomAccess全面了解

    下面小編就為大家?guī)?lái)一篇Java接口RandomAccess全面了解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • jvm信息jmap使用的基本方法教程

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

    JDK本身提供了很多方便的JVM性能調(diào)優(yōu)監(jiān)控工具,除了集成式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat等小巧的工具,下面這篇文章主要給大家介紹了關(guān)于jvm信息jmap使用的基本方法教程,需要的朋友可以參考下
    2018-08-08
  • java 頁(yè)面url傳值中文亂碼的解決方法

    java 頁(yè)面url傳值中文亂碼的解決方法

    本節(jié)講的是ajax 的URL參數(shù)中有中文值,傳到服務(wù)端,在用request.getParameter()方法,得到的常常會(huì)是亂碼。
    2013-03-03
  • Fluent Mybatis實(shí)現(xiàn)環(huán)境隔離和租戶隔離

    Fluent Mybatis實(shí)現(xiàn)環(huán)境隔離和租戶隔離

    我們?cè)趯?shí)際的業(yè)務(wù)開(kāi)發(fā)中,經(jīng)常會(huì)碰到環(huán)境邏輯隔離和租戶數(shù)據(jù)邏輯隔離的問(wèn)題。本文就詳細(xì)的來(lái)介紹一下,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 實(shí)戰(zhàn)干貨之基于SpringBoot的RabbitMQ多種模式隊(duì)列

    實(shí)戰(zhàn)干貨之基于SpringBoot的RabbitMQ多種模式隊(duì)列

    RabbitMQ 是一個(gè)由Erlang語(yǔ)言開(kāi)發(fā)的AMQP的開(kāi)源實(shí)現(xiàn),支持多種客戶端。用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗,下文將帶你深入了解 RabbitMQ 多種模式隊(duì)列
    2021-09-09
  • SpringBoot中?Jackson?日期的時(shí)區(qū)和日期格式問(wèn)題解決

    SpringBoot中?Jackson?日期的時(shí)區(qū)和日期格式問(wèn)題解決

    因?yàn)樽罱?xiàng)目需要國(guó)際化,需要能夠支持多種國(guó)際化語(yǔ)言,目前需要支持三種(法語(yǔ)、英語(yǔ)、簡(jiǎn)體中文),這篇文章主要介紹了SpringBoot中?Jackson?日期的時(shí)區(qū)和日期格式問(wèn)題,需要的朋友可以參考下
    2022-12-12
  • Java 基礎(chǔ)語(yǔ)法讓你弄懂類和對(duì)象

    Java 基礎(chǔ)語(yǔ)法讓你弄懂類和對(duì)象

    C 語(yǔ)言是面向過(guò)程的,而 Java 是面向?qū)ο笫俏覀兂B?tīng)到的一句話,這章將帶你揭曉Java 基礎(chǔ)語(yǔ)法中類與對(duì)象到底是什么,需要的朋友請(qǐng)參考下文
    2021-08-08

最新評(píng)論