數據結構 -- wk1 基本概念 (1)

第一講 基本概念 - 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 }
相關文章
相關標籤/搜索