




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第1章 概論 習(xí)題參考答案一、基礎(chǔ)知識(shí)題1. 簡(jiǎn)述下列概念數(shù)據(jù),數(shù)據(jù)元素,數(shù)據(jù)類型,數(shù)據(jù)結(jié)構(gòu),邏輯結(jié)構(gòu),存儲(chǔ)結(jié)構(gòu),算法。【解答】數(shù)據(jù)是信息的載體,是描述客觀事物的數(shù)、字符,以及所有能輸入到計(jì)算機(jī)中并被計(jì)算機(jī)程序識(shí)別和處理的符號(hào)的集合。數(shù)據(jù)元素是數(shù)據(jù)的基本單位。在不同的條件下,數(shù)據(jù)元素又可稱為元素、結(jié)點(diǎn)、頂點(diǎn)、記錄等。數(shù)據(jù)類型是對(duì)數(shù)據(jù)的取值范圍、數(shù)據(jù)元素之間的結(jié)構(gòu)以及允許施加操作的一種總體描述。每一種計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言都定義有自己的數(shù)據(jù)類型?!皵?shù)據(jù)結(jié)構(gòu)”這一術(shù)語(yǔ)有兩種含義,一是作為一門(mén)課程的名稱;二是作為一個(gè)科學(xué)的概念。作為科學(xué)概念,目前尚無(wú)公認(rèn)定
2、義,一般認(rèn)為,討論數(shù)據(jù)結(jié)構(gòu)要包括三個(gè)方面,一是數(shù)據(jù)的邏輯結(jié)構(gòu),二是數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu),三是對(duì)數(shù)據(jù)進(jìn)行的操作(運(yùn)算)。而數(shù)據(jù)類型是值的集合和操作的集合,可以看作是已實(shí)現(xiàn)了的數(shù)據(jù)結(jié)構(gòu),后者是前者的一種簡(jiǎn)化情況。數(shù)據(jù)的邏輯結(jié)構(gòu)反映數(shù)據(jù)元素之間的邏輯關(guān)系(即數(shù)據(jù)元素之間的關(guān)聯(lián)方式或“鄰接關(guān)系”),數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)中的表示,包括數(shù)據(jù)元素的表示及其關(guān)系的表示。數(shù)據(jù)的運(yùn)算是對(duì)數(shù)據(jù)定義的一組操作,運(yùn)算是定義在邏輯結(jié)構(gòu)上的,和存儲(chǔ)結(jié)構(gòu)無(wú)關(guān),而運(yùn)算的實(shí)現(xiàn)則依賴于存儲(chǔ)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)中的表示稱為物理結(jié)構(gòu),又稱存儲(chǔ)結(jié)構(gòu)。是邏輯結(jié)構(gòu)在存儲(chǔ)器中的映像,包括數(shù)據(jù)元素的表示和關(guān)系的表示。邏輯結(jié)構(gòu)與計(jì)算機(jī)無(wú)關(guān)
3、。算法是對(duì)特定問(wèn)題求解步驟的一種描述,是指令的有限序列。其中每一條指令表示一個(gè)或多個(gè)操作。一個(gè)算法應(yīng)該具有下列特性:有窮性、確定性、可行性、輸入和輸出。2. 數(shù)據(jù)的邏輯結(jié)構(gòu)分哪幾種,為什么說(shuō)邏輯結(jié)構(gòu)是數(shù)據(jù)組織的主要方面?【解答】數(shù)據(jù)的邏輯結(jié)構(gòu)分為線性結(jié)構(gòu)和非線性結(jié)構(gòu)。(也可以分為集合、線性結(jié)構(gòu)、樹(shù)形結(jié)構(gòu)和圖形即網(wǎng)狀結(jié)構(gòu))。邏輯結(jié)構(gòu)是數(shù)據(jù)組織的某種“本質(zhì)性”的東西:(1)邏輯結(jié)構(gòu)與數(shù)據(jù)元素本身的形式、內(nèi)容無(wú)關(guān)。(2)邏輯結(jié)構(gòu)與數(shù)據(jù)元素的相對(duì)位置無(wú)關(guān)。(3)邏輯結(jié)構(gòu)與所含數(shù)據(jù)元素的個(gè)數(shù)無(wú)關(guān)。3.
4、0; 試舉一個(gè)數(shù)據(jù)結(jié)構(gòu)的例子,敘述其邏輯結(jié)構(gòu)、存儲(chǔ)結(jié)構(gòu)、運(yùn)算三方面的內(nèi)容?!窘獯稹咳鐚W(xué)生成績(jī)表,邏輯結(jié)構(gòu)是線性結(jié)構(gòu),可以順序存儲(chǔ)(也可以鏈?zhǔn)酱鎯?chǔ)),運(yùn)算可以有插入、刪除、查詢、等等。4. 簡(jiǎn)述算法的五個(gè)特性,對(duì)算法設(shè)計(jì)的要求?!窘獯稹克惴ǖ奈鍌€(gè)特性是:有窮性、確定性、可行性、零至多個(gè)輸入和一至多個(gè)輸出。對(duì)算法設(shè)計(jì)的要求:正確性,易讀性,健壯性,和高的時(shí)空間效率(運(yùn)算速度快,存儲(chǔ)空間?。?。5. 設(shè)n是正整數(shù),求下列程序段中帶記號(hào)的語(yǔ)句的執(zhí)行次數(shù)。(1)i=1;k=0; (2) i=1;j=0; while(i<n) while(i
5、+j<=n) k=k+50*i; i+; if(i>j)j+; else i+; (3)x=y=0; (4)x=91;y=100; for(i=0;i<n;i+) while(y>0) for(j=0;j<n;j+) if(x>100) x+; x=x-10; y-; for(k=0;k<n;k+) y+; else x+; 【解答】(1)n-1 (2)n為偶數(shù)時(shí),均為n div 2;你為奇數(shù)時(shí),分別為:(n div 2)+1 和n div 2(3)n+1, n(n+1), n2,(n+1)n2, n3 (4)100, 10006. 有實(shí)現(xiàn)同一功能的兩
6、個(gè)算法A1和A2,其中A1的時(shí)間復(fù)雜度為T(mén)l=O(2n),A2的時(shí)間復(fù)雜度為T(mén)2=O(n2),僅就時(shí)間復(fù)雜度而言,請(qǐng)具體分析這兩個(gè)算法哪一個(gè)好?【解答】對(duì)算法A1和A2的時(shí)間復(fù)雜度T1和T2取對(duì)數(shù),得nlog2和2logn。顯然,當(dāng)n<4時(shí),算法A1好于A2;當(dāng)n=4時(shí),兩個(gè)算法時(shí)間復(fù)雜度相同;當(dāng)n>4時(shí),算法A2好于A1。7. 選擇題:算法分析的目的是( )A、找出數(shù)據(jù)結(jié)構(gòu)的合理性 B、研究算法中的輸入和輸出的關(guān)系C、分析算法的效率以求改進(jìn) D、分析算法的易懂性和文檔特點(diǎn)【解答】C二、算法設(shè)計(jì)題8. 已知輸入x,y,z三個(gè)不相等的整數(shù),設(shè)計(jì)一個(gè)“高效”算法,使得這三個(gè)數(shù)按從小到大
7、輸出?!案咝А钡暮x是用最少的元素比較次數(shù)、元素移動(dòng)次數(shù)和輸出次數(shù)。void Best() /按序輸出三個(gè)整數(shù)的優(yōu)化算法int a,b,c,t;scanf(“%d%d%d”,&a,&b,&c);if(a>b)t=a; a=b; b=t: /a和b已正序if(b>c)t=c; c=b; /c已到位if(a>t) b=a; a=t; /a和b已正序else b=t;/ifprintf(“%d,%d,%dn”,a,b,c);/最佳2次比較,無(wú)移動(dòng);最差3次比較,7個(gè)賦值9 在數(shù)組An中查找值為k的元素,若找到則輸出其位置i(1in),否則輸出0作為標(biāo)志。設(shè)計(jì)
8、算法求解此問(wèn)題,并分析在最壞情況下的時(shí)間復(fù)雜度【題目分析】 從后向前查找,若找到與k值相同的元素則返回其位置,否則返回0。int Search(ElemType An+1, ElemType k)i=n;wile(i>=1)&&(Ai!=k) i-;if(i>=1) return i;else return 0;當(dāng)查找不成功時(shí),總的比較次數(shù)為n+1次,所以最壞情況下時(shí)間復(fù)雜度為O(n)。第2章 線性表 習(xí)題參考答案一、基礎(chǔ)知識(shí)題2.1 試述頭指針、頭結(jié)點(diǎn)、元素結(jié)點(diǎn)、首元結(jié)點(diǎn)的區(qū)別,說(shuō)明頭指針和頭結(jié)點(diǎn)的作【解答】指向鏈表第一個(gè)結(jié)點(diǎn)(或?yàn)轭^結(jié)點(diǎn)或?yàn)槭自Y(jié)點(diǎn))的指針?lè)Q為頭
9、指針?!邦^指針”具有標(biāo)識(shí)一個(gè)鏈表的作用,所以經(jīng)常用頭指針代表鏈表的名字,如鏈表L既是指鏈表的名字是L,也是指鏈表的第一個(gè)結(jié)點(diǎn)的地址存儲(chǔ)在指針變量L中,頭指針為“NULL”則表示一個(gè)空表。有時(shí),我們?cè)谡麄€(gè)線性鏈表的第一個(gè)元素結(jié)點(diǎn)之前加入一個(gè)結(jié)點(diǎn),稱為頭結(jié)點(diǎn),它的數(shù)據(jù)域可以不存儲(chǔ)任何信息(也可以做監(jiān)視哨或存放線性表的長(zhǎng)度等附加信息),指針域中存放的是第一個(gè)數(shù)據(jù)結(jié)點(diǎn)的地址,空表時(shí)為空。 “頭結(jié)點(diǎn)”的加入,使插入和刪除等操作方便統(tǒng)一。元素結(jié)點(diǎn)即是數(shù)據(jù)結(jié)點(diǎn),至少包括元素自身信息和其后繼元素的地址兩個(gè)域。首元結(jié)點(diǎn)是指鏈表中第一個(gè)數(shù)據(jù)元素的結(jié)點(diǎn);為了操作方便,通常在鏈表的首元結(jié)點(diǎn)之前附設(shè)一個(gè)結(jié)點(diǎn),稱為頭結(jié)點(diǎn)
10、。2.2分析順序存儲(chǔ)結(jié)構(gòu)和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的優(yōu)缺點(diǎn),說(shuō)明何時(shí)應(yīng)該利用何種結(jié)構(gòu)?!窘獯稹繌目臻g上來(lái)看,當(dāng)線性表的長(zhǎng)度變化較大,難以估計(jì)其規(guī)模時(shí),選用動(dòng)態(tài)的鏈表作為存儲(chǔ)結(jié)構(gòu)比較合適,但鏈表除了需要設(shè)置數(shù)據(jù)域外,還要額外設(shè)置指針域,因此當(dāng)線性表長(zhǎng)度變化不大,易于事先確定規(guī)模時(shí),為了節(jié)約存儲(chǔ)空間,宜采用順序存儲(chǔ)結(jié)構(gòu)。從時(shí)間上看,順序表具有按元素序號(hào)隨機(jī)訪問(wèn)的特點(diǎn),在順序表中按序號(hào)訪問(wèn)數(shù)據(jù)元素的時(shí)間復(fù)雜度為O(1);而鏈表中按序號(hào)訪問(wèn)的時(shí)間復(fù)雜度為O(n)。所以如果經(jīng)常按序號(hào)訪問(wèn)數(shù)據(jù)元素,使用順序表優(yōu)于鏈表。在順序表中做插入刪除操作時(shí),平均移動(dòng)大約表中一半的元素,因此n較大時(shí)順序表的插入和刪除效率低。在鏈表
11、中作插入、刪除,雖然也要找插入位置,但操作主要是比較操作。從這個(gè)角度考慮顯然鏈表優(yōu)于順序表??傊瑑煞N存儲(chǔ)結(jié)構(gòu)各有長(zhǎng)短,選擇那一種存儲(chǔ)結(jié)構(gòu),由實(shí)際問(wèn)題中的主要因素決定。2.3 分析在順序存儲(chǔ)結(jié)構(gòu)下插入和刪除結(jié)點(diǎn)時(shí)平均需要移動(dòng)多少個(gè)結(jié)點(diǎn)?!窘獯稹科骄苿?dòng)表中大約一半的結(jié)點(diǎn),插入操作平均移動(dòng) 個(gè)結(jié)點(diǎn),刪除操作平均移動(dòng) 個(gè)結(jié)點(diǎn)。具體移動(dòng)的次數(shù)取決于表長(zhǎng)和插入、刪除的結(jié)點(diǎn)的位置。2.4 為什么在單循環(huán)鏈表中常使用尾指針,若只設(shè)頭指針,插入元素的時(shí)間復(fù)雜度如何?【解答】單循環(huán)鏈表中無(wú)論設(shè)置尾指針還是頭指針都可以遍歷表中任一個(gè)結(jié)點(diǎn)。設(shè)置尾指針時(shí),若在表尾進(jìn)行插入元素或刪除第一元素,操作可在O(1)時(shí)間內(nèi)完
12、成;若只設(shè)置頭指針,表尾進(jìn)行插入或刪除操作,需要遍歷整個(gè)鏈表,時(shí)間復(fù)雜度為O(n)。2.5 在單鏈表、雙鏈表、單循環(huán)鏈表中,若知道指針p指向某結(jié)點(diǎn),能否刪除該結(jié)點(diǎn),時(shí)間復(fù)雜度如何?【解答:】以上三種鏈表中,若知道指針p指向某結(jié)點(diǎn),都能刪除該結(jié)點(diǎn)。雙鏈表刪除p所指向的結(jié)點(diǎn)的時(shí)間復(fù)雜度為O(1),而單鏈表和單循環(huán)鏈表上刪除p所指向的結(jié)點(diǎn)的時(shí)間復(fù)雜度均為O(n)。2.6 下面算法的功能是什么?LinkedList Unknown(LinkedList la) LNode *q,*p; if(la && la->next) q=la; la=la->next; p=la;
13、while(p->next) p=p->next; p->next=q; q->next=null; return la; 【解答】將首元結(jié)點(diǎn)刪除并插入到表尾(設(shè)鏈表長(zhǎng)度大于1)。2.7 選擇題:在循環(huán)雙鏈表的*p結(jié)點(diǎn)之后插入*s結(jié)點(diǎn)的操作是( )la、p->next=s; s->prior=p; p->next->prior=s; s->next=p->next;B、p->next=s; p->next->prior=s; s->prior=p; s->next=p->next;lc、s->
14、prior=p; s->next=p->next; p->next:=s; p->next->prior=s; D、s->prior=p; s>next=p>next; p>next->prior =s; p->next=s; 【解答】D2.8 選擇題:若某線性表最常用的操作是存取任一指定序號(hào)的元素和在最后進(jìn)行插入和刪除運(yùn)算,則利用( )存儲(chǔ)方式最節(jié)省時(shí)間。la順序表 B雙鏈表 lc帶頭結(jié)點(diǎn)的雙循環(huán)鏈表 D單循環(huán)鏈表【解答】la二、算法設(shè)計(jì)題2.9 設(shè)ha和hb分別是兩個(gè)帶頭結(jié)點(diǎn)的非遞減有序單鏈表的頭指針,試設(shè)計(jì)算法, 將這兩個(gè)
15、有序鏈表合并成一個(gè)非遞增有序的單鏈表。要求使用原鏈表空間,表中無(wú)重復(fù)數(shù)據(jù)。【題目分析】因?yàn)閮涉湵硪寻丛刂捣沁f減次序排列,將其合并時(shí),均從第一個(gè)結(jié)點(diǎn)起進(jìn)行比較,將小的鏈入鏈表中,同時(shí)后移鏈表工作指針,若遇值相同的元素,則刪除之。該問(wèn)題要求結(jié)果鏈表按元素值非遞增次序排列,故在合并的同時(shí),將鏈表結(jié)點(diǎn)逆置。LinkedList Union(LinkedList ha,hb) ha,hb分別是帶頭結(jié)點(diǎn)的兩個(gè)單鏈表的頭指針,鏈表中的元素值按遞增序排列本算法將兩鏈表合并成一個(gè)按元素值遞減次序排列的單鏈表,并刪除重復(fù)元素 pa=ha->next; pa是鏈表ha的工作指針pb=hb->next;
16、 pb是鏈表hb的工作指針 ha->next=null; ha作結(jié)果鏈表的頭指針,先將結(jié)果鏈表初始化為空 while(pa!=null && pb!=null) 當(dāng)兩鏈表均不為空時(shí)作 while(pa->next && pa->data=pa->next->data) u=pa->next; pa->next=u->next; free(u)刪除pa鏈表中的重復(fù)元素while(pb->next && pb->data=pb->next->data) u=pb->next
17、; pb->next=u->next; free(u)刪除pb鏈表中的重復(fù)元素 if(pa->data<pb->data) r=pa->next; 將pa 的后繼結(jié)點(diǎn)暫存于r pa->next=ha->next; 將pa結(jié)點(diǎn)鏈于結(jié)果表中,同時(shí)逆置ha->next=pa;pa=r; 恢復(fù)pa為當(dāng)前待比較結(jié)點(diǎn) else if(pb->data<pa->data)r=pb->next; 將pb 的后繼結(jié)點(diǎn)暫存于rpb->next=ha->next; 將pb結(jié)點(diǎn)鏈于結(jié)果表中,同時(shí)逆置ha->next=pb;
18、pb=r; 恢復(fù)pb為當(dāng)前待比較結(jié)點(diǎn) elseu=pb;pb=pb->next;free(u)刪除鏈表pb和pa中的重復(fù)元素 / while(pa!=null && pb!=null) if(pa) pb=pa; 避免再對(duì)pa寫(xiě)下面的while語(yǔ)句 while(pb!=null) 將尚未到尾的表逆置到結(jié)果表中 r=pb->next; pb->next=ha->next; ha->next=pb; pb=r; return ha 算法Union結(jié)束2.11 設(shè)p指向頭指針為la的單鏈表中某結(jié)點(diǎn),試編寫(xiě)算
19、法,刪除結(jié)點(diǎn)*p的直接前驅(qū)結(jié)點(diǎn)?!绢}目分析】設(shè)*p是單鏈表中某結(jié)點(diǎn),刪除結(jié)點(diǎn)*p的直接前驅(qū)結(jié)點(diǎn),要找到*p的前驅(qū)結(jié)點(diǎn)的前驅(qū)*pre。進(jìn)行如下操作:u=pre->next; pre->next=u->next;free(u);LinkedList LinkedListDel(LinkedList la,LNode *p)刪除單鏈表la上的結(jié)點(diǎn)*p的直接前驅(qū)結(jié)點(diǎn),假定*p存在pre=la; if(pre-next=p) printf(“*p是鏈表第一結(jié)點(diǎn),無(wú)前驅(qū)n”) exit(0) while(pre->next->next !=p) pre
20、=pre->next;u=pre->next; pre->next=u->next; free(u);return(la); 2.12 設(shè)計(jì)一算法,將一個(gè)用循環(huán)鏈表表示的稀疏多項(xiàng)式分解成兩個(gè)多項(xiàng)式,使這兩個(gè)多項(xiàng)式各自僅有奇次冪或偶次冪項(xiàng),并要求利用原鏈表中的結(jié)點(diǎn)空間來(lái)構(gòu)造這兩個(gè)鏈表?!绢}目分析】設(shè)循環(huán)鏈表表示的多項(xiàng)式的結(jié)點(diǎn)結(jié)構(gòu)為: typedef struct node int power; 冪 float coef; 系數(shù) ElemType other; 其他信息 struct node *next; 指向后繼的指針 PNode,*PolyLinkedList;則可以
21、從第一個(gè)結(jié)點(diǎn)開(kāi)始,根據(jù)結(jié)點(diǎn)的冪是奇數(shù)或偶數(shù)而將其插入到奇次冪或偶次冪項(xiàng)的鏈表中。假定用原鏈表保存偶次冪,要為奇次冪的鏈表生成一個(gè)表頭,為了保持鏈表中結(jié)點(diǎn)的原來(lái)順序,用一個(gè)指針指向奇次冪鏈表的表尾,注意鏈表分解時(shí)不能“斷鏈”。void PolyDis(PolyLinkedList poly)將poly表示的多項(xiàng)式鏈表分解為各含奇次冪或偶次冪項(xiàng)的兩個(gè)循環(huán)鏈表PolyLinkedList poly2=(PolyLinkedList)malloc(sizeof(PNode); poly2表示只含奇次冪的多項(xiàng)式 r2=poly2; r2是只含奇次冪的多項(xiàng)式鏈表的尾指針 r1=poly; r1是只含偶次冪
22、的多項(xiàng)式鏈表當(dāng)前結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的指針 p=poly->next; 鏈表帶頭結(jié)點(diǎn),p指向第一個(gè)元素 while(p!=poly) if(p->power % 2)處理奇次冪 r=p->next; 暫存后繼 r2->next=p; 結(jié)點(diǎn)鏈入奇次冪鏈表r2=p; 尾指針后移 p=r; 恢復(fù)當(dāng)前待處理結(jié)點(diǎn) else 處理偶次冪 r1->next=p; r1=p; p=p->next; r->next=poly2; r1->next=poly; 構(gòu)成循環(huán)鏈表 PolyDis2.14 設(shè)單向鏈表的頭指針為hea
23、d,試設(shè)計(jì)算法,將鏈表按遞增的順序就地排序?!绢}目分析】本題中的“就地排序”,可理解為不另辟空間,這里利用直接插入原則把鏈表整理成遞增有序鏈表。LinkedList LinkListInsertSort(LinkedList head) head是帶頭結(jié)點(diǎn)的單鏈表,本算法利用直接插入原則將鏈表整理成遞增的有序鏈表 if(head->next!=null) 鏈表不為空表 p=head->next->next; p指向第一結(jié)點(diǎn)的后繼head->next->next=null;直接插入原則認(rèn)為第一元素有序,然后從第二元素起依次插入while(p!=null) r=p-&
24、gt;next; 暫存p的后繼 q=head; while(q->next && q->next->data<p->data)q=q->next;查找插入位置 p->next=q->next; 將p結(jié)點(diǎn)鏈入鏈表 q->next=p; p=r; 2.15 已知遞增有序的三個(gè)單鏈表分別代表集合A,B和C,設(shè)計(jì)算法實(shí)現(xiàn)A=A(BC),并使結(jié)果鏈表仍保持遞增。要求算法的時(shí)間復(fù)雜度為O(|A|+|B|+|C|)。其中,|A|為集合A的元素個(gè)數(shù)?!绢}目分析】本題首先求B和C的交集,即求B和C中共有元素,
25、再與A求并集,同時(shí)刪除重復(fù)元素,以保持結(jié)果A遞增。LinkedList union(LinkedList A,B,C)A、B和C均是帶頭結(jié)點(diǎn)的遞增有序的單鏈表,本算法實(shí)現(xiàn)A=A(BC)使結(jié)果表A保持遞增有序pa=A->next;pb=B->next;pc=C->next;設(shè)置三個(gè)工作指針 pre=A; pre指向結(jié)果鏈表中當(dāng)前待合并結(jié)點(diǎn)的前驅(qū) A->data=MaxElemType;同類型元素最大值,起監(jiān)視哨作用while(pa | pb && pc) while(pb && pc) if(pb->data<pc->da
26、ta) pb=pb->next; else if(pb->data>pc->data) pc=pc->next; else break; B表和C表有公共元素 if(pb && pc) while(pa && pa->data<pb->data)先將A中小于B,C公共元素部分鏈入 pre->next=pa;pre=pa;pa=pa->next; if(pre->data!=pb->data)pre->next=pb;pre=pb;pb=pb->next;pc=pc->nex
27、t; elsepb=pb->next;pc=pc->next; 若A中已有B,C公共元素,則不再存入結(jié)果表 while(pa|pb&&pc) if(pa) pre->next=pa;else pre->next=null; 當(dāng)B,C無(wú)公共元素,將A中剩余鏈入算法Union結(jié)束 2.16 順序表la與lb非遞減有序,順序表空間足夠大。試設(shè)計(jì)一種高效算法,將lb中元素合到la中,使新的la的元素仍保持非遞減有序。高效指最大限度地避免移動(dòng)元素?!绢}目分析】順序存儲(chǔ)結(jié)構(gòu)的線性表的插入,其時(shí)間復(fù)雜度為O(n),平均移動(dòng)近一半的元素。線性表la和lb合并時(shí),若從第一
28、個(gè)元素開(kāi)始,一定會(huì)造成元素后移,這不符合本題“高效算法”的要求。應(yīng)從線性表的最后一個(gè)元素開(kāi)始比較,大者放到最終位置上。設(shè)兩線性表的長(zhǎng)度各為m和n ,則結(jié)果表的最后一個(gè)元素應(yīng)在m+n位置上。這樣從后向前,直到第一個(gè)元素為止。SeqList Union(SeqList la, SeqList lb)la和lb是順序存儲(chǔ)的非遞減有序線性表,本算法將lb合并到la中,元素仍非遞減有序 m=la.last;n=lb.last;m,n分別為線性表la和lb的長(zhǎng)度 k=m+n-1; k為結(jié)果線性表的工作指針(下標(biāo)) i=m-1;j=n-1; i,j分別為線性表la和lb的工作指針(下標(biāo)) while(i&g
29、t;=0 && j>=0) if(la.datai>=lb.dataj) la.datak-=la.datai-; else la.datak-=lb.dataj-; while(j>=0) la.datak-=lb.dataj-; la.last=m+n; return la; 【算法討論】算法中數(shù)據(jù)移動(dòng)是主要操作。在最佳情況下(lb的最小元素大于la的最大元素),僅將lb的n個(gè)元素移(拷貝)到la中,時(shí)間復(fù)雜度為O(n),最差情況,la的所有元素都要移動(dòng),時(shí)間復(fù)雜度為O(m+n)。因數(shù)據(jù)合并到la中,所以在退出第一個(gè)while循環(huán)后,只需要一個(gè)while循
30、環(huán),處理lb中剩余元素。第二個(gè)循環(huán)只有在lb有剩余元素時(shí)才執(zhí)行,而在la有剩余元素時(shí)不執(zhí)行。本算法 “最大限度的避免移動(dòng)元素”,是“一種高效算法”。2.17 已知非空線性鏈表由head指出,試寫(xiě)一算法,將鏈表中數(shù)據(jù)域值最小的那個(gè)結(jié)點(diǎn)移到鏈表的最前面。要求:不得額外申請(qǐng)新的鏈結(jié)點(diǎn)?!绢}目分析】 本題要求將鏈表中數(shù)據(jù)域值最小的結(jié)點(diǎn)移到鏈表的最前面。首先要查找最小值結(jié)點(diǎn)。將其移到鏈表最前面,實(shí)質(zhì)上是將該結(jié)點(diǎn)從鏈表上摘下(不是刪除并回收空間),再插入到鏈表的最前面。LinkedList Delinsert(LinkedList head)本算法將非空線性鏈表head中數(shù)據(jù)域值最小的那個(gè)結(jié)點(diǎn)移到鏈表的最
31、前面p=head->next;p是鏈表的工作指針pre=head; pre指向鏈表中數(shù)據(jù)域最小值結(jié)點(diǎn)的前驅(qū)q=p; q指向數(shù)據(jù)域最小值結(jié)點(diǎn),初始假定是第一結(jié)點(diǎn)while (p->next) if(p->next->data<q->data)pre=p;q=p->next; 找到新的最小值結(jié)點(diǎn) p=p->next; if(q!=head->next) 若最小值是第一元素結(jié)點(diǎn),則不需再操作pre->next=q->next; 將最小值結(jié)點(diǎn)從鏈表上摘下q->next=head->next; 將q結(jié)點(diǎn)插到鏈表最前面head-
32、>next=q;Delinsert2.19 三個(gè)帶頭結(jié)點(diǎn)的線性鏈表la、lb和lc中的結(jié)點(diǎn)均依元素值自小至大非遞減排列(可能存在兩個(gè)以上值相同的結(jié)點(diǎn)),編寫(xiě)算法對(duì)la表進(jìn)行如下操作:使操作后的la中僅留下三個(gè)表中均包含的數(shù)據(jù)元素的結(jié)點(diǎn),且沒(méi)有值相同的結(jié)點(diǎn),并釋放所有無(wú)用結(jié)點(diǎn)。限定算法的時(shí)間復(fù)雜度為O(m+n+p),其中m、n和p分別為三個(gè)表的長(zhǎng)度?!绢}目分析】 留下三個(gè)鏈表中公共數(shù)據(jù),首先查找兩表la和B中公共數(shù)據(jù),再去lc中找有無(wú)該數(shù)據(jù)。要消除重復(fù)元素,應(yīng)記住前驅(qū),要求時(shí)間復(fù)雜度O(m+n+p),在查找每個(gè)鏈表時(shí),指針不能回溯。LinkedList lcommon(LinkedList la,lb,lc)本算法使la表留下la、lb和lc三個(gè)非遞減有序表共同結(jié)點(diǎn),無(wú)重復(fù)元素pa=la->next;pb=lb->next;pc=lc->next;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級(jí)上冊(cè)音樂(lè)教案
- 運(yùn)維方案-模板
- 鄉(xiāng)鎮(zhèn)購(gòu)房合同樣本
- 新教材數(shù)學(xué)人教B版必修第二冊(cè)教學(xué)案:6.1.2-向量的加法
- 2025年工程項(xiàng)目招投標(biāo)合同(全新版銀行擔(dān)保書(shū))
- 專業(yè)分包工程合同標(biāo)準(zhǔn)文本
- 設(shè)計(jì)類保密協(xié)議模板
- 淘寶店鋪運(yùn)營(yíng)教學(xué)設(shè)計(jì)
- 優(yōu)惠率建設(shè)工程合同樣本
- 修路公司合同樣本
- 2024年廣州市衛(wèi)生健康系統(tǒng)招聘“優(yōu)才計(jì)劃”考試真題
- 重點(diǎn)營(yíng)業(yè)線施工方案
- 餐飲店菜品成本計(jì)算表
- 《水土保持監(jiān)測(cè)技術(shù)規(guī)范SLT 277-2024》知識(shí)培訓(xùn)
- 2025年江蘇南京事業(yè)單位招聘(787人)高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 檔案管理制度培訓(xùn)宣貫
- GB/T 33136-2024信息技術(shù)服務(wù)數(shù)據(jù)中心服務(wù)能力成熟度模型
- 《保護(hù)地球愛(ài)護(hù)家園》課件
- 霧化吸入療法合理用藥專家共識(shí)(2024版)解讀
- 2024年度產(chǎn)學(xué)研合作與科研獎(jiǎng)勵(lì)協(xié)議3篇
- 電力工程線路交叉跨越施工主要工序及特殊工序施工方法
評(píng)論
0/150
提交評(píng)論