算法分析--冪測試

    最近看《算法分析與設計》,裏面提到了一個用實驗來估計算法的時間複雜度的方法:冪測試。具體來講就是假設算法的時間函數是 f(n),而後將數對(n,f(n))映射成(log(n),log(f(n)))。這樣若是原來f(n)=a * n^c, 也就是時間函數是個冪函數,則可獲得 log(f(n)) = log(a * n^c) = log(a) + c * log(n),是一個線性函數。
    基於上面的理論,咱們能夠經過試驗數據來繪製曲線:x=log(n),y=(log(f(n)))。若是曲線收斂到一個常數,則f(n)是個亞線性函數;若是是條直線,則f(n)是個冪函數;若是曲線急劇增加,則f(n)是超多項式的,例如指數函數等。javascript

    下面是一個簡單的html5代碼,用來繪製一個函數的冪測試曲線。現實中能夠將試驗數據拼裝成json數據,而後由下面的代碼繪製。html

     

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 5 <title>冪測試</title>
 6 <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
 7 </head>
 8 
 9 <body>
10     <canvas id='g' width="470px" height="350px" style="border:2px; background:black;">
11     </canvas>
12     <textarea id="log" style="width:470px;height:350px;"></textarea>
13 </body>
14 <script type="text/javascript">
15 var consts = {
16     width : 450,
17     height : 330,
18     scaleX : 20.0,
19     scaleY : 10.0,
20     maxN : 10000,
21     step : 10,
22     pad : 5
23 };
24 
25 function log(n) {
26     return Math.log(n) / Math.log(2);
27 };
28 
29 //函數
30 function f(n) {
31     //return 12 * n; //線性
32     //return 6 * n * log(n);
33     //return n * n * n; //3次函數
34     return Math.pow(2, n);//指數函數
35 };
36 
37 var g = $('#g')[0].getContext('2d');
38 g.strokeStyle = '#BBFFFF';
39 g.lineWidth = 2;
40 
41 var pad = consts.pad;
42 var pad2 = consts.pad * 2;
43 //繪製縱座標
44 g.moveTo(pad2,pad2 + consts.height);
45 g.lineTo(pad2,consts.pad);
46 g.lineTo(pad2-2,pad+5);
47 g.moveTo(pad2,pad);
48 g.lineTo(pad2+2,pad+5);
49 
50 //繪製橫座標
51 g.moveTo(pad,pad + consts.height);
52 g.lineTo(pad2 + consts.width, pad + consts.height);
53 g.lineTo(pad2 + consts.width-5, pad + consts.height-2);
54 g.moveTo(pad2 + consts.width, pad + consts.height);
55 g.lineTo(pad2 + consts.width-5, pad + consts.height+2);
56 
57 //繪製函數的log圖 x->log(n), y->log(f(n))
58 for(var i = 2; i < consts.maxN; i += consts.step) {
59     var x = log(i);
60     var y = log(f(i));
61     var px = pad2 + x * consts.scaleX;
62     var py = pad + consts.height - y * consts.scaleY;
63     if(i == 2)
64         g.moveTo(px,py);
65     else
66         g.lineTo(px,py);
67         
68     //$('#log').append(i + ':' + Math.round(x*100)/100.0 + ',' + Math.round(y*100)/100.0 + '\n');
69 }
70 
71 g.stroke();
72 </script>
73 </html>
相關文章
相關標籤/搜索