Java數(shù)據(jù)結(jié)構(gòu)--時(shí)間和空間復(fù)雜度
一、算法效率
算法效率分析分為兩種:時(shí)間效率和空間效率
時(shí)間效率
時(shí)間效率被稱為時(shí)間復(fù)雜度,主要時(shí)衡量一個(gè)算法的運(yùn)行速度
空間效率
空間效率被稱為空間復(fù)雜度,主要衡量一個(gè)算法所需要的額外空間
二、時(shí)間復(fù)雜度
1. 概念
一個(gè)算法所花費(fèi)的時(shí)間與其中語(yǔ)句的執(zhí)行次數(shù)成正比,故將算法中的基本操作的執(zhí)行次數(shù),作為算法的時(shí)間復(fù)雜度
并且時(shí)間復(fù)雜度其實(shí)還可以分成三種情況:
- 最壞情況:任意輸入規(guī)模的最大運(yùn)行次數(shù)
- 平均情況:任意輸入規(guī)模的期望運(yùn)行次數(shù)
- 最好情況:任意輸入規(guī)模的最小運(yùn)行次數(shù)
而在實(shí)際中一般關(guān)注的是算法的最壞運(yùn)行情況
2. 大 O 的漸進(jìn)表示法
實(shí)際在我們計(jì)算時(shí)間復(fù)雜度時(shí),并不一定要計(jì)算精確的執(zhí)行次數(shù),而只需要大概執(zhí)行次數(shù),故我們使用大 O 的漸進(jìn)表示法(大 O 符號(hào)是用于描述函數(shù)漸進(jìn)行為的數(shù)學(xué)符號(hào))
使用方法
用常數(shù)1取代運(yùn)行時(shí)間中的所有加法常數(shù)在修改后的運(yùn)行次數(shù)函數(shù)中,只保留最高階項(xiàng)如果最高階項(xiàng)存在且不為1,則去除與這個(gè)項(xiàng)目相乘的常數(shù)
如某個(gè)算法的基本操作次數(shù)為 F(N) = N^2^ + 2*N + 10,用大 O 的漸進(jìn)表示法為:O(N)
3. 練習(xí)
在這里放入兩個(gè)遞歸函數(shù)的練習(xí),我們來(lái)試著推導(dǎo)其的時(shí)間復(fù)雜度
練習(xí)一:計(jì)算階乘遞歸 factorial 的時(shí)間復(fù)雜度
long factorial(int N) { return N < 2 ? N : factorial(N-1) * N; }
這題很簡(jiǎn)單,結(jié)果為:O(N)
練習(xí)二:計(jì)算斐波那契遞歸 fibonacci 的時(shí)間復(fù)雜度
int fibonacci(int N) { return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2); }
這題可以結(jié)合畫圖類似于二叉樹去思考,結(jié)果為:O(N2)
注意
遞歸的時(shí)間復(fù)雜度 = 遞歸的次數(shù) * 每次遞歸內(nèi)容要執(zhí)行的次數(shù)
三、空間復(fù)雜度
1. 概念
空間復(fù)雜度是對(duì)一個(gè)算法在運(yùn)行過(guò)程中臨時(shí)占用存儲(chǔ)空間大小的量度,它不是計(jì)算程序占用了多少 byte 的空間,而是計(jì)算變量的個(gè)數(shù)。(空間復(fù)雜度也使用大 O 的漸進(jìn)表示法)
2. 練習(xí)
練習(xí)一:計(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; } } }
因?yàn)橹皇褂昧顺?shù)個(gè)額外空間,故結(jié)果為:O(1)
練習(xí)二:計(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; }
因?yàn)閯?dòng)態(tài)開辟了 N 個(gè)空間,故結(jié)果為:O(N)
練習(xí)三:計(jì)算階乘遞歸 Factorial 的時(shí)間復(fù)雜度
long factorial(int N) { return N < 2 ? N : factorial(N-1)*N; }
因?yàn)檫f歸調(diào)用了 N 次,開辟了 N 個(gè)棧幀,每個(gè)棧幀使用了常數(shù)個(gè)空間,故結(jié)果為:O(N)
四、總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- Java 數(shù)據(jù)結(jié)構(gòu)之時(shí)間復(fù)雜度與空間復(fù)雜度詳解
- java實(shí)現(xiàn)堆排序以及時(shí)間復(fù)雜度的分析
- Java 關(guān)于時(shí)間復(fù)雜度和空間復(fù)雜度的深度刨析
- Java時(shí)間復(fù)雜度、空間復(fù)雜度的深入詳解
- Java算法之時(shí)間復(fù)雜度和空間復(fù)雜度的概念和計(jì)算
- 淺談Java如何實(shí)現(xiàn)一個(gè)基于LRU時(shí)間復(fù)雜度為O(1)的緩存
- Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之時(shí)間復(fù)雜度與空間復(fù)雜度
相關(guān)文章
SpringBoot自動(dòng)裝配之@Import深入講解
由于最近的項(xiàng)目需求,需要在把配置類導(dǎo)入到容器中,通過(guò)查詢,使用@Import注解就能實(shí)現(xiàn)這個(gè)功能,@Import注解能夠幫我們吧普通配置類(定義為Bean的類)導(dǎo)入到IOC容器中2023-01-01Spring MVC注解式開發(fā)示例完整過(guò)程
這篇文章主要介紹了Spring MVC注解式開發(fā)示例完整過(guò)程,MVC注解式開發(fā)即處理器基于注解的類開發(fā),對(duì)于每一個(gè)定義的處理器,無(wú)需在xml中注冊(cè),只需在代碼中通過(guò)對(duì)類與方法的注解,即可完成注冊(cè)2023-02-02Java Enum和String及int的相互轉(zhuǎn)化示例
這篇文章主要介紹了Java Enum和String及int的相互轉(zhuǎn)化示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06簡(jiǎn)單說(shuō)明Java的Struts框架中merge標(biāo)簽的使用方法
這篇文章主要簡(jiǎn)單介紹了Java的Struts框架中merge標(biāo)簽的使用方法,Struts是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12SpringBoot+MyBatis實(shí)現(xiàn)登錄案例
前端時(shí)間在網(wǎng)上看到有朋友在學(xué)習(xí)springboot項(xiàng)目的搭建過(guò)程,今天就抽空給大家分享一個(gè)案例幫助大家學(xué)習(xí)SpringBoot+MyBatis實(shí)現(xiàn)登錄功能,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧2021-06-06關(guān)于SHA算法原理與常用實(shí)現(xiàn)方式
這篇文章主要介紹了關(guān)于SHA算法原理與常用實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08SpringBoot的@Value給靜態(tài)變量注入application.properties屬性值
這篇文章主要介紹了SpringBoot的@Value給靜態(tài)變量注入application.properties屬性值,Spring是一個(gè)開源的框架,主要是用來(lái)簡(jiǎn)化開發(fā)流程,通過(guò)IOC,依賴注入(DI)和面向接口實(shí)現(xiàn)松耦合,需要的朋友可以參考下2023-05-05JSON.parseObject和JSON.toJSONString實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了JSON.parseObject和JSON.toJSONString實(shí)例,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2018-06-06java實(shí)現(xiàn)字符串和數(shù)字轉(zhuǎn)換工具
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)字符串和數(shù)字轉(zhuǎn)換工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04