複雜度分析 時間複雜度 空間複雜度

2021-09-27 02:13:09 字數 2257 閱讀 4222

執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間、空間複雜度來衡量。

今天我們來學習一下複雜度的分析。

通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要具體測試資料,就能粗略估算演算法執行效率的方法,這即是我們今天要說的時間、空間複雜度分析。

我先來解釋下,什麼是大o時間複雜度表示法。大o時間複雜度表示法並不具體的表示**執行時間,而是代表**執行時間隨資料規模增長的變化趨勢,因此也叫較進時間複雜度,簡稱時間複雜度

所有**的執行時間和每行**的執行次數成正比

如下所示,若每行執行時間設為unit_time,則總時間需要

通過類似的推導,我們可以得到

t(n)=o(f(n))
這裡,n表示資料規模,f(n)表示每行**的執行總和,o表示,**執行時間t(n)和f(n)成正比。

大o時間複雜度在表示時,長忽略低階、常量、係數等,只記錄最大量級,如o(n),o(n²)

只關注迴圈執行最多的**行即可。

加法法則:總複雜度=量級最大的那段**的複雜點

乘法法則:總複雜度=巢狀內外**複雜度的乘積

多項式複雜度:o(1) o(logn)  o(n)  o(nlogn)  o(n²)  o(n³)  o(n^k)

非多項式複雜度:o(2^n)  o(n!)

模擬實際複雜度,空間複雜度全稱漸進空間複雜度,表示演算法的儲存空間與資料規模之間的增長關係。

我們常見的空間複雜度就是 o(1)、o(n)、o(n2 ),像 o(logn)、o(nlogn) 這樣的對數階複雜度平時都用不到

*************************===我是可愛的分割線(๑•ᴗ•๑)******************************===

本計畫將以下內容重新做為一節,但是考慮到內容的連貫性,覺得還是放在這裡合適。

下面,我們學習一下不同情況下的幾種複雜度分析。

首先,我們先來說以下這幾個概念:

最好情況時間複雜度:最理想情況下,**執行的時間複雜度,簡稱最好時間複雜度

最壞情況時間複雜度:最壞情況下,**執行的時間複雜度,簡稱最壞時間複雜度

平均情況時間複雜度:最好及最壞情況屬於極端情況,因此,我們在分析時,還要分析平均情況時間複雜度,簡稱平均時間複雜度

這裡需要注意的是,只有在同一段**在不同情況下,時間複雜度有量級差距時,我們才會使用三種複雜度來區分,下面我們距離來分析以下這三種情況。

就以在陣列a[n]中查詢給定的元素為例來說明把。

當按順序遍歷陣列時,若第乙個就是要查詢的元素,則時間複雜度為o(1),即最好時間複雜度。若要查詢的元素是最後乙個元素或元素不在陣列內,則要遍歷完整個陣列,此時,時間複雜度為o(n),即最壞時間複雜度。那平均時間複雜度又該如何來分析呢?

我們知道,要查詢的元素,在陣列中的位置,有n+1種情況,我們把每種情況下,查詢需要遍歷的元素個數加起來,再除以n+1,就可以得到遍歷的元素個數的平均值,可得(1+2+3+...n+n)/(n+1)=n(n+3)/2(n+1),用大o表示法可得,平均複雜度為o(n)。

我們知道,在數學種,有個叫期望值/加權平均值的概念,那在這裡,對應的,n+1種情況出現的概率並不均等,按照這種計算方法,平均要遍歷的元素個數應該為(1+2+3+..n)/n*0.5+n*0.5=(3n+1)/4,用大o表示也是o(n),這種情況下的複雜度稱為加權平均時間複雜度或期望時間複雜度。

最後,我們來特別說以下均攤時間複雜度。因為這個概念比較特殊。

在支援動態擴容的陣列種,若陣列已滿,那我們在插入資料時,需要申請乙個2倍大小的空間,並把原來陣列中的資料拷貝到新陣列中,在執行插入,那麼此時,需要搬移整個陣列,搬移所用的時間複雜度為o(n),在擴容完成後,可以繼續執行n-1此時間複雜度為o(1)的插入操作,那麼我們可以這麼想,要是把o(n)操作的時間均攤到接下來n-1次o(1)時間的操作上,那是不是類似與每次操作的時間複雜度還是o(1)?這便是均攤思想的大致思路。

一般,均攤時間複雜度的應用場景比較特殊。比如,在對乙個資料結構進行一組連續操作中,大部分情況下時間複雜度很低,只有個別情況下時間複雜度較高,而且這些操作之間存在前後連貫的時序關係,這個時候,我們就可以將這一組操作放在一塊分析,看是否能將較高時間複雜度那次操作的耗時,平攤到其他那些時間複雜度較低的操作上。而且,在能夠應用均攤時間複雜度分析的場合,一般均攤時間複雜度就等於最好情況時間複雜度。

複雜度分析(上)時間複雜度 空間複雜度

為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...

dfs時間複雜度 時間複雜度 空間複雜度

時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...

時間複雜度 空間複雜度

時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...