第2章 分析複雜度來判斷演算法效率

2021-10-08 09:29:26 字數 2397 閱讀 2709

二、空間複雜度

演算法複雜度用於分析演算法執行所需計算機資源的量,需要的時間資源為時間複雜度,需要的空間資源為空間複雜度。在我們判斷乙個演算法的優劣時,可以拋開軟體和硬體因素,只考慮問題的規模。編寫程式前預先估計演算法優劣,可以改進並選擇更高效的演算法。

程式設計實現演算法後,演算法就是由一組語句構成,演算法的執行效率就由各語句執行的次數所決定。乙個演算法花費的時間與演算法中語句的執行次數成正比,哪個演算法語句執行次數多,它花費的時間就多,把時間複雜度記為 t(n

)t(n)

t(n)

,一般情況下,演算法的基本操作重複執行的次數是關於模組 n

nn 的乙個函式 f(n

)f(n)

f(n)

,因此,我們可以把演算法的時間複雜度記做:t(n

)=o(

f(n)

)t(n) = o(f(n))

t(n)=o

(f(n

))。隨著模組 n

nn 的增大,演算法執行的時間的增長率和 f(n

)f(n)

f(n)

的增長率成正比,所以 f(n

)f(n)

f(n)

越小,演算法的時間複雜度越低,演算法的效率越高。我們研究複雜度的目的是要比較兩個演算法的效率的高低,並不需要仔細地分析這個演算法比那個演算法多幾次運算那麼清,所以我們採用漸近複雜度分析來比較演算法的效率。我們在分析演算法的時間複雜度時,一般都會規定各種輸入情況得出最好情況下 tma

x(n)

t_(n)

tmax​(

n)、最壞情況下 tmi

n(n)

t_(n)

tmin​(

n)和平均情況下 tav

g(n)

t_(n)

tavg​(

n)。我們需要求乙個整數的絕對值,在演算法設計上,只需要輸入的值為負數時,返回它的相反數,其他情況返回本身,**如下:

public

static

intabs

(int a)

該**中只有一條運算指令語句,時間複雜度為 o(1)。

已知乙個整型陣列,需要對陣列內所有元素求和,如果只是通過遍歷所有元素而不使用其他方法進行求和,可以使用如下**實現:

public

static

intsum

(int

a)return s;

}

由**可知,如果輸入陣列的大小為 n ,執行語句中初始化賦值需要時間 o(1),迴圈語句中的賦值操作需要時間為 o(1)*n,所以語句執行的時間為:o(1)+o(1)*n=o(n+1)=o(n)。

已知乙個有序陣列,需要在陣列中找到某個元素的位置,我們可以通過二分法來實現,**如下:

public

static

intbinarysearch

(int

a,int b)

else

if(a[i]

> b)

else

}return-1

;}

我們要計算此**的時間複雜度,關鍵就是算迴圈的次數,可以歸納一下,在最糟糕的情況下:

也就是說在 n 個元素中,需要當 n2k

=1

\frac=1

2kn​=1

時,才能找到目標元素,由此也可得到 k=l

og2n

k=log_2n

k=log2

​n,所以二分查詢的時間複雜度為 o(log n)。

已知乙個整型陣列,需要使用冒泡演算法來進行排序,**實現如下:

public

static

int[

]bubblesort

(int

a)}}

return a;

}

在上面**中,兩層迴圈中比較的次數為 (n−

1)+(

n−2)

+(n−

3)+.

..+1

(n-1)+(n-2)+(n-3)+...+1

(n−1)+

(n−2

)+(n

−3)+

...+

1 ,根據等差數列求和公式得出結果為 n(n

−1)2

\frac

2n(n−1

)​,忽略低次項,所以該演算法的時間複雜度為 o(n2)。

衡量演算法效能的另乙個重要方面,就是演算法需使用的儲存空間量,即演算法空間複雜度。我們希望對於同樣的輸入規模,在時間複雜度相同的前提下,演算法所佔的空間越少越好。每次基本操作只會涉及到常數規模的空間,所以我們在分析和討論演算法時,只關注時間複雜度。當然,空間複雜度在對空間效率非常在乎的應用場景時,或者是問題的輸入規模極為龐大時,也有其存在的意義。

演算法複雜度判斷

原文 下面給出在不同資料範圍下,的時間複雜度和演算法該如何選擇 n 30 指數級別,dfs 剪枝,狀態壓縮dp n 100 o n 3 o n 3 o n3 floyd,dp n 1000 o n 2 o n2l ogn o n 2 o n 2logn o n2 o n2 logn dp,二分 n ...

演算法筆記 複雜度分析2

是什麼 什麼是時間複雜度四個概念 為什麼要有時間複雜度四個概念怎麼分析 的這四種時間複雜度public intgetindex int list,int val return index 上述 中,陣列 list 以及某乙個特定的值 val getindex 方法負責找出陣列 list 中 val ...

演算法效率 1 時間複雜度 2 空間複雜度。

3 空間複雜度 1.演算法效率 演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜度很是...