如何評價乙個演算法的好壞

2021-09-19 23:45:55 字數 3012 閱讀 3934

首先,這個演算法必須是正確的

其次,好的演算法應該是友好的,便於人們理解和交流,並且是機器可執行的。

這個演算法還需要足夠健壯,即當輸入的資料非法或不合理時,也能適當的做出正確的反應或進行相應的處理

最後它還必須擁有高效率和低儲存量要求。

也就是所謂的時間複雜度空間複雜度

1.時間複雜度

定義:在電腦科學中,演算法的時間複雜度是乙個函式,他定量描述了該演算法的執行時間.乙個演算法執行所耗費的時間,從理論上講,只有你把你的程式放機器上跑起來,才能知道.然而我們有一套時間複雜度的分析方式.乙個演算法所花費的時間與其中語句的執行次數成正比例.演算法中的基本操作的執行次數,為演算法的時間複雜度.

2.時間複雜度為什麼不使用時間來衡量而使用基本語句的執行次數來衡量

演算法的執行時間依賴於具體的軟硬體環境,所以,不能用執行時間的長短來衡量演算法的時間複雜度,而要通過基本語句執行次數的數量級來衡量。

3.時間複雜度的o漸進表示法(big o notation)

是用於描述函式漸進行為的數學符號.

大o階方法推導:

計算基本語句的執行次數的數量級; 

只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的係數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。

如果演算法中包含巢狀的迴圈,則基本語句通常是最內層的迴圈體,如果演算法中包含並列的迴圈,則將並列迴圈的時間複雜度相加。例如:

for (i=1; i<=n; i++)

x++;  

for (i=1; i<=n; i++)

for (j=1; j<=n; j++)

x++;

第乙個for迴圈的時間複雜度為ο(n),第二個for迴圈的時間複雜度為ο(n2),則整個演算法的時間複雜度為ο(n+n2)=ο(n2)。

4.時間複雜度的:最優、平均、最差情況,為什麼時間複雜度看的是最差情況

最差情況下的複雜度是所有可能的輸入資料所消耗的最大資源,如果最差情況下的複雜度符合我們的要求,我們就可以保證所有的情況下都不會有問題。

某些演算法經常遇到最差情況。比如乙個查詢演算法,經常需要查詢乙個不存在的值。

也許你覺得平均情況下的複雜度更吸引你,可是平均情況也有幾點問題。第一,難計算,多數演算法的最差情況下的複雜度要比平均情況下的容易計算的多,第二,有很多演算法的平均情況和最差情況的複雜度是一樣的. 第三,什麼才是真正的平均情況?如果你假設所有可能的輸入資料出現的概率是一樣的話,也是不合理的。其實多數情況是不一樣的。而且輸入資料的分布函式很可能是你沒法知道。

考慮最好情況的複雜度更是沒有意義。

5.如何求解:二分查詢、遞迴求階乘、遞迴斐波那契的時間複雜度?

二分查詢:通過摺紙查詢求解時間複雜度為o(logn);

遞迴求階乘:數基本操作遞迴n次得到時間複雜度為o(n);

遞迴斐波那契:分析得出基本操作遞迴了2n次,時間複雜度為o(2n);

6.什麼是空間複雜度?

空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的度量.空間複雜度不是程式占用了多少bytes的空間,因為這個也沒太大意義,所以空間複雜度算的是變數的個數.空間複雜度計算規則基本跟時間複雜度類似,也使用大o漸進法表示.

7.如何求空間複雜度? 普通函式&遞迴函式

乙個演算法的空間複雜度只考慮在執行過程中為區域性變數分配的儲存空間的大小,它包括為參數列中形參變數分配的儲存空間和為在函式體中定義的區域性變數分配的儲存空間兩個部分。若乙個演算法為 遞迴演算法,其空間複雜度為遞迴所使用的堆疊空間的大小,它等於一次呼叫所分配的臨時儲存空間的大小乘以被呼叫的次數(即為遞迴呼叫的次數加1,這個1表示開始進行的一次非遞迴呼叫)。演算法的空間複雜度一般也以數量級的形式給出。如當乙個演算法的空間複雜度為乙個常量,即不隨被處理資料量n的大小而改變時,可表示為o(1);當乙個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為o(log2n);當乙個演算法的空間複雜度與n成線性比例關係時,可表示為o(n).若形參為陣列,則只需要為它分配乙個儲存由實參傳送來的乙個位址指標的空間,即乙個機器字長空間;若形參為引用方式,則也只需要為其分配儲存乙個位址的空間,用它來儲存對應實參變數的位址,以便由系統自動引用實參變數。

8. 分析遞迴斐波那契數列的:時間、空間複雜度,並對其進行優化,偽遞迴優化—>迴圈優化

long long fib(int n)
普通遞迴實現的斐波那契數列:

時間複雜度:o(2^n)

計算並根據o漸進表示法得出時間複雜度.

空間複雜度:o(n);遞迴深度乘以(每一次遞迴的空間占用)

偽遞迴優化:

long long fib (long long first, longlong second, int n)
時間複雜度:

o(n);

遞迴深度乘以每次遞迴的迴圈次數

空間複雜度:

o(1)或o(n)

關鍵看編譯器是否優化,優化則為o(1)否則o(n);

迴圈優化:

long long  fib(int n) 

return second;

}

時間複雜度:o(n);

空間複雜度:o(1);

9.常見時間複雜度

常見的演算法時間複雜度由小到大依次為:  ο(1)<ο(log2n)<ο(n)<ο(nlog2n)<ο(n2)<ο(n3)<…<ο(2n)<ο(n!)  ο(1)表示基本語句的執行次數是乙個常數,一般來說,只要演算法中不存在迴圈語句,其時間複雜度就是ο(1)。ο(log2n)、ο(n)、ο(nlog2n)、ο(n2)和ο(n3)稱為多項式時間,而ο(2n)和ο(n!)稱為指數時間。

演算法分析 如何分析乙個演算法的效率好壞?

什麼是演算法分析 當我們說演算法分析的時候我們在說什麼?狹義的技術層面的定義 演算法分析指的是 對演算法在執行時間和儲存空間這兩種資源的利用效率進行研究。即時間效率和空間效率。時間效率指演算法執行有多快 空間效率指演算法執行時需要多少額外的儲存空間。時間效率也叫時間複雜度 空間效率也叫空間複雜度。在...

評價乙個演算法的優劣

演算法 把生活中大量且複雜的問題以特定的資料型別和特定的儲存結構儲存到主儲存器中,且在此基礎上為實現某些功能而對此進行的操作。這並不是指所花費的時間,因為在不同的環境下執行程式 也會對時間造成影響,而此處所說的時間複雜程度只是指執行該演算法大概所需要的次數。計算機的記憶體是有限的,而對記憶體使用不當...

如何衡量乙個量化策略的好壞

轉 如何衡量乙個量化策略的好壞?我們認為有三點,一是有比較穩定的收益,二是有嚴謹的回測,三是有清晰的邏輯,這才能算得上乙個好的量化策略。大家可以對照這三條比較一下,如果滿足這三條,我們就稱它是乙個好的量化策略.國泰君安 金融工程領域研究首席分析師劉富兵 量化投資以投資者的智慧型為核心,以計算機為工具...