算法

一大早發了個軟件版本,又不知道幹嘛了,繼續看書吧。。。

算法
算法是解決特點問題求解步驟的描述,在計算機中表現爲指令的有限序列,並且每條指令表示一個或多個操作。

算法的度量方式
有事後統計方法和事前分析估算法。
事後統計就是用記時器統計代碼執行的時間。
事前統計就是在依據特點的統計方法對算法進行估算
記得剛畢業找工作那會兒最怕人家問什麼時間複雜度空間複雜度的,非科班出身的對這些真的不是太懂。
先看兩種算法

        int sum =0;      //執行一次
        int n =100;      //執行一次
        for(int i=0;i<=n;i++){ //執行n+1次
            sum+=i;       //執行n次
        }
---------------------------------

        sum = (1+n)*n/2;    //執行一次

        System.out.print("sum ="+sum);

這兩個算法完成的是同一件事,都是求1加到100的和
但是可以看出第一個算法執行了1+1+n+1+n=2n+3次 而第二個算法加上上面的變量初始化一共執行了 1+1+1=3 次
忽略掉初始化的部分發現這兩個算法 就是2n和1的差別,這樣看發現算法的作用還是很大的。
這裏只是一層循環,當有兩層循環時,它會執行nxn次

由此可以發現測定運行時間最可靠的方法就是計算對運行時間有消耗的基本操作的執行次數,運行時間和這個計數是成正比的。

算法時間複雜度定義
在進行算法分析是,語句總的執行次數T(n)是關於問題規模n的函數,進而分析T(n)隨n的變化情況並確定T(n)的數量級,算法的時間複雜度,也就是算法的時間量度,記做T(n)=O(f(n))。它表示隨問題規模n的增長,算法執行時間的增長率和f(n)的增長率相同,稱作算法的漸進時間複雜度,簡稱爲時間複雜度,其中f(n)是問題規模n的某個函數。
用大寫O()來體現算法時間複雜度的記法,稱爲大O記法。

通過這個定義,可以分析上面的兩個求和算法時間複雜度分別爲O(n),O(1)。

推導大O的方法
1、用常量1取代運行時間中的所有加法常量; 上面的2n+3 就變成了n+1
2、在修改後的運行次數函數中,只保留最高階項,假如是 n^2+n 就變成了只有n^2
3、如果最高階項存在且不是1,則去除與這個項相乘的常數 如 2*n^2就變成了n^2;
得到的結果就是大O。

算法空間複雜度

算法的空間複雜度通過計算算法所需的存儲空間實現,

若算法執行時所需的輔助空間相對於輸入數據量而言是個常數,則稱此算法爲原地工作
空間複雜度爲O(1).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章