演算法(algorithm)是指用來運算元據、解決程式問題的一組方法。對於同乙個問題,使用不同的演算法,也許最終得到的結果是一樣的,比如排序就有前面的十大經典排序和幾種奇葩排序,雖然結果相同,但在過程中消耗的資源和時間卻會有很大的區別,比如快速排序與猴子排序:)。
那麼我們應該如何去衡量不同演算法之間的優劣呢?
主要還是從演算法所占用的「時間」和「空間」兩個維度去考量。
1,什麼是大o?
即 t(n) = o(f(n))。
其中 n 表示資料規模 ,o(f(n))表示執行演算法所需要執行的指令數,和f(n)成正比
2,常見的時間複雜度量級
(1)o(1):無論**執行了多少行,其他區域不會影響到操作,這個**的時間複雜度都是o(1)
void
swaptwoints
(int
&a,int
&b)
(2)o(n):for迴圈裡面的**會執行 n 遍,因此它消耗的時間是隨著 n 的變化而變化的,因此可以用o(n)來表示它的時間複雜度。int sum (
int n )
return ret;
}
(3)o(n²):當存在雙重迴圈的時候,即把 o(n) 的**再巢狀迴圈一遍,它的時間複雜度就是 o(n²) 了。void
selectionsort
(int arr,
int n)
}
(4)o(logn):在二分查詢法的**中,通過while迴圈,成 2 倍數的縮減搜尋範圍,也就是說需要經過 log2^n 次即可跳出迴圈,如下:int
binarysearch
(int arr,
int n ,
int target)
return-1
;}
(5)o(nlogn):將時間複雜度為o(logn)的**迴圈n遍的話,那麼它的時間複雜度就是 n * o(logn),也就是了o(nlogn)。void hello ()}
}
演算法時間複雜度空間複雜度
演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...
演算法 時間複雜度 空間複雜度
1 if i 1 2 a 1 result 3 4 result n 2 result 1000 1000 3 array.push a array.pop 4 map.set 1,1 map.get 1,1 在計算複雜度的時候,o 1 一般會被忽略。1 for let i 0 i n i 2 wh...
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...