第1章緒論(2)_第1頁
第1章緒論(2)_第2頁
第1章緒論(2)_第3頁
第1章緒論(2)_第4頁
第1章緒論(2)_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、11.1 數(shù)據(jù)結(jié)構(gòu)的定位數(shù)據(jù)結(jié)構(gòu)的定位1.2 基本概念基本概念1.3 算法和算法的分析算法和算法的分析21.2 基本概念基本概念一、數(shù)據(jù)與數(shù)據(jù)結(jié)構(gòu)一、數(shù)據(jù)與數(shù)據(jù)結(jié)構(gòu)二、數(shù)據(jù)類型二、數(shù)據(jù)類型三、抽象數(shù)據(jù)類型三、抽象數(shù)據(jù)類型3二、數(shù)據(jù)類型二、數(shù)據(jù)類型 在用高級程序語言編寫的程序中,必須對程序中出現(xiàn)的每個變量、常量或表達式,明確說明明確說明它們所 屬的數(shù)據(jù)類型數(shù)據(jù)類型。 數(shù)據(jù)類型數(shù)據(jù)類型 是一個值的集合值的集合和定義在此集合上的一組操作的總稱一組操作的總稱。4例如,例如,C 語言中提供的基本數(shù)據(jù)類型有語言中提供的基本數(shù)據(jù)類型有: :整型整型 short intshort int,intint,lon

2、g intlong int實型:實型: floatfloat,doubledouble字符型:字符型:charchar 不同類型的變量,其所能取的值的范圍值的范圍不同,所能進行的操作進行的操作不同。5問題問題1 1:是否所有的計算機語言都需要聲明數(shù)據(jù)類型?:是否所有的計算機語言都需要聲明數(shù)據(jù)類型?答:答: 不是,匯編語言不需要聲明數(shù)據(jù)類型。不是,匯編語言不需要聲明數(shù)據(jù)類型。問題問題2 2:在高級語言中,是否需要對每個變量都聲明數(shù):在高級語言中,是否需要對每個變量都聲明數(shù)據(jù)類型?據(jù)類型?答:不是,有些高級語言可以對某些類型的變量不需要聲明答:不是,有些高級語言可以對某些類型的變量不需要聲明。問題

3、問題3 3:為什么在:為什么在javajava,C C,C C等高級語言中要強制等高級語言中要強制聲明變量類型?聲明變量類型?答:答:1 1。避免造成一些不易發(fā)現(xiàn)的邏輯錯誤,。避免造成一些不易發(fā)現(xiàn)的邏輯錯誤,2 2。通過數(shù)據(jù)類型實現(xiàn)信息隱藏,。通過數(shù)據(jù)類型實現(xiàn)信息隱藏,3 3。動態(tài)分配和回收內(nèi)存。動態(tài)分配和回收內(nèi)存。問題問題4: 4: 不同高級語言的數(shù)據(jù)類型定義是否相同?不同高級語言的數(shù)據(jù)類型定義是否相同?答:不同。這就是為什么不同語言編寫的程序不能夠互操作的原答:不同。這就是為什么不同語言編寫的程序不能夠互操作的原因之一。因之一。6三、抽象數(shù)據(jù)類型三、抽象數(shù)據(jù)類型 (Abstract Dat

4、a Type 簡稱簡稱ADT) 是指一個是指一個數(shù)學(xué)模型數(shù)學(xué)模型以及定義在以及定義在此數(shù)學(xué)模型上的一組操作。此數(shù)學(xué)模型上的一組操作。 與具體實現(xiàn)的語言無關(guān)。與具體實現(xiàn)的語言無關(guān)。7例如例如: :“整數(shù)整數(shù)”是一個抽象數(shù)據(jù)類型。是一個抽象數(shù)據(jù)類型。其其數(shù)學(xué)特性和具體的計算機或語言無關(guān)。數(shù)學(xué)特性和具體的計算機或語言無關(guān)。 C C語言的整型語言的整型“intint”只實現(xiàn)了一個只實現(xiàn)了一個從從3276832768到到3276732767之間的整數(shù)的集合。之間的整數(shù)的集合。8抽象數(shù)據(jù)類型的描述方法抽象數(shù)據(jù)類型的描述方法抽象數(shù)據(jù)類型可用(D,S,P)三元組表示其中,D 是數(shù)據(jù)對象集, S 是 D 上的關(guān)

5、系集, P 是對 D 的基本操作集。 9ADT 抽象數(shù)據(jù)類型名抽象數(shù)據(jù)類型名 數(shù)據(jù)對象:數(shù)據(jù)對象:數(shù)據(jù)對象的定義 數(shù)據(jù)關(guān)系:數(shù)據(jù)關(guān)系:數(shù)據(jù)關(guān)系的定義 基本操作:基本操作:基本操作的定義 ADT 抽象數(shù)據(jù)類型名其中基本操作的定義格式為:基本操作名基本操作名(參數(shù)表) 初始條件:初始條件:初始條件描述 操作結(jié)果操作結(jié)果:操作結(jié)果描述 10類類C C語言語言 精選了精選了C C語言的一個核心子集,同時作了語言的一個核心子集,同時作了若干擴充修改,增強了語言的描述功能。以若干擴充修改,增強了語言的描述功能。以下作簡要說明。下作簡要說明。(1 1)預(yù)定義常量和類型:)預(yù)定義常量和類型:# #define

6、 TRUE 1define TRUE 1#define FALSE 0#define FALSE 0#define OK 1#define OK 1#define ERROR 0#define ERROR 0#define INFEASIBLE 1#define INFEASIBLE 1#define OVERFLOW -2#define OVERFLOW -2typedef int typedef int Status; Status; 11(2 2)數(shù)據(jù)結(jié)構(gòu)的表示(存儲結(jié)構(gòu))用類型)數(shù)據(jù)結(jié)構(gòu)的表示(存儲結(jié)構(gòu))用類型定義(定義(typedeftypedef)描述,數(shù)據(jù)元素的類型約)描述,數(shù)據(jù)

7、元素的類型約定為定為ElemTypeElemType,由用戶在使用該類型時自行,由用戶在使用該類型時自行定義。定義。(3 3)基本操作的算法都用以下形式的函數(shù))基本操作的算法都用以下形式的函數(shù)描述:描述:函數(shù)類型函數(shù)類型 函數(shù)名(函數(shù)參數(shù)表)函數(shù)名(函數(shù)參數(shù)表) /算法說明算法說明語句序列語句序列/函數(shù)名函數(shù)名 12算法中使用的輔助變量可以不做變量說明。算法中使用的輔助變量可以不做變量說明。一般而言,一般而言,a,b,c,d,ea,b,c,d,e等用作數(shù)據(jù)元素名,等用作數(shù)據(jù)元素名,i,j,k,l,m,ni,j,k,l,m,n等用作整型變量名等用作整型變量名,p,q,r,p,q,r等用作等用作指

8、針變量名。函數(shù)定義為指針變量名。函數(shù)定義為Status Status 類型。為了類型。為了便于算法描述,函數(shù)的參數(shù)除了值傳遞方式便于算法描述,函數(shù)的參數(shù)除了值傳遞方式外,增添了外,增添了c+c+語言的引用調(diào)用的參數(shù)傳遞方語言的引用調(diào)用的參數(shù)傳遞方式。在形參表中,以式。在形參表中,以& &打頭的參數(shù)即為引用參打頭的參數(shù)即為引用參數(shù)。數(shù)。13函數(shù)調(diào)用時的參數(shù)傳遞函數(shù)調(diào)用時的參數(shù)傳遞值傳遞值傳遞把實參的值傳給被調(diào)用函數(shù)的副本中。被把實參的值傳給被調(diào)用函數(shù)的副本中。被調(diào)用函數(shù)修改的是副本的值,實參不變。調(diào)用函數(shù)修改的是副本的值,實參不變。引用傳遞引用傳遞 & :& :

9、被傳遞的不是實參的值,而是實參的地址。被傳遞的不是實參的值,而是實參的地址。被調(diào)用函數(shù)通過地址存取被引用的實參,函數(shù)執(zhí)被調(diào)用函數(shù)通過地址存取被引用的實參,函數(shù)執(zhí)行后實參的值將發(fā)生改變。行后實參的值將發(fā)生改變。 int int a=1;b=2; a=1;b=2; swap(a,b); swap(a,b); void swap(int &i,int void swap(int &i,int &j) &j) int int t=j; t=j; j=i; j=i; i=t; i=t; Assign( &Z, v1, v2 )14(4 4)賦值語句)賦值語句簡單賦

10、值簡單賦值 變量名變量名= =表達式表達式串聯(lián)賦值串聯(lián)賦值 變量名變量名1=1=變量名變量名2=2= =表達式表達式成組賦值成組賦值 (變量名(變量名1 1,變量名,變量名2.2.)= =(表達式(表達式1 1,表達,表達式式2 2)結(jié)構(gòu)名結(jié)構(gòu)名= =結(jié)構(gòu)名結(jié)構(gòu)名結(jié)構(gòu)名結(jié)構(gòu)名=值值1 1,值,值2 2.數(shù)組名數(shù)組名=表達式表達式數(shù)組名數(shù)組名 起始下標(biāo),終止下標(biāo)起始下標(biāo),終止下標(biāo)=數(shù)組名數(shù)組名 起始下標(biāo),終起始下標(biāo),終止下標(biāo)止下標(biāo) 交換賦值交換賦值 變量名變量名 - - 變量名變量名條件賦值條件賦值 變量名變量名= =條件表達式?表達式條件表達式?表達式T T:表達式:表達式F F15(5 5)

11、選擇語句)選擇語句條件語句條件語句1 if 1 if 語句語句條件語句條件語句2 if else 2 if else 語句語句開關(guān)語句開關(guān)語句1 switch(1 switch(表達式表達式)case )case 值值1 :1 :開關(guān)語句開關(guān)語句2 2 switcheswitchecase case 條件條件1 1: (6 6)循環(huán)語句)循環(huán)語句for for 語句語句while while 語句語句do while do while 語句語句 16(7 7)結(jié)束語句)結(jié)束語句函數(shù)結(jié)束語句函數(shù)結(jié)束語句 return return case case 結(jié)束語句結(jié)束語句 breakbreak異常結(jié)

12、束語句異常結(jié)束語句 exit(exit(異常代碼異常代碼) )(8 8)輸入輸出語句)輸入輸出語句輸入語句輸入語句 scanfscanf(a,b,c)(a,b,c)輸出語句輸出語句 printfprintf(a,b,c)(a,b,c)(9 9)注釋)注釋 / 17(1010)基本函數(shù))基本函數(shù)求最大值求最大值 max()max()求最小值求最小值 min()min()求絕對值求絕對值 abs()abs()向下取整向下取整 floor()floor()向上取整向上取整 ceil()ceil()判定文件結(jié)束判定文件結(jié)束 eofeof()()判定行結(jié)束判定行結(jié)束eolneoln()()(1111)邏

13、輯運算約定)邏輯運算約定18例如,例如,定義抽象數(shù)據(jù)類型“復(fù)數(shù)復(fù)數(shù)” 數(shù)據(jù)對象:數(shù)據(jù)對象: De1,e2e1,e2RealSet 數(shù)據(jù)關(guān)系:數(shù)據(jù)關(guān)系: R1 | e1是復(fù)數(shù)的實數(shù)部分, | e2 是復(fù)數(shù)的虛數(shù)部分 ADT Complex 19基本操作:基本操作: AssignComplex( &Z, v1, v2 ) 初始條件:初始條件:&Z為非空。 操作結(jié)果:構(gòu)造復(fù)數(shù) Z,其實部和虛部 分別被賦以參數(shù) v1 和 v2 的值。 DestroyComplex( &Z) 初始條件:初始條件:復(fù)數(shù)Z存在。 操作結(jié)果:復(fù)數(shù)Z被銷毀。 GetReal( Z, &realP

14、art ) 初始條件:復(fù)數(shù)已存在。 操作結(jié)果:用realPart返回復(fù)數(shù)Z的實部值。20 GetImag( Z, &ImagPart )初始條件:復(fù)數(shù)已存在。操作結(jié)果:用ImagPart返回復(fù)數(shù)Z的虛部值。 Add( z1,z2, &sum )初始條件:z1, z2是復(fù)數(shù)。操作結(jié)果:用sum返回兩個復(fù)數(shù)z1, z2 的 和值。 ADT Complex211.3 1.3 算法和算法的分析算法和算法的分析一、算法一、算法二、算法設(shè)計的原則二、算法設(shè)計的原則三、算法效率的度量方法和準(zhǔn)則三、算法效率的度量方法和準(zhǔn)則四、算法的存儲空間需求四、算法的存儲空間需求22 算法算法是為了解決某類

15、問題而規(guī)定的一個有限長的操作序列操作序列。一個算法必須滿足以下五五個重要特性特性:1 1有窮性有窮性 2 2確定性確定性 3 3可行性可行性4 4有輸入有輸入 5 5有輸出有輸出一、算法一、算法231 1有窮性有窮性 對于任意一組合法輸入值,在執(zhí)行有窮步驟有窮步驟之后一定能結(jié)束,即:算法中的每個步驟都能在有限時間有限時間內(nèi)完成; 2 2確定性確定性 對于每種情況每種情況下所應(yīng)執(zhí)行的操作,在算法中都有確切確切的規(guī)定,使算法的執(zhí)行者或閱讀者都能明確其含義及如何執(zhí)行。并且并且在任何條件下,算法都只有一在任何條件下,算法都只有一條執(zhí)行路徑;條執(zhí)行路徑;243 3可行性可行性 算法中的所有操作都必須足夠

16、基本,都可以通過已經(jīng)實現(xiàn)的基本操作運算有限次實現(xiàn)之;4 4有輸入有輸入 作為算法加工對象的量值,通常體現(xiàn)為算法中的一組變量。有些輸入量需要在算法執(zhí)行過程中輸入,而有的算法表面上可以沒有輸入,實際上已被嵌入算法之中;25 5 5有輸出有輸出 它是一組與“輸入”與確定關(guān)系的量值,是算法進行信息加工后得到的結(jié)果,這種確定關(guān)系即為算法的功能。26二、算法設(shè)計的原則二、算法設(shè)計的原則設(shè)計算法時,通常應(yīng)考慮達到以下目標(biāo):1正確性正確性2. . 可讀性可讀性3健壯性健壯性4高效率與低存儲量需求高效率與低存儲量需求271 1正確性正確性 首先,首先,算法應(yīng)當(dāng)滿足滿足以特定的“規(guī)格規(guī)格說明說明”方式給出的需求需

17、求。 其次,其次,對算法是否“正確正確”的的理解可以有以下四個層次四個層次:a a程序中不含語法錯誤;b b程序?qū)τ趲捉M輸入數(shù)據(jù)能夠得出滿足要求的結(jié)果;28 c c程序?qū)τ诰倪x擇的、典型、苛刻且程序?qū)τ诰倪x擇的、典型、苛刻且?guī)в械箅y性的幾組輸入數(shù)據(jù)能夠得出滿足帶有刁難性的幾組輸入數(shù)據(jù)能夠得出滿足要求的結(jié)果;要求的結(jié)果;通常以第 c c 層意義的正確性作為衡量一個算法是否合格的標(biāo)準(zhǔn)。 d d程序?qū)τ谝磺泻戏ǖ妮斎霐?shù)據(jù)都能得出滿足要求的結(jié)果;292. . 可讀性可讀性 算法主要是為了人的閱讀與交流閱讀與交流,其次才是為計算機執(zhí)行。因此算法應(yīng)該易易于于人的理解理解;另一方面,晦澀難讀的程序易于隱

18、藏較多錯誤而難以調(diào)試;303健壯性健壯性 當(dāng)輸入的數(shù)據(jù)非法非法時,算法應(yīng)當(dāng)恰當(dāng)?shù)刈鞒龇从郴蜻M行相應(yīng)處理進行相應(yīng)處理,而不是產(chǎn)生莫名奇妙的輸出結(jié)果。并且,處理出處理出錯的方法錯的方法不應(yīng)是中斷程序的執(zhí)行,而應(yīng)是返回返回一個表示錯誤或錯誤性質(zhì)的值表示錯誤或錯誤性質(zhì)的值,以便在更高的抽象層次上進行處理。314高效率與低存儲量需求高效率與低存儲量需求 通常,效率指的是通常,效率指的是算法執(zhí)行時算法執(zhí)行時間間;存儲量指的是算法執(zhí)行過程;存儲量指的是算法執(zhí)行過程中中所需的最大存儲空間所需的最大存儲空間。兩者都。兩者都與問題的規(guī)模有關(guān)。在有些情況與問題的規(guī)模有關(guān)。在有些情況下,兩者相互矛盾下,兩者相互矛盾3

19、2三三、算法效率的、算法效率的 度量方法和準(zhǔn)則度量方法和準(zhǔn)則通常有兩種兩種衡量算法效率的方法: 事后統(tǒng)計法事后統(tǒng)計法事前分析估算法事前分析估算法缺點:缺點:1。必須執(zhí)行程序 2。其它因素掩蓋算法本質(zhì)33算法執(zhí)行時間時間相關(guān)的因素因素:1 1算法算法選用的策略的策略2 2問題的規(guī)模問題的規(guī)模3 3編寫程序的語言語言4 4編譯編譯程序產(chǎn)生的機器代碼的質(zhì)量的質(zhì)量5 5計算機計算機執(zhí)行指令的速度的速度34算法(程序)算法(程序)= = 控制結(jié)構(gòu)控制結(jié)構(gòu) + + 原操作原操作 (固有數(shù)據(jù)類型的操作)算法的執(zhí)行時間算法的執(zhí)行時間 =原操作原操作(i)(i)的的執(zhí)行次數(shù)執(zhí)行次數(shù)原操作原操作(i)(i)的執(zhí)行

20、時間的執(zhí)行時間 算法的執(zhí)行時間算法的執(zhí)行時間 與與 原操作執(zhí)行次數(shù)之和原操作執(zhí)行次數(shù)之和 成正比成正比 算法的執(zhí)行時間分析:算法的執(zhí)行時間分析:35例例一一兩兩個個矩矩陣陣相相乘乘void mult(int a, int b, int& c ) / 以二維數(shù)組存儲矩陣元素,c 為 a 和 b 的乘積 for (i=1; i=n; +i) for (j=1; j=n; +j) ci,j = 0; for (k=1; k=n; +k) ci,j += ai,k*bk,j; /for /mult原操作執(zhí)行次數(shù)之和:原操作執(zhí)行次數(shù)之和: 2 2n3 3n2 2n1 n+1n(n+1)n2 n2

21、 (n+1)n3 36n算法中所有語句的次數(shù)(頻度)之和是算法中所有語句的次數(shù)(頻度)之和是矩陣階矩陣階數(shù)數(shù)n n的函數(shù)的函數(shù) f(n) =f(n) = 2n2n3 3 + 3n + 3n2 2 + 2n +1 + 2n +1n一般地,稱一般地,稱n n是問題的規(guī)模。執(zhí)行次數(shù)是問題的規(guī)模。執(zhí)行次數(shù)f(n)f(n)是是關(guān)于關(guān)于n n的多項式函數(shù)的多項式函數(shù),f(n),f(n)與執(zhí)行時間成正比。與執(zhí)行時間成正比。n當(dāng)當(dāng)n n趨于無窮大時,把執(zhí)行次數(shù)函數(shù)趨于無窮大時,把執(zhí)行次數(shù)函數(shù)f(n)f(n)的數(shù)的數(shù)量級(階)稱為算法的漸進時間復(fù)雜度量級(階)稱為算法的漸進時間復(fù)雜度 T(n) = O(f(n) -T(n) = O(f(n) -大大O O表示表示漸進漸進T(n) = O(nT(n) = O(n3 3) ) 隨著問題規(guī)模隨著問題規(guī)模 n n 的增長,算法執(zhí)行時間的的增長,算法執(zhí)行時間的增長率增長率和和 f(n) f(n) 的的增長率增長率相同,相同,37 void select_sort(int& a , int n) / 將將 a 中整數(shù)序列重新排列成自小至大有序的整數(shù)序列中整數(shù)序列重新排列成自小至大有序的整數(shù)序列。 / select_sortfor ( i = 0; i n; +i ) if ( j != i ) aj ai例例二二選選擇擇排排序序時間復(fù)雜度:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論