二、空間複雜度
演算法複雜度用於分析演算法執行所需計算機資源的量,需要的時間資源為時間複雜度,需要的空間資源為空間複雜度。在我們判斷乙個演算法的優劣時,可以拋開軟體和硬體因素,只考慮問題的規模。編寫程式前預先估計演算法優劣,可以改進並選擇更高效的演算法。
程式設計實現演算法後,演算法就是由一組語句構成,演算法的執行效率就由各語句執行的次數所決定。乙個演算法花費的時間與演算法中語句的執行次數成正比,哪個演算法語句執行次數多,它花費的時間就多,把時間複雜度記為 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.演算法效率 演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜度很是...