第二章 演算法
2.2 「資料結構」與「演算法的關係」
簡單的說:「資料結構」與「演算法」的關係 --- 即:「梁山伯」與「祝英台」的關係
把其中一方隔離出來唱獨角戲....沒意義!
2.3 兩種演算法的比較
現寫乙個求1+2+3+......+100結果的程式,你應該怎麼寫呢?
大多數人馬上寫出下面的c語言**:
int i, sum =0, n=100;
for (i=1;i<=n;i++)
printf("%d",sum);
這是最簡單的電腦程式之一,它就是一種演算法,不去理解**含義,問題在於,你的第一直覺這樣寫,是不是真的很好?是不是高效?
我們來看看高斯的解釋演算法:
用程式來實現如:
int i, sum=0,n=100;
sum = (1+n)*n/2;
printf("%d",sum);
神通就是神通,這樣不僅可以用於1加到100,就是加到一千、一萬、一億(需要更改整型變數型別為長整型,否則溢位),也就是瞬間的事。
2.7 演算法效率的度量方法
事前分析估算方法:在計算機程式編制前,依據統計方法對演算法進行估算。
經過分析,我們發現,乙個用高階程式編寫的程式在計算機上執行時間所消耗的時間取決於下列因素:
1.演算法採用的策略、方法; //演算法好壞的根本
2.編譯產生的**質量; //要由軟體來支援
3.問題的輸入規模;
4.機器執行的指令速度; //看硬體的效能
乙個程式的執行時間,依賴於演算法的好壞和問題的輸入規模。所謂問題輸入規模是指輸入量的多少。
我們來看下兩種求和的演算法:
第一種演算法:
int i, sum =0, n=100; /*執行一次*/
for (i=1;i<=n;i++) /*執行n+1次*/
printf("%d",sum); /*執行一次*/
第二種演算法:
int i, sum=0,n=100; /*執行一次*/
sum = (1+n)*n/2; /*執行一次*/
printf("%d",sum); /*執行一次*/
顯然,第一種演算法,執行了 1+(n+1)+n+1=2n+3次 ;第二種演算法,執行了1+1+1=3次
我們再來延伸乙個例子:
int i ,j ,x=0,sum=0, n=100;
for(i=1;i<=n;i++)
}printf("%d",sum);
這個例子,i從1到100,每次都要讓j迴圈100次,而當中的x++和sum=sum+x;其實就是1+2+3+...+100 ,也就是100^2次,所以這個演算法當中,迴圈部分的**整體需要執行n^2次。顯然這個演算法的執行次數對於同樣的輸入規模n=100,要多於前兩種演算法,這個演算法的執行時間隨著n的增加也將遠遠多於前兩個。 《大話資料結構》學習筆記2
演算法是解決特定問題求解步驟的描述,在計算機表現為指令的有限序列,其中每條指令表現為乙個或多個操作。序號正確性的四個層次 目前以第三層為正確的標準 1演算法程式的語法正確 2合法的輸入可以產生滿足要求的輸出結果 3非法的輸入能夠得到滿足規格說明的結果 4對於精心選擇的測試資料也能夠有滿足要求的輸出結...
《大話資料結構》 學習筆記1
第一章 資料結構緒論 經典 if you give someone a program you will frustrate them for a day if you teach tem how to program,you will frustrate them for a lifetim.如果...
《大話資料結構》 學習筆記5
線性表的順序儲存結構,指的是用一段位址連續的儲存單元依次儲存線性表的資料元素。線性表 a1,a2,a3,an 的順序儲存示意圖如下 a1a2 ai 1 ai.an 線性表的順序儲存結構,說白了,就是 在記憶體中找了塊地兒,通過佔位的形式,把一定的記憶體空間給佔了,然後把相同資料型別的資料元素一次存放...