作為程式設計師,大家應該都聽過這樣乙個公式:程式設計 = 演算法 + 資料結構,我們所編寫的程式都可以使用這個公式來概括,其中演算法主要是針對世間和空間兩個維度進行考核。
1.1 計算表示式
要計算演算法的時間消耗,可以通過加日誌列印,獲取該程式執行算消耗的時間,但在實際的使用中,我們不可能針對每一段程式都去通過時間的執行獲取其消耗的時間,況且有些程式我們也沒辦法去通過實際執行去獲取消耗的時間,此時我們需要通過的一定的公式去估算其消耗的時間,常見的表達方式如下:
t(n) = o(f(n))該方法也就是我們常說的大o符號表示法,通過該方式可表示常見的時間複雜度,例如:
1.2 舉例說明
1. 常數階o(1)
int num = 0;
num++;
system.out.println(num);
指程式執行過程為常數的次數,例如上面的num執行了一次++操作,寫為o(1),當然如果再執行3次,也可以寫為o(3),但是通常統稱為o(1)的形式,即常數階。
2.對數階o(logn)
int num = 1;
while(num 指運算時,沒執行一次num值就乘以2,假設執行x次後,num值就大於n,即 2^x =
n,那麼x= log2 n,也就是logn的形式,其時間複雜度呈logn的形式。
3. 線性階o(n)
int num = 0;
for (int i = 0; i 指運算時,該變數執行了n次,例如上例中經過一次for迴圈後,num執行了n次,因此是呈現線性階o(n)。
4.線性對數階o(nlogn)
int num = 0;
for (int i = 0; i 指運算時,在執行for的同時又巢狀了一次while,結合對數階和線性階可知為線性對數階:o(nlogn)。
5.平方階o(n²)
for (int i = 0; i 結合線性階可知,平方階是指,運算時,巢狀了2次迴圈,即nn= n^2,如果將上述中的乙個n修改為m,則為nm次。
同理可知:
空間複雜度是指該演算法執行時,臨時占用的空間大小,常見的表示式有:o(1)、o(n)、o(n²)。
1.複雜度o(1)
int num = 0;
system.out.println(num);
該運算過程中,num申請了一次記憶體,因此複雜度為o(1),同理如果有可知的常數次也統稱為o(1)。
2. 複雜度o(n)
for (int i = 0; i 該運算中,每次都會重新申請乙個記憶體用於儲存test,因此複雜度為o(n)。
3.複雜度o(n²)
同理在o(n)的基礎上,如果再次巢狀乙個迴圈,則空間複雜度為o(n²)。
基於時間和空間複雜度的計算,主要是用於編寫程式時,大致估算程式的執行效率,特別是時間複雜度上,採用不同的方式,隨著n的不斷擴大,其時間的消耗甚至呈現指數型的增長。隨著裝置的儲存不斷擴大,在選擇演算法時,越來越多的採用空間換時間的方式來提公升效率。
對於時間和空間的估算,需要把握以下兩點:
時間:該演算法在實際執行中,執行了幾次?
空間:該演算法在執行中,占用臨時記憶體的大小 ?
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...