衡量乙個演算法的好壞一般由兩個維度來表示。時間複雜度和空間複雜度。
時間複雜度:表示演算法的執行時間,t(n) = o(f(n))
空間複雜度:表示演算法的暫用記憶體空間,s(n) = o(1)
時間複雜度
首先要說的這裡的執行時間並不是指計算程式具體執行的時間,而是演算法執行語句的次數。
忽略不同的機器配置和外界因素,上面例子執行第一遍的時間為1個單位時間,那麼最後決定他的就是這個n,時間複雜度為時間複雜度表示是o(n)。for(i=1; i<=n; i++)
無論**執行了多少行,只要是沒有迴圈等複雜結構只要是沒有迴圈等複雜結構,那這個**的時間複雜度就都是o(1)。n=10;
for(i=1;i<=n;i++)
該演算法執行次數是10,是乙個常數,用時間複雜度表示是o(1)。
該演算法for迴圈,最外層迴圈每執行一次,內層迴圈都要執行n次,執行次數是根據n所決定的,時間複雜度是o(n^2),如果我將最內層的n換成m,那此演算法的時間複雜度就是 o(m*n)。,如果內層迴圈在某種場景一次就跳出,其實也可以退化成o(n), 通常我們計算時間複雜度都是計算最多情況.由此類推,如果是三層迴圈,最大時間複雜度就是 o(n^3)。for (i = 0; i < n; i++)
}
**中的 a、b、c所分配的空間都不隨著處理資料量變化,因此它的空間複雜度 s(n) = o(1).int i = 1;
while(i2 的 x 次方等於 n,那麼x = log2n,此演算法的時間複雜度就是o(logn);
總結:常見的時間複雜度有:
常數階o(1),
對數階o(log2 n),
線性階o(n),
線性對數階o(n log2 n),
平方階o(n^2),
立方階o(n^3)
k次方階o(n^k),
指數階o(2^n)。
隨著n的不斷增大,時間複雜度不斷增大,演算法花費時間越多。
計算方法
①選取相對增長最高的項
②最高項係數是都化為1
③若是常數的話用o(1)表示
空間複雜度
空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。
a=1;
b=2;
c=a+b;
遞迴實現,呼叫fun函式,每次都建立1個變數k。呼叫n次,空間複雜度o(n*1)=o(n)。fun(n)
總結:①忽略常數,用o(1)表示
②遞迴演算法的空間複雜度=遞迴深度n*每次遞迴所要的輔助空間
③對於單執行緒來說,遞迴有執行時堆疊,求的是遞迴最深的那一次壓棧所耗費的空間的個數,因為遞迴最深的那一次所耗費的空間足以容納它所有遞迴過程。
對於乙個演算法來說,空間複雜度和時間複雜度往往是相互影響的。
當追求乙個較好的時間複雜度時,可能會使空間複雜度的效能變差,即可能導致占用較多的儲存空間;反之,當追求乙個較好的空間複雜度時,可能會使時間複雜度的效能變差,即可能導致占用較長的執行時間。
有時我們可以用空間來換取時間以達到目的。
常識
演算法的複雜度 演算法的時間複雜度和空間複雜度
在一次筆試題目中,發現了自己對於演算法的時間複雜度問題上並沒有完全清晰這個概念和計算方法,故上網尋找到比較好的詳細介紹來學習。演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也...
演算法的複雜度 時間複雜度與空間複雜度
通常,對於乙個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式 數學歸納法等。而在證明演算法是正確的基礎上,第二步就是分析演算法的時間複雜度。演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很...
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...