《大話數據結構》讀後總結(四)

1、算法

一、算法效率的度量方法

1.1 過後統計方法
  • 經過設計好的測試程序和數據,利用計算機計時器對不一樣算法編制的程序的運行時間進行比較,從而肯定算法效率的高低。該方法具備很大缺陷,不予採納。php

    1.必須依據算法事先編制好程序,花費時間和人力算法

    2.時間的比較依賴計算機硬件和軟件等環境因素,有時會掩蓋算法自己的優劣。函數

    3.算法的測試數據設計困難,而且程序的運行時間每每還與測試數據的規模有很大關係,效率高的算法在小的測試數據面前每每得不到體現。學習

1.2 過後統計方法
  • 在計算機程序編制前,依據統計方法對算法進行估算。測試

  • 通過分析,咱們發現,一個用高級程序語言編寫的程序在計算機上運行時所消耗的時間取決於下列因素:設計

    1.算法採用的策略、方法。code

    2.編譯產生的代碼質量。編譯

    3.問題的輸入規模。效率

    4.機器執行指令的速度。軟件

  • 拋開這些與計算機硬件、軟件有關的因素,一個程序的運行時間,依賴於算法的好壞和問題的輸入規模。所謂問題輸入規模是指輸入量的多少。

  • 下面用兩種求和算法進行舉例。 第一種

int i, sum = 0,n = 100;     /* 執行1次 */
for (i = 1; i <= n; i++)    /* 執行了n+1次 */
{
    sum = sum + i;          /* 執行n次 */
}
printf("%d", sum);          /* 執行1次 */

第二種

int sum = 0,n = 100;      /* 執行一次 */
sum = (1 + n) * n / 2;    /* 執行一次 */
printf("%d", sum);        /* 執行一次 */
  • 第一種算法,執行了1+(n+1)+n+1次=2n+3次;
  • 第二種算法,是1+1+1=3次。
  • 事實上兩個算法的第一條和最後一條語句是同樣的,因此咱們關注的代碼實際上是中間的那部分,咱們把循環看做一個總體,忽略頭尾循環判斷的開銷,那麼這兩個算法其實就是n次與1次的差距。 第三種
int i, j, x = 0, sum = 0, n = 100;    /* 執行一次 */
for (i = 1; i <= n; i++)
{
    for (j = 1; j <= n; j++)
    {
        x++;    /* 執行n×n次 */
        sum = sum + x;
    }
}
printf("%d", sum);    /* 執行一次 */

這個例子中,i從1到100,每次都要讓j循環100次,而當中的x++和sum=sum+x;其實就是1+2+3+...+10000,也就是100^2次,因此這個算法當中,循環部分的代碼總體須要執行n^2次。

測定運行時間最可靠的方法就是計算對運行時間有消耗的基本操做的執行次數。運行時間與這個計數成正比。

一樣問題的輸入規模是n,求和算法的第一種,求1+2+...+n須要一段代碼運行n次。那麼這個問題的輸入規模使得操做數量是f(n)=n,顯然運行100次的同一段代碼規模是運算10次的10倍。而第二種,不管n爲多少,運行次數都爲1,即f(n)=1;第三種,運算100次是運算10次的1000倍。由於它是f(n)=n^2。

分析一個算法的運行時間時,重要的是把基本操做的數量與輸入規模關聯起來,即基本操做的數量必須表示成輸入規模的函數。 image

隨着n值的愈來愈大,它們在時間效率上的差別也就愈來愈大。

歡迎掃描下方二維碼,持續關注:

image

互聯網工程師(id:phpstcn),咱們一塊兒學習,一塊兒進步

相關文章
相關標籤/搜索