Java?精煉解讀時間復雜度與空間復雜度
前言:
所謂的復雜度就是衡量算法的效率,衡量算發(fā)效率又分為兩種,一種叫做時間復雜度,一種叫做空間復雜度。
一、算法效率
算法效率分析分為兩種:第一種是時間效率,第二種是空間效率。時間效率被稱為時間復雜度,而空間效率被 稱作空間復雜度。 時間復雜度主要衡量的是一個算法的運行速度,而空間復雜度主要衡量一個算法所需要的額 外空間,在計算機發(fā)展的早期,計算機的存儲容量很小。所以對空間復雜度很是在乎。但是經(jīng)過計算機行業(yè)的 迅速發(fā)展,計算機的存儲容量已經(jīng)達到了很高的程度。所以我們?nèi)缃褚呀?jīng)不需要再特別關(guān)注一個算法的空間復 雜度。
二、時間復雜度
1.時間復雜度概念
一個算法所花費的時間與其中語句的執(zhí)行次數(shù)成正比例,算法中的基本操作的執(zhí)行次數(shù),為算法的時間復 雜度。也就是說當我們拿到一個代碼,來看這個代碼的時間復雜度的時候,主要是去找這個代碼當中執(zhí)行語句次數(shù)最多的代碼執(zhí)行了多少次。
2.大O的漸進表示法
看圖分析:
當N的值越來越大,2N和10的值就可以忽略不記了。
實際中我們計算時間復雜度時,我們其實并不一定要計算精確的執(zhí)行次數(shù),而只需要大概執(zhí)行次數(shù),那么這里 我們使用大O的漸進表示法。
大O符號(Big O notation):是用于描述函數(shù)漸進行為的數(shù)學符號。
1、用常數(shù)1取代運行時間中的所有加法常數(shù)。
2、在修改后的運行次數(shù)函數(shù)中,只保留最高階項。
3、如果最高階項存在且不是1,則去除與這個項目相乘的常數(shù)。得到的結(jié)果就是大O階。
通過上面我們會發(fā)現(xiàn)大O的漸進表示法去掉了那些對結(jié)果影響不大的項,簡潔明了的表示出了執(zhí)行次數(shù)。
另外有些算法的時間復雜度存在最好、平均和最壞情況:
最壞情況:任意輸入規(guī)模的最大運行次數(shù)(上界)
平均情況:任意輸入規(guī)模的期望運行次數(shù)
最好情況:任意輸入規(guī)模的最小運行次數(shù)(下界)
例如:在一個長度為N數(shù)組中搜索一個數(shù)據(jù)x
最好情況:1次找到
最壞情況:N次找到
平均情況:N/2次找到
在實際中一般情況關(guān)注的是算法的最壞運行情況,所以數(shù)組中搜索數(shù)據(jù)時間復雜度為O(N)
計算時間復雜度
例題1:
基本操作執(zhí)行了2N+10次,通過推導大O階方法知道,時間復雜度為 O(N)
例題2:
基本操作執(zhí)行了M+N次,有兩個未知數(shù)M和N,時間復雜度為 O(N+M)
例題3:
基本操作執(zhí)行了100次,通過推導大O階方法,時間復雜度為 O(1)
例題4:計算冒泡排序的時間復雜度
基本操作執(zhí)行最好N次,最壞執(zhí)行了(N*(N-1))/2次,通過推導大O階方法+時間復雜度一般看最壞, 時間復雜度為 O(N^2
例題5:二分查找的時間復雜度
基本操作執(zhí)行最好1次,最壞O(logN)次,時間復雜度為 O(logN) ps:logN在算法分析中表示是底數(shù) 為2,對數(shù)為N。有些地方會寫成lgN。(建議通過折紙查找的方式講解logN是怎么計算出來的)(因為二 分查找每次排除掉一半的不適合值,一次二分剩下:n/2 兩次二分剩下:n/2/2 = n/4)
例題6:計算階乘遞歸的時間復雜度
遞歸的時間復雜度 = 遞歸的次數(shù)*每次遞歸執(zhí)行的次數(shù)
通過計算分析發(fā)現(xiàn)基本操作遞歸了N次,時間復雜度為O(N)。
例題7:計算斐波那契遞歸的時間復雜度
通過計算分析發(fā)現(xiàn)基本操作遞歸了2^N次,時間復雜度為O(2^N)。
規(guī)律:
2^0+2^1+2^2+2^3……2^(n-(n-1))
等比數(shù)列求和
a1就代表第一項,q是等比就是2,1(1-2^n)/-1,相當于2^n+1,所以時間復雜度為O(2^n)
三、空間復雜度
空間復雜度是對一個算法在運行過程中臨時占用存儲空間大小的量度 ??臻g復雜度不是程序占用了多少bytes 的空間,因為這個也沒太大意義,所以空間復雜度算的是變量的個數(shù)??臻g復雜度計算規(guī)則基本跟實踐復雜度 類似,也使用大O漸進表示法。
例題1:計算冒泡排序的空間復雜度
使用了常數(shù)個額外空間,所以空間復雜度為 O(1)
例題2:計算斐波那契的空間復雜度
動態(tài)開辟了N個空間,空間復雜度為 O(N)
例題3:計算階乘遞歸的空間復雜度
遞歸調(diào)用了N次,開辟了N個棧幀,每個棧幀使用了常數(shù)個空間??臻g復雜度為O(N)
總結(jié):
本文簡單介紹了什么是時間復雜度、空間復雜度,通過簡單例題的方式加深對數(shù)組的理解。上述就是今天的內(nèi)容,有任何疑問的話可以隨時私信我,文章哪里出現(xiàn)了問題我都會積極改正,也希望大家能更快的掌握自己想要的知識,讓我們一起加油!?。。?!
到此這篇關(guān)于Java 精煉解讀時間復雜度與空間復雜度的文章就介紹到這了,更多相關(guān)Java 時間復雜度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Cloud?Gateway?遠程代碼執(zhí)行漏洞(CVE-2022-22947)的過程解析
Spring?Cloud?Gateway?是基于?Spring?Framework?和?Spring?Boot?構(gòu)建的?API?網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡單、有效、統(tǒng)一的?API?路由管理方式,這篇文章主要介紹了Spring?Cloud?Gateway?遠程代碼執(zhí)行漏洞(CVE-2022-22947),需要的朋友可以參考下2022-08-08SpringBoot+Kotlin中使用GRPC實現(xiàn)服務(wù)通信的示例代碼
本文主要介紹了SpringBoot+Kotlin中使用GRPC實現(xiàn)服務(wù)通信的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07k8s+springboot+CronJob定時任務(wù)部署實現(xiàn)
本文主要介紹了k8s+springboot+CronJob定時任務(wù)部署實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07springboot openfeign從JSON文件讀取數(shù)據(jù)問題
今天主要說一下在openfeign里讀取JSON文件的問題,我們將測試所需要的數(shù)據(jù)存儲到文件里,在修改時關(guān)注點比較單純2018-06-06