時間複雜度和空間複雜度

2021-10-06 12:25:48 字數 2718 閱讀 6929

首先需要知道怎麼衡量複雜度。而在實際衡量時,我們通常會圍繞以下2 個維度進行:時間複雜度和空間複雜度。

複雜度是乙個關於輸入資料量 n 的函式。假設你的**複雜度是 f(n),那麼就用個大寫字母 o 和括號,把 f(n) 括起來就可以了,即 o(f(n))。例如,o(n) 表示的是,複雜度與計算例項的個數 n 線性相關;o(logn) 表示的是,複雜度與計算例項的個數 n 對數相關。

o(n) = o(2n) 

o(n²)+o(n) = o(n²) # 只用更大變化率的二階多項式來表徵複雜度

o(1) 表示通過有限可數的資源即可完成,即與輸入資料量 n 無關

例子:對於輸入的陣列,輸出與之逆序的陣列。例如,輸入 a=[1,2,3,4,5],輸出 [5,4,3,2,1]。

先看方法一,建立並初始化陣列 b,得到乙個與輸入陣列等長的全零陣列。通過乙個 for 迴圈,從左到右將 a 陣列的元素,從右到左地賦值到 b 陣列中,最後輸出陣列 b 得到結果。

**如下:

public

void

s1_1()

;int b=

newint[5

];for(

int i =

0; i < a.length; i++

)for

(int i =

0; i < a.length; i++

) system.out.

println

(arrays.

tostring

(b))

;}

這段**的輸入資料是 a,資料量就等於陣列 a 的長度。**中有兩個 for 迴圈,作用分別是給b 陣列初始化和賦值,其執行次數都與輸入資料量相等。因此,**的時間複雜度就是 o(n)+o(n),也就是 o(n)。

空間方面主要體現在計算過程中,對於儲存資源的消耗情況。上面這段**中,我們定義了乙個新的陣列 b,它與輸入陣列 a 的長度相等。因此,空間複雜度就是 o(n)。

接著我們看一下第二種編碼方法,它定義了快取變數 tmp,接著通過乙個 for 迴圈,從 0 遍歷到a 陣列長度的一半(即 len(a)/2)。每次遍歷執行的是什麼內容?就是交換首尾對應的元素。最後列印陣列 a,得到結果。

**如下:

public

void

s1_2()

;int tmp =0;

for(

int i =

0; i <

(a.length /2)

; i++

) system.out.

println

(arrays.

tostring

(a))

;}

這段**包含了乙個 for 迴圈,執行的次數是陣列長度的一半,時間複雜度變成了 o(n/2)。根據複雜度與具體的常係數無關的性質,這段**的時間複雜度也就是 o(n)。

空間方面,我們定義了乙個 tmp 變數,它與陣列長度無關。也就是說,輸入是 5 個元素的陣列,需要乙個 tmp 變數;輸入是 50 個元素的陣列,依然只需要乙個 tmp 變數。因此,空間複雜度與輸入陣列長度無關,即 o(1)。

我們在寫**的時候應考慮時間複雜度和空間複雜度,用盡可能少的時間損耗和盡可能少的空間損耗去完成任務。

直接上例子:定義乙個陣列 a = [1, 4, 3],查詢陣列 a 中的最大值,**如下:

public

void

s1_3()

;int max_val =-1

;int max_inx =-1

;for

(int i =

0; i < a.length; i++)}

system.out.

println

(max_val)

;}

**的結構上需要使用乙個 for 迴圈,對陣列所有元素處理一遍,所以時間複雜度為 o(n)。

又乙個例子,定義乙個陣列 a = [1, 3, 4, 3, 4, 1, 3],並查詢陣列**現次數最多的那個數字:

public

void

s1_4()

;int val_max =-1

;int time_max =0;

int time_tmp =0;

for(

int i =

0; i < a.length; i++)if

(time_tmp > time_max)}}

system.out.

println

(val_max)

;}

**採用了雙層迴圈的方式計算:第一層迴圈,我們對陣列中的每個元素進行遍歷;第二層迴圈,對於每個元素計算出現的次數,並且通過當前元素次數 time_tmp 和全域性最大次數變數 time_max 的大小關係,持續儲存出現次數最多的那個元素及其出現次數。由於是雙層迴圈,這段**在時間方面的消耗就是 n*n 的複雜度,也就是 o(n²)。

乙個順序結構的**,時間複雜度是 o(1)。

二分查詢,或者更通用地說是採用分而治之的二分策略,時間複雜度都是 o(logn)。

乙個簡單的 for 迴圈,時間複雜度是 o(n)。

兩個順序執行的 for 迴圈,時間複雜度是 o(n)+o(n)=o(2n),其實也是 o(n)。

兩個巢狀的 for 迴圈,時間複雜度是 o(n²)。

演算法複雜度 時間複雜度和空間複雜度

1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...

演算法複雜度 時間複雜度和空間複雜度

演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...

演算法複雜度 時間複雜度和空間複雜度

演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...