第一講 基本概念 - 1 2019-11-14c++
寫在前面:算法
**課程來源:中國大學MOOC課程 -- 浙江大學 -- 數據結構 -- 陳越、何欽銘編程
**連接:https://www.icourse163.org/course/ZJU-93001數組
**此爲該課程第十次開課的筆記**數據結構
**預計一週學習 1-2講的內容;並更新博客**架構
Part-1框架
數據結構:相似與圖書館中擺放書籍、檢索、插入的問題。編程語言
解決問題的效率,跟數據的組織方法有關。函數
Part-2oop
循環與遞歸
例1:寫程序實現一個函數PrintN,使得傳入一個正整數爲N的參數後,能順序打印從1到N的所有正整數
1 // loop 2 void printN(int N){ 3 int i; 4 for(i=1;i<=N;i++){ 5 printf("%d ", i); 6 } 7 } 8 9 // recursion 10 void printN(int N){ 11 if(N){ 12 printN(N-1); 13 printf("%d\n", N); 14 } 15 }
// 當 N=100,000 時,循環能獲得正確的結果,遞歸return非0
*遞歸對空間的佔用是可怕的
*電腦作遞歸的能力 << 遠遠弱於 作循環;相似狀況應該使用循環 而非遞歸
Part-3
例3:寫程序計算給定多項式在給定點x處的值
方法1:依照數學公式計算
方法2:下降運算量版本 -- 更優
1 // a0 + a1*x + a2*x^2 + ... + an*x^n 2 double f1(int n, double a[], double x){ 3 int i; 4 double p=a[0]; 5 for(i=1; i<=n; i++){ 6 p += ( a[i] * pow(x,i) ); 7 } 8 return p; 9 } 10 11 // a0 + x(a1 + x(...(an-1 + x*an)...)) 12 double f2(int n, double a[], double x){ 13 int i; 14 double p=a[n]; 15 for(i=n; i>0; i--){ 16 p += a[i-1] + x*p; 17 } 18 return p; 19 }
* 計算程序運行時間 C語言 - clock() *
# include <time.h>
*注:start & stop 得到的值不是 sec,而是時鐘打點,得到時間(s)則須要除以 CLK_TCK
*注:當被測程序運行過快的時候,可使用循環,重複運行屢次該程序;再用時間除以循環次數。
完整測試代碼:wk1_loop_recursion.c (見本文最後)
完整測試代碼 -- 包括 discuss-1.3:wk1_pow.c (見本文最後)
Part-4 數據結構(定義)
數據對象在計算機中的組織方式 [對象:object]
數據對象一定與一系列加在其上的操做相關聯
完成這些操做所用的方法就是算法
描述數據結構一個很好的方法:抽象數據類型 Abstract Data type
數據類型 【c中獨立處理,c++等使用類進行封裝】
數據對象集 [描述對象,是什麼東西]
數據集合相關聯的操做集 [圖書的擺放和操做]
抽象:描述數據類型的方法不依賴於具體實現
與存放數據的機器無關
與數據存儲的物理結構無關
與實現操做的算法和編程語言均無關
只描述數據對象集和相關操做集「是什麼」,並不涉及「如何作到」的問題。
例4:「矩陣」的抽象數據類型定義
* 矩陣元素a 的類型不肯定,能夠說int,float,...
* ElementType: 對應返回矩陣元素 的類型。
* 抽象不關心矩陣的 存儲方式:二維數組?十字鏈表?
* 抽象也不關心具體的實現方式:編程語言,加法順序等
* 抽象的好處:
1)抽象能夠在宏觀程度上把握程序的總體架構,定義抽象時只關心業務邏輯就夠了,不關心具體實現。【框架】
2)須要使用時才考慮程序實現的具體細節,慢慢地去完善 【具體實現】
1 /* WK1_loop_recursion */ 2 #include <stdio.h> 3 4 void printN(int N); 5 6 int main(){ 7 8 int N; 9 scanf("%d", &N); 10 printN(N); 11 12 return 0; 13 } 14 // 使用時請註釋其中一個 15 // loop 16 void printN(int N){ 17 int i; 18 for(i=1;i<=N;i++){ 19 printf("%d ", i); 20 } 21 } 22 23 // recursion 24 void printN(int N){ 25 if(N){ 26 printN(N-1); 27 printf("%d\n", N); 28 } 29 }
[如下代碼有大量重複片斷沒有優化]
1 /* WK1_pow */ 2 3 #include<stdio.h> 4 #include <time.h> // obtain func run time 5 #include <math.h> 6 7 clock_t start, stop; 8 double duration; 9 #define MAXK 1e6 //被測函數最大重複調用次數 10 #define MAXN 10 //多項式最大項數 11 #define LEN 101 12 double f1(int n, double a[], double x); 13 double f2(int n, double a[], double x); 14 15 int main(){ 16 int i; 17 double a[MAXN]; 18 for(i=0;i<MAXN;i++){ 19 a[i]= (double)i; 20 } 21 22 /* execution time: func f1 */ 23 start = clock(); //start time 24 // test func 25 for(i=0; i<MAXK; i++){ 26 f1(MAXN, a, 1.1); 27 } 28 29 stop = clock(); //stop time 30 duration =((double)(stop-start))/CLK_TCK/MAXK; //*func duration 31 printf("ticks1 = %f\n", (double)(stop-start)); 32 printf("duration1 = %6.2e\n", duration); 33 34 printf("\n"); 35 36 /* execution time: func f2 */ 37 start = clock(); //start time 38 // test func 39 for(i=0; i<MAXK; i++){ 40 f2(MAXN, a, 1.1); 41 } 42 43 stop = clock(); //stop time 44 duration =((double)(stop-start))/CLK_TCK/MAXK; //*func duration 45 printf("ticks2 = %f\n", (double)(stop-start)); 46 printf("duration2 = %6.2e\n", duration); 47 48 //------------------------------------------------------------ 49 /* discuss 1.3 */ 50 double b[LEN]; 51 b[0] = 1.0; 52 for(i=1; i<=LEN; i++){ 53 b[i]=1.0/(double)i; 54 } 55 56 // method 1 57 start = clock(); 58 for(i=0; i<MAXK; i++){ 59 f1(LEN, b, 1.1); 60 } 61 stop=clock(); 62 duration = ((double)(stop-start))/CLK_TCK/MAXK; 63 printf("ticks1 = %f\n", (double)(stop-start)); 64 printf("duration1 = %6.2e\n", duration); 65 66 // method 2 67 start = clock(); 68 for(i=0; i<MAXK; i++){ 69 f2(LEN, b, 1.1); 70 } 71 stop = clock(); 72 duration = ((double)(stop-start))/CLK_TCK/MAXK; 73 printf("ticks2 = %f\n", (double)(stop-start)); 74 printf("duration2 = %6.2e\n", duration); 75 76 return 0; 77 } 78 79 double f1(int n, double a[], double x){ // a0 + a1*x + a2*x^2 + ... + an*x^n 80 int i; 81 double p=a[0]; 82 for(i=1; i<=n; i++){ 83 p += ( a[i] * pow(x,i) ); 84 } 85 return p; 86 } 87 88 double f2(int n, double a[], double x){ // a0 + x(a1 + x(...(an-1 + x*an)...)) 89 int i; 90 double p=a[n]; 91 for(i=n; i>0; i--){ 92 p += a[i-1] + x*p; 93 } 94 return p; 95 }