




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1/53,第一章回顧,1、程序設(shè)計和算法、數(shù)據(jù)結(jié)構(gòu)的關(guān)系 2、數(shù)據(jù)結(jié)構(gòu)討論的內(nèi)容 3、數(shù)據(jù)結(jié)構(gòu)的定義 4、抽象數(shù)據(jù)類型的概念 5、算法及其度量,2/53,練習(xí),設(shè) n 為正整數(shù)。試確定下列各程序段中前置以記號 的語句的頻度 i=1; k=0;while ( i=n-1) k += 10 * i; i+;,n-1,3/53,i=1; k=0;do k +=10 * i; i+; while(i=n-1);,n-1,但n=1時特殊,是1次,4/53,x=n; y=0; / n 是不小于1的常數(shù)while (x=(y+1)*(y+1) y+;,5/53,x=91; y=100;while (y0 )
2、 if (x100 ) x -= 10; y- -; else x+;,1100,6/53,數(shù)據(jù)結(jié)構(gòu)部分的起點:,什么是 線性結(jié)構(gòu)?,7/53,第1章 緒論 第2章 線性表 第3章 棧和隊列 第4章 串 第5章 數(shù)組和廣義表 第6章 樹和二叉樹 第7章 圖 第9章 查找 第10、11章 排序 數(shù)據(jù)庫部分,目 錄,8/53,線性結(jié)構(gòu)的定義:,若結(jié)構(gòu)是非空有限集,則有且僅有一個開始結(jié)點和一個終端結(jié)點,并且所有結(jié)點都最多只有一個直接前趨和一個直接后繼。 可表示為:(a1 , a2 , , an),簡言之,線性結(jié)構(gòu)反映結(jié)點間的邏輯關(guān)系是 的。,特點 只有一個首結(jié)點和尾結(jié)點; 特點 除首尾結(jié)點外,其他結(jié)
3、點只有一個直接前驅(qū)和一個直接后繼。,線性結(jié)構(gòu)包括:線性表、堆棧、隊列、字符串、數(shù)組等,其中最典型、最常用的是-,線性表,一對一 (1:1),9/53,第2章 線性表,2.1 線性表的類型定義 2.2 線性表的順序表示和實現(xiàn) 2.3 線性表的鏈式表示和實現(xiàn) 2.4 應(yīng)用舉例,10/53,(a1, a2, ai-1,ai, ai1 ,, an),2.1 線性表的定義:用數(shù)據(jù)元素的有限序列表示,n=0時稱為,數(shù)據(jù)元素,線性起點,ai的直接前趨,ai的直接后繼,下標(biāo),是元素的序號,表示元素在表中的位置,n為元素總個數(shù),即表長。n0,空表,線性終點,11/53,( A, B, C, D, , Z),例2
4、 分析學(xué)生情況登記表是什么結(jié)構(gòu)。,分析:數(shù)據(jù)元素都是同類型(記錄),元素間關(guān)系是線性的。,分析: 數(shù)據(jù)元素都是同類型(字母), 元素間關(guān)系是線性的。,注意:同一線性表中的元素必定具有相同特性 !,例1 分析26 個英文字母組成的英文表是什么結(jié)構(gòu)。,12/53,“同一數(shù)據(jù)邏輯結(jié)構(gòu)中的所有數(shù)據(jù)元素都具有相同的特性”是指數(shù)據(jù)元素所包含的數(shù)據(jù)項的個數(shù)都相等。,是指各元素具有相同的數(shù)據(jù)類型,試判斷下列敘述的正誤:,13/53,線性表的抽象數(shù)據(jù)類型的定義,ADT List 數(shù)據(jù)對象:Dai | ai ElemSet, i=1,2,.,n, n0 數(shù)據(jù)關(guān)系:R1 | ai-1,aiD, i=2,.,n 基本
5、操作: 結(jié)構(gòu)初始化 銷毀結(jié)構(gòu) 引用型操作 加工型操作 ADT List,14/53,線性表的抽象數(shù)據(jù)類型的定義,ADT List 數(shù)據(jù)對象:Dai | ai ElemSet, i=1,2,.,n, n0 數(shù)據(jù)關(guān)系:R1 | ai-1,aiD, i=2,.,n 基本操作:結(jié)構(gòu)初始化InitList( 2依值在線性表 LA 中進行查詢; LocateElem(LA,e,equal( ) 3若不存在,則將它插入到 LA 中。 ListInsert( LA, n+1,e ) 重復(fù)上述三步直至 LB 遍歷止。,20/53,對應(yīng)的線性表基本操作: 1. GetElem(Lb,i,e); 2. Locate
6、Elem( LA, e, equal() ); 3. ListInsert( LA, n+1,e ) void union(List / 銷毀線性表 LB / union,21/53,例2有順序表A和B,其元素均按從小到大的升序排列,編寫一個算法將它們合并成一個順序表C,要求C的元素也按從小到大的升序排列。,基本思路: 依次掃描A和B的元素,比較當(dāng)前元素ai和bj: if(aibj) ai賦給Ck; i+;k+; else bj賦給Ck; j+;k+; 將未完的那個順序表中余下部分賦給C;,22/53,void MergeList(SqList La,SqList Lb,SqList *Lc)
7、 /* 算法2.2 */ /* 已知線性表La和Lb中的數(shù)據(jù)元素按值非遞減排列。 */ /* 歸并La和Lb得到新的線性表Lc,Lc的數(shù)據(jù)元素也按值非遞減排列 */ int i=1,j=1,k=0; InitList(Lc); /* 創(chuàng)建空表Lc */ La_len=ListLength(La); Lb_len=ListLength(Lb); /依次掃描A和B的元素,比較當(dāng)前元素ai和bj: while(i=La_len ,23/53,教材例2-1:求兩個線性表的“并”,即: LA U LB = ?,算法至少有兩種: LA和LB都是無序表,則從LB中取元素逐一與LA中所有元素比較,相同則不插入
8、LA中;O(ListLength(LA)* ListLength(LB) 若LA和LB已經(jīng)是有序表,則“歸并”的時間效率可以大大提高。 O(ListLength(LA)+ ListLength(LB)。,24/53,2.2.1 順序表的表示,用一組地址連續(xù)的存儲單元依次存儲線性表的元素。,把邏輯上相鄰的數(shù)據(jù)元素存儲在物理上相鄰的存儲單元中的存儲結(jié)構(gòu)。,線性表的順序表示又稱為順序存儲結(jié)構(gòu)或順序映像。,順序存儲定義:,順序存儲方法:,特點:,邏輯上相鄰的元素,物理上也相鄰,可以利用數(shù)組Vn來實現(xiàn),注意:在C語言中數(shù)組的下標(biāo)是從0開始,即: Vn的有效范圍是從 V0Vn-1,25/53,1. 邏輯上
9、相鄰的數(shù)據(jù)元素,其物理上也相鄰; 2. 若已知表中首元素在存儲器中的位置,則其他元素存放位置亦可求出(利用數(shù)組Vn的下標(biāo))。,設(shè)首元素a1的存放地址為LOC(a1)(稱為首地址), 設(shè)每個元素占用存儲空間(地址長度)為L字節(jié), 則表中任一數(shù)據(jù)元素的存放地址為: LOC ( ai+1 ) = LOC( ai ) + L LOC ( ai ) = LOC( a1 ) + L *(i -1),對上述公式的解釋如圖所示,線性表順序存儲特點:,26/53,地址 內(nèi)容 元素在表中的位序,1,i,2,n,空閑區(qū),i+1,L,b=LOC(a1),b + L,b +(i-1)L,b +(n-1)L,b +(ma
10、x-1)L,LOC ( ai ) = LOC( a1 ) + L *(i -1),線性表的順序存儲結(jié)構(gòu)示意圖,下標(biāo)起點是1,27/53,設(shè)有一維數(shù)組,下標(biāo)的范圍是到,每個數(shù)組元素用相鄰的個字節(jié)存儲。存儲器按字節(jié)編址,設(shè)存儲數(shù)組元素的第一個字節(jié)的地址是98,則的第一個字節(jié)的地址是多少?,答案:113,但此題要注意下標(biāo)起點是從0開始: LOC( M3 ) = 98 + 5 (4-1) =113,解:已知地址計算通式為:,LOC(ai) = LOC(a1) + L *(i-1),例1,或用(3-0),28/53,char V30; void build() /字母線性表的生成,即建表操作 int i
11、; V0=a; for( i=1; i=n-1; i+ ) Vi=Vi-1+1; ,核心語句: 法1 Vi= Vi-1+1; 法2 Vi=a+i; 法3 Vi=97+i;,例2,用數(shù)組V來存放26個英文字母組成的線性表(a,b,c,z),寫出在順序結(jié)構(gòu)上生成和顯示該表的C語言程序。,省略了include語句,29/53,void main(void) /主函數(shù),字母線性表的生成和輸出 n=26; / n是表長,是數(shù)據(jù)元素的個數(shù),而不是V的實際下標(biāo) build( ); display( ); ,void display( ) /字母線性表的顯示,即讀表操作 int i; for( i=0; i=
12、n-1; i+ ) printf( %c, vi ); printf( n ); ,執(zhí)行結(jié)果: a b c d e f g h i j k l m n o p q r s t u v w x y z,30/53,2.2.2 順序表的實現(xiàn)(或操作),數(shù)據(jù)結(jié)構(gòu)的基本運算: 修改、插入、刪除、查找、排序,1) 修改 通過數(shù)組的下標(biāo)便可訪問某個特定元素并修改之。,核心語句: Vi=x;,顯然,順序表修改操作的時間效率是 O(1),31/53,在線性表的第i個位置前插入一個元素,實現(xiàn)步驟: 將第n至第i 位的元素向后移動一個位置; 將要插入的元素寫到第i個位置; 表長加1。,for (j=n; j=i;
13、 j-) aj+1=a j ; a i =x; n+;,/ 元素后移一個位置,/ 插入x,/ 表長加1,核心語句:,2)插入,注意:事先應(yīng)判斷: 插入位置i 是否合法?表是否已滿? 應(yīng)當(dāng)符合條件: 1in+1 或 i=1, n+1,32/53,在線性表的第i個位置前插入一個元素的示意圖如下:,插入25,33/53,實現(xiàn)步驟: 將第i+1 至第n 位的元素向前移動一個位置; 表長減1。,刪除線性表的第i個位置上的元素,for ( j=i+1; j=n; j+ ) aj-1=aj; n-;,/ 元素前移一個位置,/ 表長減1,核心語句:,3)刪除,注意:事先需要判斷,刪除位置i 是否合法? 應(yīng)當(dāng)符
14、合條件:1in 或 i=1, n,34/53,刪除順序表中某個指定的元素的示意圖如下:,35/53,順序表的運算效率分析,算法時間主要耗費在移動元素的操作上,因此 計算時間復(fù)雜度的基本操作(最深層語句頻度) T(n)= O (移動元素次數(shù)) 而移動元素的個數(shù)取決于插入或刪除元素的位置。,思考:若插入在尾結(jié)點之后,則根本無需移動(特別快); 若插入在首結(jié)點之前,則表中元素全部要后移(特別慢); 應(yīng)當(dāng)考慮在各種位置插入(共n+1種可能)的平均移動次數(shù)才合理。,討論1:若在長度為 n 的線性表的第 i 位前 插入一個元素,則向后移動元素的次數(shù)f(n)為: f(n) =,n i + 1,時間效率分析:
15、,36/53,推導(dǎo):假定在每個元素位置上插入x的可能性都一樣(即概率P相同),則應(yīng)當(dāng)這樣來計算平均執(zhí)行時間: 將所有位置的執(zhí)行時間相加,然后取平均。 若在首結(jié)點前插入,需要移動的元素最多,后移次數(shù)為n; 若在a1后面插入,要后移n-1個元素,后移次數(shù)為n-1; 若在an-1后面插入,后移次數(shù)為1; 若在尾結(jié)點an之后插入,則后移次數(shù)為0;,故插入時的平均移動次數(shù)為:n(n+1)/2(n+1)n/2O(n),共有多少種插入形式?連頭帶尾有n+1種!,所有可能的元素移動次數(shù)合計: 0+1+n = n(n+1)/2,37/53,同理可證:順序表刪除一元素的時間效率為: T(n)=(n-1)/2 O(
16、n),想一想: 順序表插入、刪除算法的平均空間復(fù)雜度為多少?,插入效率:,刪除效率:,教材P25算法2.5也是對執(zhí)行效率的推導(dǎo):,因為沒有占用輔助空間!,含義:對于順序表,插入、刪除操作平均需要移動一半元素( n / 2 ),O(1),即插入、刪除算法的平均時間復(fù)雜度為 O(n),38/53,#define LIST_MAX_LENGTH 100 /線性表的最大長度 typedef int ElemType; typedef struct ElemType *elem; /指向存放線性表中數(shù)據(jù)元素的基地址 int length; /線性表的當(dāng)前長度 SQ_LIST;,39/53,典型操作的算法
17、實現(xiàn),1. 初始化線性表L int InitList(SQ_LIST /成功返回OK / sizeof(x)算符的意思是:計算變量x的長度(字節(jié)數(shù)) malloc(m)函數(shù)的意思是:新開一片大小為m字節(jié)的連續(xù)空間,并把該區(qū)首址作為函數(shù)值。,40/53,2. 銷毀線性表L void DestroyList(SQ_LIST /釋放線性表占據(jù)的所有存儲空間 ,41/53,3. 清空線性表L void ClearList(SQ_LIST /將線性表的長度置為0 ,42/53,4. 求線性表L的長度 int GetLength(SQ_LIST L) return (L.length); ,43/53,5
18、. 判斷線性表L是否為空 int IsEmpty(SQ_LIST L) if (L.length=0) return TRUE; else return FALSE; ,44/53,6. 獲取線性表L中的某個數(shù)據(jù)元素的內(nèi)容 int GetElem(SQ_LIST L,int i, ElemType ,45/53,7. 在線性表L中檢索值為e的數(shù)據(jù)元素 int LocateELem(SQ_LIST L, int(*compare)(ElemType,ElemType) /* 操作結(jié)果:返回L中第1個與e滿足關(guān)系compare()的數(shù)據(jù)元素的位序。若這樣的數(shù)據(jù)元素不存在,則返回值為0。 */ El
19、emType *p; int i=1; /* i的初值為第1個元素的位序 */ p=L.elem; /* p的初值為第1個元素的存儲位置 */ while(i=L.length ,int equal (ElemType a,ElemType b) /* 根據(jù)a 或= b,分別返回0或1 */ if(a=b) return 1; else return 0; ,LocateElem(L,j,equal);,46/53,8. 將線性表L中第i個數(shù)據(jù)元素刪除 int ListDelete(SQ_LIST ,47/53,9. 在線性表L中第i個數(shù)據(jù)元素之前插入數(shù)據(jù)元素e int ListInsert(
20、SQ_LIST ,48/53,進一步討論:,順序表的存儲結(jié)構(gòu)是一維數(shù)組,如果插入的元素個數(shù)超過數(shù)組定義的長度怎么辦? 采用動態(tài)分配的一維數(shù)組,49/53,動態(tài)數(shù)組簡介,先為順序表空間設(shè)定一個初始分配量,一旦因插入元素而空間不足時,可為順序表增加一個約定長度的空間增量。,#define LIST_INIT_SIZE 100 /存儲空間的初始分配量 #define LISTINCREMENT 10/存儲空間的分配增量 Typedef struct ElemType *elem; /表基址(用指針*elem表示) int length; /表長度(表中有多少個元素) int listsize; /當(dāng)
21、前分配的表尺寸(字節(jié)單位) SqList;,注:三個分量可簡寫為:L.elem L.length L.listsize,存儲結(jié)構(gòu)描述如下(見教材P22):,50/53,Status InitList_Sq( SqList /InitList_Sq,動態(tài)創(chuàng)建一個空順序表的算法:,51/53,動態(tài)順序表的插入算法 Status ListInsert_Sq(SqList / 檢驗i 值的合法性,if ( L.length L.listsize ) /若表長超過表尺寸則要增加尺寸 newbase = ( ElemType* ) realloc ( L.elem , (L.listsize + LISTINCREMENT )* sizeof ( Ele
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于閱讀策略的檔案袋評價在高中英語閱讀教學(xué)中的應(yīng)用研究
- 清代宜陽縣聚落地理研究
- 兒科疾病健康教育
- 課堂如何組織管理學(xué)生
- 剪切音樂教案小班健康
- 領(lǐng)土安全課件教學(xué)
- 預(yù)防氣象災(zāi)害班會課件
- 森林防火安全培訓(xùn)
- 項目采購管理課件教學(xué)
- 汽車配套產(chǎn)業(yè)基地項目安全管理方案
- 2025年城建技師考試題庫及答案
- 2025年中國LTCC技術(shù)行業(yè)市場現(xiàn)狀、前景分析研究報告(智研咨詢發(fā)布)
- 租賃住房培訓(xùn)課件下載
- 房管員試題資料
- 2025至2030中國扭蛋機行業(yè)市場發(fā)展現(xiàn)狀及商業(yè)模式與投融資戰(zhàn)略報告
- 2024年蘇州昆山國創(chuàng)投資集團有限公司招聘筆試真題
- 商場吸煙區(qū)管理制度
- 2025年四川省成都市中考地理真題(原卷版)
- 糖尿病足截肢術(shù)后護理
- 廣東省東莞市2022-2023學(xué)年高二下學(xué)期期末物理試題(含答案)
- DL∕T 5161.5-2018 電氣裝置安裝工程質(zhì)量檢驗及評定規(guī)程 第5部分:電纜線路施工質(zhì)量檢驗
評論
0/150
提交評論