【算法的时间复杂度和空间复杂度】-算法02
算法的時間復雜度和空間復雜度
一個算法的好壞我們主要從"時間"和"空間" 兩個維度來衡量
時間維度:是指執行當前算法所消耗的時間,我們通常用 “時間復雜度” 來描述。
空間維度:是指執行當前算法需要占用多少內存空間,我們通常用 “空間復雜度” 來描述。
1. 時間復雜度
我們先來看一個簡單的例子
public class TimeCompare {public static void main(String[] args) {int num1=0;int num2=0;//計算1-1000的和-循環求和long start1 = System.currentTimeMillis();for(int i=1;i<=100000;i++){num1+=i;}long start2 = System.currentTimeMillis();//前n項和公式:(首項+末項)*項數/2long start3 = System.currentTimeMillis();num2=(1+100000)*100000/2;long start4 = System.currentTimeMillis();System.out.println("num1:"+num1+" 時間:"+(start2-start1)+"ms");System.out.println("num2:"+num2+" 時間:"+(start4-start3)+"ms");} }結果:
num1:705082704 時間:3ms num2:705082704 時間:0ms兩種方法都可以算出前n項和,但是時間上面卻是天壤之別
上面我們通過運行程序得到的時間并不能真正表示時間復雜度,因為程序的運行會受計算機和運行環境的影響
大O符號表示法:
我們一般用 “算法的漸進時間復雜度” 衡量時間復雜度 即:T(n) = O(f(n))
解釋: f(n) 表示每行代碼執行次數之和
舉個栗子:
for(int i=0;i<n;i++){System.out.println("時間復雜度")}時間復雜度為n,因為輸出語句會執行n次
注意:我們求時間復雜度時,直接保留最高次的即可,并且最高次的系數可以省略,常數也可以省略
如:3n^2+2n+1我們會寫為:T(n)=n^2
常見的時間復雜度量級有:
-
常數階O(1) 只要沒有循環等復雜結構就是常數階
-
對數階O(logN)
//跳出循環需要 2^X=n 即 X=logN(2為底) 事件復雜度為:O(logN) int i = 1; while(i<n) {i = i * 2; } -
線性階O(n) n次循環就是線性階
-
線性對數階O(nlogN) n次對數階
-
平方階O(n2)
-
立方階O(n3)
-
K次方階O(n^k)
-
指數階(2^n)
從上到下時間復雜度依次變大,程序效率變低
2. 空間復雜度
空間復雜度是對一個算法在運行過程中臨時占用存儲空間大小的一個量度,同樣反映的是一個趨勢,我們用
S(n) =O(fn)來定義。
空間復雜度常用的有:O(1)、O(n)、O(n^2)、O(n^3)…
例:
算法執行需要的臨時空間不會隨著某個變量n的變化而變化,
此時空間復雜度為常量:即S(n)=O(1)
//S(n)=O(1) int i=0; i++; int j=0,k=1; //空間復雜度為:S(n)=O(n) int[] arr=new int[n]; for(int i=0;i<arr.length;i++){arr[i]=i; }空間復雜度再看只看占用空間(內存)大小-即聲明的變量,和執行次數無關
總結
以上是生活随笔為你收集整理的【算法的时间复杂度和空间复杂度】-算法02的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【两分钟带你了解树】数据结构04-树结构
- 下一篇: 【二叉树详解】二叉树的创建、遍历、查找以