我們要想去度量乙個演算法的效能,有多種方法,比如度量演算法的執行時間,統計指令,度量演算法所使用的記憶體等方法,下面我們乙個乙個的來解讀一下
度量演算法的執行時間的一種方法是,利用計算機自帶的乙個計時器,來獲取乙個迴圈所執行的執行時間,我們通過連續幾個迴圈的執行時間從而找出每乙個迴圈之間數字和時間的關係,比如每一次迴圈的時間都會以指數級增長等。我們來看看下面的python**,這一段**設計了多次迴圈,並利用計算機本身的時鐘進行計時,每乙個迴圈之間的時間關係是怎樣的呢?
importtime
problemsize=100000
for count in range(10):
start=time.time()
work=1
for x in
range(problemsize):
work+=1work-=1elapsed=time.time()-start
print("
%12d%16.3f
"%(problemsize,elapsed))
problemsize*=2
這段python**的執行結果為:
100000 0.015200000 0.028
400000 0.052
800000 0.101
1600000 0.205
3200000 0.419
6400000 0.862
12800000 1.699
25600000 4.483
51200000 6.667
我們可以看到,基本上當問題的大小翻倍的時候,執行的時間也會進行翻倍,利用這個規律再計算之後下乙個迴圈的執行時間就沒有什麼難度了,當然後面當問題的大小太大的時候,可能不會以這個規律進行運算,但是對規模較小的情況下還是適用的。
用於估算演算法的另一種藝術,用於統計不同問題規模所需要執行的指令的個數,這種方式比度量演算法執行時間可能會更加精確一些,但是我們需要記住,這個統計是用於統計高階語言當中的指令個數而不是低階語言(機器語言)當中的指令個數。在分析演算法的時候,我們分為兩類指令來分別進行統計:
1.不管問題的規模有多大,都執行相同次數的指令
2.根據問題的規模,執行不同次數的指令
我們來看下下面的迴圈針對不同資料集內部的迴圈會迭代多少次:
importtime
problemsize=1000
for count in range(5):
number=0
work=1
for i in
range(problemsize):
for k in
range(problemsize):
number+=1work+=1work-=1
print("
%12d%15d
"%(problemsize,number))
problemsize*=2
最後得到的結果是:
1000 10000002000 4000000
4000 16000000
8000 64000000
16000 256000000
從結果當中可以看出迭代的次數是問題規模的平方
這樣的演算法也是可以用於度量演算法的效能的,我們將會後面的章節進行解說。
如何評估演算法效能 大O表示法
一 請問如何評估乙個演算法的效能?什麼是大o表示法?答 評估演算法效能,主要評估問題的輸入規模n與元素訪問次數f n 的次數。大o符號,忽略非主體部分,如常數項 低階項。o g n g n 表示漸進上界。二 請說出以下程式的時間複雜度?for int i 1 i n i o n 線性複雜度 for ...
評估演算法的核心指標
1.時間複雜度 流程決定 2.額外空間複雜度 流程決定 3.常數項時間 實現細節決定 如果乙個操作的執行時間不以具體樣本量為轉移,每次執行時間都是固定時間,這樣的操作就是常數時間的操作。例如 在進行加法運算時,加法所用的時間與相加的兩個數字的大小是沒有關係的 取出陣列中第一千位置和一千億位置的數字,...
評估演算法核心指標理解
1.時間複雜度 這個是由流程決定的,那什麼叫做流程決定?就是看你是怎麼設計這套流程演算法的。舉例 如果你是直接根據下標索引直接找到資料,那麼你的時間複雜度就為o 1 而如果是迴圈遍歷比對找到資料,那麼你的時間複雜度就位o n 2.額外空間複雜度 這個也是由流程決定的。首先什麼叫做額外空間複雜度,就是...