<rp id="wnpn7"><ruby id="wnpn7"></ruby></rp>
<progress id="wnpn7"><track id="wnpn7"><rt id="wnpn7"></rt></track></progress>
<ruby id="wnpn7"></ruby>
<ruby id="wnpn7"><blockquote id="wnpn7"><div id="wnpn7"></div></blockquote></ruby>

    1. <em id="wnpn7"><ruby id="wnpn7"><input id="wnpn7"></input></ruby></em>
      1. <button id="wnpn7"><acronym id="wnpn7"></acronym></button><button id="wnpn7"><acronym id="wnpn7"></acronym></button>

        <rp id="wnpn7"><acronym id="wnpn7"></acronym></rp>

        <li id="wnpn7"><object id="wnpn7"><u id="wnpn7"></u></object></li>
        VB.net 2010 視頻教程 VB.net 2010 視頻教程 python基礎視頻教程
        SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
        當前位置:
        首頁 > 編程開發 > c#教程 >
        • 程序員必知的算法和數據結構:2500字性能總結

        本站最新發布   C#從入門到精通
        試聽地址  
        http://www.squ68.com/eschool/CSharpxin3721/

        在這一章節,我們將要學習一個編程非常重要的事情:成本(cost),這是無論何時編碼,你都要去思考的一件事。為了研究程序運行的成本,我們必須遵循科學的方法(Scientific method)來研究我們所寫的程序。我們也會應用數學分析(mathematical analysis)去推理形成精確的成本模型。

         

         

         

        1科學方法(Scientific method)

         

        以下5個步驟總結了此方法,依次為如下,我們設計的實驗必須是可以重現的,我們形成的假設必須是具有真偽的。

         

         

         

         

        2觀察(Observations)

         

         

        測試程序運行的精確時間有時是困難的,但是我們有許多輔助工具。在這里,我們簡化程序運行時間的模型,考慮各種輸入情況,并測試每種情況下的運行時間,編寫的這個程序名稱為:Stopwatch.java,如下所示:

         

         1public class Stopwatch { 
         2
         3    private final long start;
         4
         5    public Stopwatch() {
         6        start = System.currentTimeMillis();
         7    } 
         8
         9    public double elapsedTime() {
        10        long now = System.currentTimeMillis();
        11        return (now - start) / 1000.0;
        12    }
        13
        14    public static void main(String[] args) {
        15        int n = Integer.parseInt(args[0]);
        16
        17        // sum of square roots of integers from 1 to n using Math.sqrt(x).
        18        Stopwatch timer1 = new Stopwatch();
        19        double sum1 = 0.0;
        20        for (int i = 1; i <= n; i++) {
        21            sum1 += Math.sqrt(i);
        22        }
        23        double time1 = timer1.elapsedTime();
        24        StdOut.printf("%e (%.2f seconds)\n", sum1, time1);
        25
        26        // sum of square roots of integers from 1 to n using Math.pow(x, 0.5).
        27        Stopwatch timer2 = new Stopwatch();
        28        double sum2 = 0.0;
        29        for (int i = 1; i <= n; i++) {
        30            sum2 += Math.pow(i, 0.5);
        31        }
        32        double time2 = timer2.elapsedTime();
        33        StdOut.printf("%e (%.2f seconds)\n", sum2, time2);
        34    }
        35

         

        對于大多數程序,首先我們能想到的量化觀察是它們有問題的大小( problem size)區別,這個表征了計算復雜度或計算難度。一般地,問題大小既可以指通過輸入數據的大小,也可以指通過命令行參數輸入值。直覺上,運行時間應該會隨著問題大小而增加,但是增加的程度怎么度量,這是我們編程運行程序時常遇到的問題。

         

         

        3具體例子

         

        為了闡述方法,我們先引入一個具體的編程問題:ThreeSum,它是在給定的含有 n 個元素的數組中找出三元組之和等于0的個數。這個問題最簡單的一個解法:枚舉,代碼如下:

         

         1public class ThreeSum {
         2
         3    // print distinct triples (i, j, k) such that a[i] + a[j] + a[k] = 0
         4    public static void printAll(int[] a) {
         5        int n = a.length;
         6        for (int i = 0; i < n; i++) {
         7            for (int j = i+1; j < n; j++) {
         8                for (int k = j+1; k < n; k++) {
         9                    if (a[i] + a[j] + a[k] == 0) {
        10                        StdOut.println(a[i] + " " + a[j] + " " + a[k]);
        11                    }
        12                }
        13            }
        14        }
        15    } 
        16
        17    // return number of distinct triples (i, j, k) such that a[i] + a[j] + a[k] = 0
        18    public static int count(int[] a) {
        19        int n = a.length;
        20        int count = 0;
        21        for (int i = 0; i < n; i++) {
        22            for (int j = i+1; j < n; j++) {
        23                for (int k = j+1; k < n; k++) {
        24                    if (a[i] + a[j] + a[k] == 0) {
        25                        count++;
        26                    }
        27                }
        28            }
        29        }
        30        return count;
        31    } 
        32
        33    public static void main(String[] args)  34        int[] a = StdIn.readAllInts();
        35        Stopwatch timer = new Stopwatch();
        36        int count = count(a);
        37        StdOut.println("elapsed time = " + timer.elapsedTime());
        38        StdOut.println(count);
        39    } 
        40

         

        我們在這里主要關心的是輸入數據大小與運行時長的關系。我們循著如下的思路分析兩者間的關系:

         

        加倍假設(Doubling hypothesis) 對于大量的程序而言,我們能很快地形成如下假設:假如輸入數據的個數加倍,運行時間怎么變化。

        經驗分析(Empirical analysis一種簡單的實現加倍假設的方法是使輸入數據的個數加倍,然后觀察對運行時長的影響。如下所示為一個簡單的通過加倍輸入個數,測試運行時長的程序:DoublingTest.Java.

         

         1public class DoublingTest {
         2
         3    public static double timeTrial(int n) {
         4        int[] a = new int[n];
         5        for (int i = 0; i < n; i++) {
         6            a[i] = StdRandom.uniform(2000000) - 1000000;
         7        }
         8        Stopwatch s = new Stopwatch();
         9        ThreeSum.count(a);
        10        return s.elapsedTime();
        11    }
        12
        13
        14    public static void main(String[] args) 15        StdOut.printf("%7s %7s %4s\n""size""time""ratio");
        16        double previous = timeTrial(256);
        17        for (int n = 512true; n += n) {
        18            double current = timeTrial(n);
        19            StdOut.printf("%7d %7.2f %4.2f\n", n, current, current / previous);
        20            previous = current;
        21        } 
        22    } 
        23}
        

         

         

        再回到ThreeSum.java程序中,我們生成一系列隨機數,填充到輸入數組中,每一個時步都加倍輸入元素個數,然后觀察到每一次程序所運行的時間都會大致增加8倍,這個就可以讓我們下結論說輸入數據加倍后運行時間增加了8倍。如下圖中左側視圖所示,當輸入大小為4K時,運行時長為64T,當輸入帶下為8K時,運行時長變為原來的8倍:512T.

         

        相關教程
                
        免费看成年人视频大全_免费看成年人视频在线观看