版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、傳智播客C和C+丐數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)講義傳智掃地僧1、數(shù)據(jù)結(jié)構(gòu)概念數(shù)據(jù)結(jié)構(gòu)相關(guān)概念疑惑1、我學(xué)完了C語(yǔ)言,可是現(xiàn)在感覺(jué)還是寫(xiě)不出代碼。2、為什么會(huì)有各種各樣的程序存在?3、程序的本質(zhì)是什么?程序是為了具體問(wèn)題而存在的程序需要圍繞問(wèn)題的解決進(jìn)行設(shè)計(jì)同一個(gè)問(wèn)題可以有多種解決方案如何追求程序的“性?xún)r(jià)比”?是否有可量化的方法判別程序的好壞?數(shù)據(jù)結(jié)構(gòu)起源計(jì)算機(jī)從解決數(shù)值計(jì)算問(wèn)題到解決生活中的問(wèn)題'現(xiàn)實(shí)生活中的問(wèn)題涉及不同個(gè)體間的復(fù)雜聯(lián)系需要在計(jì)算機(jī)程序中描述生活中個(gè)體間的聯(lián)系數(shù)據(jù)結(jié)構(gòu)主要研究非數(shù)值計(jì)算程序問(wèn)題中的操作對(duì)象以及它們之間的關(guān)系不是研究復(fù)雜的算法數(shù)據(jù)結(jié)構(gòu)中的基本概念數(shù)據(jù)-程序的操作對(duì)象,用于
2、描述客觀事物(inta,intb,)/數(shù)據(jù)的特點(diǎn):可以輸入到計(jì)算機(jī)/可以被計(jì)算機(jī)程序處理數(shù)據(jù)是一個(gè)抽象的概念,將其進(jìn)行分類(lèi)后彳#到程序設(shè)計(jì)語(yǔ)言中的類(lèi)型。如:int,float,char數(shù)據(jù)元素:組成數(shù)據(jù)的基本單位數(shù)據(jù)項(xiàng):一個(gè)數(shù)據(jù)元素由若干數(shù)據(jù)項(xiàng)組成數(shù)據(jù)對(duì)象-性質(zhì)相同的數(shù)據(jù)元素的集合(比如:數(shù)組,鏈表)歉據(jù)敕據(jù)對(duì)象數(shù)據(jù)對(duì)象敷搪無(wú)費(fèi)數(shù)據(jù)兀素敦?fù)?jù)元素?cái)?shù)據(jù)元數(shù)據(jù)41數(shù)據(jù)貨2數(shù)據(jù)事1數(shù)據(jù)項(xiàng)2敦希項(xiàng)1數(shù)據(jù)項(xiàng)2敷據(jù)事1數(shù)提項(xiàng)2答:物理結(jié)構(gòu)亦稱(chēng)t是數(shù)據(jù)的迎再結(jié)構(gòu)在計(jì)算機(jī)存儲(chǔ)器內(nèi)的表示(或映像)o它JwLjWLrv*-TJHJrIJ"%。存儲(chǔ)結(jié)構(gòu)可分為4大類(lèi):順序.斐為親小散列最常用的存骨捕狗為:順序
3、存的轉(zhuǎn)樹(shù)借助元素在存儲(chǔ)卷中的相對(duì)位置末袤示I數(shù)據(jù)元素間的邏輯關(guān)京鋌式存儲(chǔ)結(jié)構(gòu)借助指示元素存儲(chǔ)地址的指計(jì)襄示數(shù)據(jù)元素間的遑輯關(guān)系,數(shù)據(jù)的邃粗結(jié)構(gòu)與存儲(chǔ)結(jié)構(gòu)密切相關(guān)算法設(shè)計(jì)K超輯結(jié)構(gòu)笄法實(shí)現(xiàn)存儲(chǔ)結(jié)構(gòu)解什么是數(shù)據(jù)的運(yùn)算操作或處理答:在數(shù)據(jù)的逗樽結(jié)構(gòu)上定義的操作,。數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)上實(shí)現(xiàn)-III*BF,最常用的數(shù)據(jù)運(yùn)算有S種:插入、刪除、修女、查找、排序CM=VO/次at算法C(4H8)法5nDUD(2*1)法DJn2)n112L-_.3I21629I4n3203ig9n=1048102G1IftOnw10040810020001IOOOO森IQOO.4008LJ00020000011。畫(huà))<XK
4、)次數(shù)M»G(in1)舞法H(3n+i施I(2r>z*3n+11246。Z81715:n5501666n«1020031231n=1002000030120301n-LOOO20000(1030Ot2003001n-IdOOO200000000wool200030001n-100t0002000000000030000120000300001n-1.000,00020000000000003OOOOOl2000001000OOI執(zhí)行次她離政Iat非正式水*巴,0(1)2m+3LOCn)城業(yè)階3nJ+2n+l0(/)平方階51ogjn+201OClop/j)H數(shù)降2n+
5、5nio£n+19Ot/iloRrt)nlogu階6n*+2nJ+ln+4。(“)二.r0(2")立方階2Tt找4t階0(1)<0(Jogn)<Oln)<O(dogn)<0(/)<0()<02"0")UJ.工J-口U口XJ.UJ._l數(shù)字n出現(xiàn)的次數(shù)放在新開(kāi)辟的內(nèi)存空間倒色n-1的位置把每一個(gè)數(shù)字的中間結(jié)果給堞存下來(lái)一先來(lái)一個(gè)大家最感興趣的.一年里的星座列表,是不是線性表呢?如圖3-2-2所白金雙巨獅處天射庫(kù)水雙羊牛,子蟹子女,稗手羯瓶魚(yú)級(jí)中同學(xué)的友誼關(guān)系N:NB.公司中的上下級(jí)關(guān)系1:NC冬天圖書(shū)館排隊(duì)占座關(guān)系D.花
6、名冊(cè)上名字之間的關(guān)系1:1線性表的操作創(chuàng)建線性表銷(xiāo)毀線性表清空線性表將元素插入線性表將元素從線性表中刪除獲取線性表中某個(gè)位置的元素獲取線性表的長(zhǎng)度線性表在程序中表現(xiàn)為一種特殊的數(shù)據(jù)類(lèi)型線性表的操作在程序中的表現(xiàn)為一組函數(shù)C語(yǔ)言描述=»線性表的設(shè)計(jì)與實(shí)現(xiàn)ADT抽象層數(shù)據(jù)Z勾(C語(yǔ)言版).嚴(yán)蔚敏_吳偉民.掃描版.pdfp44頁(yè)人生財(cái)富庫(kù)積累#ifndef_WBM_LIST_H_#define_WBM_LIST_HtypedefvoidList;typedefvoidListNode;341順序存儲(chǔ)定義說(shuō)這么多的線性表,我們來(lái)看看線性表的兩種物理結(jié)構(gòu)的第一種一序存儲(chǔ)結(jié)構(gòu)*性衰的總體存佛堵胸
7、,指的是用一段地址連嫌的存簿元依次存儲(chǔ)畿性裳的鼓據(jù)元素r線性衣(皿,而)的喉序存儲(chǔ)示意圖如下:薪a?Ab.ia$圖"I*表以序寺施,健者溝曜口和也我的身臨長(zhǎng)F是網(wǎng),'不同打假把t5|口0"69夕/Ir方隹for(i=lenBthi;i2眠;1)Ifill.-uLl-1.“-LEJ/i-3".卷五1奉-P“I國(guó)/&&)?I巧口0k喇余空間n個(gè)結(jié)點(diǎn)(新的存儲(chǔ)映像)蟒結(jié)成一個(gè)鏈表,即為線性裘(皿,I,,")的情式存儲(chǔ)結(jié)構(gòu),因?yàn)榇隋e(cuò)表的每個(gè)結(jié)點(diǎn)中只包含一個(gè)指針域,所以叫做單鏈表.單榜表正是通過(guò)每個(gè)給點(diǎn)的指針域?qū)⒕€惟表的數(shù)據(jù)元素技其邏輯次序
8、鏈接在一起,如圖324ixkfltypedefstruct.tas.LinkListN?deLinkListtlode;struct_taf_LinkListNod&LinkLi£tNod&*rityt.:端點(diǎn)指針域正乂typedefstruct_tag_LinkList-LinkLi上tN口d自header:intlength;TLinkList;一一定義strictValueLinkListNodeheader:intv:k數(shù)據(jù)元素定義示例插入元素操作*9nade-Miextwcurrent->next;node;eitrrftntcurr«!nf
9、->neitJkcurrenc->nexc=itadecurjreiil因去科"彳年產(chǎn)"一個(gè)匕皆保.行,一弓迪百current匚CEGLt“01rijde->£it=LArr&jfLl->nexl,2current>nei1=nod?;:指針搭瞰就把誰(shuí)的地幽喻指針?分清楚鏈表的操作邏輯和輔聃指曾變量之間的關(guān)卷GUETCDt/理存故地除的下點(diǎn)位置1et=curricnt-z'neat;i指料拈iM蜘:把老的世址廊官推升£片常定范書(shū)的挨豐巴羯胡竄毛計(jì)克至之同的美第理耦cijrrent->ncxl=ret-&
10、gt;nTzt共結(jié)點(diǎn)尾結(jié)點(diǎn)游標(biāo)slider近六十年代出生的人,應(yīng)該也就是我們父母那一薪,當(dāng)年計(jì)劃經(jīng)濟(jì)制度下,他們的生活祓社會(huì)安排好了I先科員再科長(zhǎng)、后處長(zhǎng)再局長(zhǎng),混到哪算哪;學(xué)徒.技工、高級(jí)技工;教師、中皴我?guī)?、高fil教師,總之無(wú)論乘個(gè)行業(yè)都稔排輩.這鉗的生活如何讓人奮發(fā)努力.所以經(jīng)濟(jì)發(fā)展緩慢,就豫苑們的線性表的順序存儲(chǔ)結(jié)構(gòu)一樣,位置是推好的,一切都得慢慢來(lái).可見(jiàn).夢(mèng)適環(huán)境是很卷培養(yǎng)出堅(jiān)強(qiáng)品格,被安排好的人生,也很難做出偉大事業(yè)#市場(chǎng)經(jīng)濟(jì)社會(huì)下,機(jī)會(huì)就大參了,你可以從社會(huì)的任何一個(gè)位置開(kāi)始起步.只要你真有決心,沒(méi)有人可以攔著你.簾實(shí)也證期.無(wú)論出身是什么,之前是凄苦還是富足,都有出人頭地的一
11、天。當(dāng)然I這也就意味著,面臨的競(jìng)爭(zhēng)也是空前激烈的,一不小心,你的位置就可能俄人插足,甚至你就得out出局這也多像我們線性表的鏈?zhǔn)剑鎯?chǔ)結(jié)構(gòu),任何位置都可以插入和刪除*a不怕苦,吃苦半輦子,怕吃苦.吃苦一草子*如果你覺(jué)得上學(xué)讀書(shū)是受罪,假設(shè)你可以活到B0歲.其實(shí)你最多也就吃了20年苦,用人生四分之的時(shí)間來(lái)?yè)Q取甕余時(shí)闞的幸福生活,這點(diǎn)苦不你啥口再說(shuō)了,跟背我學(xué)習(xí),這也能算是吃苦?好了,今天課就到這,下i亂I普通插入元素(:和單鏈表是一樣的)I3已經(jīng)存在的和單窿表是一樣的current/®nodeL/*icu匚匚?nt->口匕xt=node;node'>nextnext
12、->prenode'>prenext;node;current:,一A,fcurrentcurrent-'nextnext;next-precurrent;nullnentnesi=current-Jnent若植人第一個(gè)匕點(diǎn),與耳判的打班樽傕否通冏人代和國(guó)足rmdje*>prg:-currentntJ?t->pre-2fo.jiE-ie->njexC,一工上工Iwcurrent->neit-口口蛇:nrrentcurrent在尾部地、元京變二.(1母阻甘Liitfit-pre=cumenlJieriemreht-»enrei-5he
13、xT巾體裝出一W律后小蚪或首先它是一個(gè)也就是說(shuō),棧元素具有線性關(guān)系IWJ前驅(qū)后繼美系.只不過(guò)它是一種埼殊的線性表而已-定義中兌是在線性表的表足進(jìn)行插入用刪除操作,這里表尾是指棧頂,而不是棧底.它的特殊之處就在于限制了這個(gè)毅性表的插入和蒯除位置,它始終只在棧頂進(jìn)行這也就使得:棧底是固定的,最先避棧的只能在棧底.棧的插入操作,叫作進(jìn)棧,也稱(chēng)壓錢(qián).人棧。類(lèi)似產(chǎn)彈人彈求,如圖42*2所示平極的蒯除操作,叫作出棧.也有的叫作彈棧如同彈夾中的子彈出匕w,A23所示.£飛在設(shè)一更部LII!.乩/?。憾?_二"口日二更市、戕的錯(cuò)點(diǎn)群守inell尹,講完了咳的順序存儲(chǔ)結(jié)構(gòu).我們現(xiàn)在來(lái)看,書(shū)的
14、鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),簡(jiǎn)稱(chēng)為鏈棧.想想書(shū),棧只是林劭來(lái)做插入和坍除操作,棧頂放在拚去的頭部還是尾部呢?由于單盤(pán)表右頭指針,血攫值指斜也是必須的.那十嗎不讓它喃合二為一呢,所跟比較好的辦法是把或順?lè)旁趩蔚谋淼膹泥](如國(guó)46門(mén)所示葭月外,都已芬布了愧頂在頭那廣,甲鏈表中比較常用的頭陸點(diǎn)也就失去了意義,通常對(duì)r鏈恍來(lái)說(shuō),是不需要頭結(jié)點(diǎn)電段底transformtexp)(創(chuàng)述桂5;"Mii=)(it(expUJ為妁字)<OutpuT(expli);elseifIexpU)為衿號(hào)?(岫物explilCUUS<=性及符號(hào)伏光版)output(W5n<);poptsn)Pu4h5,exp
15、i);elseif(已卬門(mén)力左括號(hào))(Push(5.expi);elseif(expli)為右插號(hào))(khiletK原存號(hào)不為芟括號(hào))(outpu口畫(huà)&行號(hào)hPop(S>從S甲彈出左括號(hào)一else報(bào)聃.停止鼻;whileSi?e(S)>“砧(expj-=)叫卬ut(理r®存號(hào)片PoMS);J1computE忙卬)翎建樓S;1=0;gillie(expi!空10)if(expfi為野字)(Push(S,expi)helseif(expi為符號(hào))1從柱中彈出右捧作觸;2.從棧中彈出左搔作軟;3,概據(jù)符號(hào)進(jìn)行運(yùn)算;Push(stack,結(jié)果);)else(報(bào)錯(cuò)停止鬲環(huán);
16、if(Size(5)=L)<expi=)煤作條線和客服系統(tǒng)中,都是應(yīng)用r神數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)剛才提到的先進(jìn)先出的排隊(duì)功能,這就是隊(duì)列.隊(duì)列(queueI是艮北忤在一端進(jìn)行插入操作.而在另一端進(jìn)行除操作的線性衰口隊(duì)列是一種先進(jìn)先出(FietInFiratOut)的線性表,簡(jiǎn)稱(chēng)FIFO.允許插入的一裁稱(chēng)為隊(duì)尾,允許刪除的一端稱(chēng)為隊(duì)頭,唱過(guò)隊(duì)列是q=(ai,a九.aj.那么位就是隊(duì)頭兀素,而小是隊(duì)尾元素.這樣我們就可以刪除時(shí),總是從at開(kāi)始,而插入時(shí),列在后.這也比莪符合我們通常生活中的習(xí)慣,排在第一個(gè)的優(yōu)先出列,最后來(lái)的當(dāng)排在隊(duì)缶最后,如圖41tM所示.隊(duì)列在程序設(shè)計(jì)中用得非常頻繁前面我們已經(jīng)舉
17、了兩個(gè)例子,再比如用鍵盤(pán)進(jìn)行各種字句或數(shù)字的輸入,到顯示器上如記事本軟件上的輸曲.其實(shí)就是隊(duì)列的典型鼠頭閑致遍來(lái)模按隊(duì)列.從迎冕的國(guó)史入苴刊從數(shù)盥的。號(hào)位百出隊(duì)列I-L33456?日I目國(guó)對(duì)尾廖靚表來(lái)使縱隊(duì)列,出鼠用肝尾部AKX?J從健老的Q號(hào)位置出隊(duì)列需要于1,1列羊點(diǎn)=轆表給占=入鏈表率n對(duì)阿HPDCPDd.總1j己止所百箱點(diǎn)出隊(duì)列,然后輝成籍點(diǎn)的內(nèi)存/蔚敏_吳偉民.掃描版.pdfp124數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù):數(shù)據(jù)Z構(gòu)(C語(yǔ)言版).嚴(yán)蔚敏_吳偉民.掃描版.pdfp127QIDijTjTX®®<s<a7Xrt7<j)OOG)Q©G©fJkJi
18、f|1JJ,=_x.(fi.o(lj<0XaZWCDQ性質(zhì)4:具有n個(gè)結(jié)點(diǎn)的完全二叉樹(shù)的深度必為10g2n+1性質(zhì)5:對(duì)完全二叉樹(shù),若從上至下、從左至右編號(hào),則編號(hào)為i的結(jié)點(diǎn),其左孩子編號(hào)必為2i,其右孩子編號(hào)必為2i+1;其雙親的編號(hào)必為i/2(i=1時(shí)為根,除外)二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)/一、順序存儲(chǔ)結(jié)構(gòu)、/按二叉樹(shù)的結(jié)點(diǎn)自上而卜、從左至右”編號(hào),用一組連續(xù)的存儲(chǔ)單兀存儲(chǔ)。答:一律轉(zhuǎn)為完全二叉樹(shù)!討論:不是完全二叉樹(shù)怎么辦?方法很簡(jiǎn)單,將各層空缺處統(tǒng)統(tǒng)補(bǔ)上虛結(jié)點(diǎn)”,其內(nèi)容為空二、鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)二叉樹(shù)的表示二叉樹(shù)表示法P127頁(yè)/*typedefstructBiTNode(intdata;str
19、uctBiTNode*lchild,*rchild;BiTNode,*BiTree;*/structBiTNode(intdata;structBiTNode*lchild,*rchild;typedefstructBiTNodeBiTNode;typedefstructBiTNode*BiTree;樹(shù)的三叉鏈表表示先序遍歷的結(jié)果是中序遍歷的結(jié)果是DBEAC后序遍歷的結(jié)果是DEBCABCDEFGII先序遍歷中序遍歷后序遍歷BDCEAFHGDECBIIGFAULR先序遍歷,即先根再左再右LDR中序遍歷,即先左再根再右LRD后序遍歷,即先左再右再根從前面的三科遍歷算法可以令道:如果將printf語(yǔ)
20、句抹去T從遞歸的點(diǎn)度看,這三種算法是完全相同的,或者說(shuō)這三種遍歷算法的訪問(wèn)路徑是相同的乂是訪問(wèn)結(jié)點(diǎn)鞘時(shí)機(jī)不同.從虛線的出發(fā)點(diǎn)到終點(diǎn)的路徑八上,每個(gè)結(jié)點(diǎn)經(jīng)過(guò)3次.,第1次經(jīng)過(guò)時(shí)訪問(wèn)二先存遍歷B0第2次經(jīng)過(guò)時(shí)訪問(wèn)=巾遍歷;第3次經(jīng)過(guò)時(shí)訪河"后序追歷干俊、/(£2.二叉樹(shù)遇歷的時(shí)間點(diǎn)率和空間效率時(shí)間放率:。(n)每個(gè)結(jié)點(diǎn);;訪問(wèn)一次FgJ1-t:O(n>"棧占用的最大輔劫空間(精確值:樹(shù)深為k的遞歸遍歷需安+1個(gè)輔助單元?。┲行虮闅v算法的非遞螞描述BPEXckJc*lhibadxil(HiTreeT.Suick*S)(if!1>t'elum'
21、ILL:while(T-(child)Prhih(S母T-EchRU:1return:),/±2g止冷及的斗:去v*)idhardervoidi-clemType&e»>tHGSlack展tGuLadJitI.S);找到矗左下的好點(diǎn)wliiJrilvisits-dataibifi|t-rchildii=OuKwLeift&rchild.5).dwirIfSluekJimplyIS)1Sk廠、中亭巖巧三堂1明好?卜巴走嗎T(d/時(shí)的形狀輪唯一-.、,/*ft*/#并X彳飛-.、/前苫/7Y十/左種的雌有,4/右子樹(shù)的根與,J/了搬嶼時(shí),抽右訓(xùn)"
22、/整世滿(mǎn):的方不柑r巖更呵X播嘉平和右子料邊等分明(1)采用;叉鏈表空間效率這么低,能否利用這些空閑區(qū)存放有用的信息?(2)二叉鏈表只能找到結(jié)點(diǎn)的左右孩子信息,而不能得到結(jié)點(diǎn)在任一序列中的前驅(qū)和后繼信息r這種信息只有在西歷過(guò)程中才能得到,我們可否對(duì)二叉鏈去進(jìn)行改造?f增加兩個(gè)域:IXvd和bwd;兩種解決方法I存放前里指不1孱港爨指針利用空鏈域(n+1個(gè)空鏈域)我們可以用這IL1個(gè)空鏈域未存放當(dāng)前站點(diǎn)的直接前驅(qū)和后繼等淺索,以加快查找速JL-A二叉線索樹(shù)rchilcl懸空?力追免懸空1)若結(jié)點(diǎn)有左子樹(shù),則khUd指向其左孩子;否則,khiWL指向其直接前驅(qū);2)若結(jié)點(diǎn)有右子樹(shù).則rchild指
23、向其右孩子;否則,Eiild指向其直接后繼(即線索3。了避免混淆.增加兩個(gè)標(biāo)志域.如下圖所示曲山以下二叉樹(shù)對(duì)應(yīng)的殘索二叉樹(shù)該二叉樹(shù)中序遍歷結(jié)果為:axLB,E,所以添加線索應(yīng)當(dāng)檢如下路徑進(jìn)行:時(shí),表示正常情況;時(shí),表示線索情況.通過(guò)圖6-10-4(空心黃頭實(shí)線為前驅(qū),虛線黑箭頭為后繼),就更容易看出,其實(shí)線索二義相,等于是把一模二叉樹(shù)轉(zhuǎn)變成了一個(gè)雙向幡表,這樣對(duì)我們的捕人刪除結(jié)點(diǎn),查找某個(gè)結(jié)點(diǎn)都帶來(lái)了方便,所以我們對(duì)二叉棚以某種次序遍歷使其變?yōu)榫€索二又樹(shù)的過(guò)程稱(chēng)做是線索化圖6>ltM#.伸羽再懺變R三智齒寫(xiě)手有常沮ifCprea>rehiiE=WXL)E”5LrTfhiM-r1有了
24、線索二丈的后,我們對(duì)它進(jìn)行遍街時(shí)發(fā)現(xiàn),其實(shí)就等于是操作一個(gè)雙向鏈表結(jié)構(gòu).voidIrThrcading(Bi1nrNndeJ(if)ifCprcddld=即叮)/前朋校懿菽::pie->KTai=L;pre->rchild=p;/)Pre=P;"爆拽卬善同g的3IThrcaiTi(p->rdnLd);/1ii®在既麒Ki3后/卻骷岐b)/FInThrcadingchild);/化if(p->lchild=WULL)/凌魅P->LTm=1;p->lchild=K"O線盍鬲近微推醐孤和雙向鏈表結(jié)構(gòu)一樣,在二又樹(shù)線索鏈表上添加一個(gè)頭錯(cuò)
25、點(diǎn).如圖6-1牛6所示,并令其國(guó)匍域的指針指向二乂網(wǎng)的根結(jié)點(diǎn)(圖中的),KrchiU域的指針指向中序遍行時(shí)訪問(wèn)的最后一個(gè)結(jié)點(diǎn)(圖中的).反之1令二叉周的中序序列中的第一個(gè)結(jié)點(diǎn)中,上hiH域指針和最后一個(gè)結(jié)點(diǎn)的rchild域指均指向頭結(jié)點(diǎn)(圖中的和I這樣定義的好處就是我們既可以從第一個(gè)結(jié)點(diǎn)起順后儺進(jìn)行遍歷,也可以從最后一個(gè)結(jié)點(diǎn)起搬前驅(qū)迸行遍歷*我何能把這兩耀4闊筒化成葉f給點(diǎn)帶投的一叉羯,如圖6-12-4所示.牝中A妻示不及桃、B或示及格.C衷不中等.D襄示良好、E襄示優(yōu)秀.每個(gè)葉干的分支錢(qián)上的數(shù)字就是剛才我們提到的五緞分制的成績(jī)所占比例般.用641薛夫堂大叔說(shuō),從樹(shù)中一個(gè)結(jié)點(diǎn)到另一個(gè)結(jié)點(diǎn)之間的
26、分支構(gòu)成兩個(gè)特點(diǎn)之間的躇靜,路役上的分支數(shù)自稱(chēng)懶路徑長(zhǎng)度,ffi6-12-4的二式豺m中.根結(jié)點(diǎn)到結(jié)點(diǎn)D的路及長(zhǎng)度就為4,二義樹(shù)b中根結(jié)點(diǎn)到站點(diǎn)D的路徑長(zhǎng)度為入梅的路徑長(zhǎng)度就是從捌根到每一結(jié)點(diǎn)的路徑長(zhǎng)度之和已二又附a的樹(shù)臍役長(zhǎng)度就為1+V2+2+3+3+4+4=20,二叉弱卜的鋤路徑長(zhǎng)度就為1*»3+3+2+1+2*2=1幾如果考慮到帶役的緒點(diǎn).結(jié)點(diǎn)的帶杈的踣徑長(zhǎng)度為從填結(jié)點(diǎn)到輔福之間的路段張度與結(jié)點(diǎn)上權(quán)的秦極,幡的帶權(quán)踣經(jīng)長(zhǎng)度為例中所者葉子結(jié)盒的帶極痣徑長(zhǎng)度之和.假慢仃仆個(gè)枇值wwu-Wn),構(gòu)造一棵百口個(gè)葉子結(jié)點(diǎn)的二叉樹(shù),吊個(gè)明了結(jié)點(diǎn)嘴權(quán)Wk.每個(gè)葉子的路徑長(zhǎng)度為1k,我解通軒汜
27、作.則其中帶權(quán)踣住長(zhǎng)度WL最小的二叉稱(chēng)做麟關(guān)曼物也在不少好中他棟為最優(yōu)義榜,我個(gè)人黨得為了紀(jì)念瓢出巨大頁(yè)*的科學(xué)家,既然用他仃的名字命名,就座簟9!堅(jiān)持用他們的名字稱(chēng)呼,害怕我優(yōu)"史籍體現(xiàn)這操擲的品質(zhì)也應(yīng)垓只作為別名.ABCDEF01100110100111000BADCADFEEDI;1001010010101001000111100定n個(gè)數(shù)值v1,v2,,vn2 .根據(jù)這n個(gè)數(shù)值構(gòu)造二叉樹(shù)集合FF=T1,T2,TnTi的數(shù)據(jù)域?yàn)関i,左右子樹(shù)為空3 .在F中選取兩棵根結(jié)點(diǎn)的值最小的樹(shù)作為左右子樹(shù)構(gòu)造一棵新的二叉樹(shù),這棵二叉樹(shù)的根結(jié)點(diǎn)中的值為左右子樹(shù)根結(jié)點(diǎn)中的值之和4 .在F中刪除
28、這兩棵子樹(shù),并將構(gòu)造的新二叉樹(shù)加入F中5 .重復(fù)3和4,直到F中只剩下一個(gè)樹(shù)為止。這棵樹(shù)即霍夫曼樹(shù)假設(shè)經(jīng)過(guò)統(tǒng)計(jì)ABCDEF&需要傳輸?shù)膱?bào)文中出現(xiàn)的概率如下ABCDEF27%8%15%15%30%5%霍夫曼樹(shù)是一種特殊的二叉樹(shù)霍夫曼樹(shù)應(yīng)用于信息編碼和數(shù)據(jù)壓縮領(lǐng)域霍夫曼樹(shù)是現(xiàn)代壓縮算法的基礎(chǔ)5、排序排序基本概念現(xiàn)實(shí)生活中排序很重要算法已寫(xiě)好代碼復(fù)用&和我們需要學(xué)習(xí)前輩們的經(jīng)驗(yàn)不矛盾,也不代表我們不需要不學(xué)習(xí)。排序是計(jì)算機(jī)內(nèi)經(jīng)常進(jìn)行的一種操作,其目的是將一組“無(wú)序”的數(shù)據(jù)元素調(diào)整為“有序”的數(shù)據(jù)元素。排序數(shù)學(xué)定義:假設(shè)含n個(gè)數(shù)據(jù)元素的序列為R1,R2,,Rn其相應(yīng)的關(guān)鍵字序列為K1,
29、K2,,Kn這些關(guān)鍵字相互之間可以進(jìn)行比較,即在它們之間存在著這樣一個(gè)關(guān)系:Kp1<Kp2<<Kpn按此固有關(guān)系將上式記錄序列重新排列為Rp1,Rp2,,Rpn的操作稱(chēng)作排序排序的穩(wěn)定性如果在序列中有兩個(gè)數(shù)據(jù)元素ri和rj,它們的關(guān)鍵字ki=kj,且在排序之前,對(duì)象ri排在rj前面。如果在排序之后,對(duì)象ri仍在rj前面,則稱(chēng)這個(gè)排序方法是穩(wěn)定的;否則稱(chēng)這個(gè)排序方法是不穩(wěn)定的。多關(guān)鍵字排序排序時(shí)需要比較的關(guān)鍵字多余一個(gè)排序結(jié)果首先按關(guān)鍵字1進(jìn)行排序當(dāng)關(guān)鍵字1相同時(shí)按關(guān)鍵字2進(jìn)行排序/當(dāng)關(guān)鍵字n-1相同時(shí)按關(guān)鍵字n進(jìn)行排序/對(duì)于多關(guān)鍵字排序,只需要在比較操作時(shí)同時(shí)考慮多個(gè)關(guān)鍵字即
30、可!排序中的關(guān)鍵操作比較任意兩個(gè)數(shù)據(jù)元素通過(guò)比較操作確定先后次序交換數(shù)據(jù)元素之間需要交換才能得到預(yù)期結(jié)果內(nèi)排序和外排序內(nèi)排序整個(gè)排序過(guò)程不需要訪問(wèn)外存便能完成外排序待排序的數(shù)據(jù)元素?cái)?shù)量很大,整個(gè)序列的排序過(guò)程不可能在內(nèi)存中完成排序的審判/時(shí)間性能關(guān)鍵性能差異體現(xiàn)在比較和交換的數(shù)量輔助存儲(chǔ)空間為完成排序操作需要的額外的存儲(chǔ)空間必要時(shí)可以“空間換時(shí)間”算法的實(shí)現(xiàn)復(fù)雜性過(guò)于復(fù)雜的排序法會(huì)影響代碼的可讀性和可維護(hù)性,也可能影響排序的性能總結(jié)排序是數(shù)據(jù)元素從無(wú)序到有序的過(guò)程排序具有穩(wěn)定性,是選擇排序算法的因素之一比較和交換是排序的基本操作多關(guān)鍵字排序與單關(guān)鍵字排序無(wú)本質(zhì)區(qū)別排序的時(shí)間性能是區(qū)分排序算法好
31、壞的主要因素選擇法基本思想每一趟(例如第i趟,i=0,1,n-2)在后面n-i個(gè)待排的數(shù)據(jù)元素中選出關(guān)鍵字最小的元素,作為有序元素序列的第i個(gè)元素。排序過(guò)程'首先通過(guò)n-1次關(guān)鍵字比較,從n個(gè)記錄中找出關(guān)鍵字最小的記錄,將它與第一個(gè)記錄交換再通過(guò)n-2次比較,從剩余的n-1個(gè)記錄中找出關(guān)鍵字次小的記錄,將它與第二個(gè)記錄交換重復(fù)上述操作,共進(jìn)行n-1趟排序后,排序結(jié)束i-2一趟二二趟;三趟二四趟二五趟:六趟:排序結(jié)束;例i=l初始:耳7764965132738132738132738132738132738494949766597977665769749657697假設(shè)排序過(guò)程中,待排數(shù)
32、據(jù)元素序列的狀態(tài)為:有序序列R0-i-l無(wú)序序列Ri+*n第i瓶簡(jiǎn)單選擇排序從中選出關(guān)鍵字最小的元素有序序列HO.i無(wú)序序列Ri+l.n插入排序基本思想:元素i個(gè)元素,排序過(guò)程:整個(gè)排序過(guò)程為n-1趟插入,即先將序列中第1個(gè)記錄看成是一個(gè)有序子序列,然后從第2個(gè)記錄開(kāi)始,逐個(gè)進(jìn)行插入,直至整個(gè)序列有序?qū)嵸|(zhì):對(duì)線性表執(zhí)行n-1次插入操作,只是先要找到插入位置V0,V1,,Vi-1已經(jīng)排好序。這時(shí)已經(jīng)排好序。這時(shí),用Vi的關(guān)鍵字與Vi-1,Vi-2,的關(guān)鍵字進(jìn)行比較,找到插入位置即將Vi插入,原來(lái)位置上的對(duì)象向后順移。插入排序關(guān)鍵點(diǎn):1、拿出一個(gè)元素,留出位置、2符合條件的元素后移例i=l(493
33、86597761327I戶(hù)238(3849)6597761327尸365(384965)977613271-497(38496597)761327j=576(3849657697)1327i=613(133849657697)彳7>«»»«JJJJJJ排序結(jié)果:(13273849657697)冒泡排序排序過(guò)程將第一個(gè)記錄的關(guān)鍵字與第二個(gè)記錄的關(guān)餞字進(jìn)行比較,著為逆序r1.key>r2.key,則交換:然后比較第二個(gè)記錄與第三個(gè)記錄;依次類(lèi)推1r宜至第n-1個(gè)記錄和第0個(gè)記錄比較為止弟一越冒泡排序.結(jié)果關(guān)鍵字般大的記錄被安置在Jft后一個(gè)記錄上
34、對(duì)前n,1個(gè)記錄進(jìn)行第二趟官泡排序,結(jié)果使關(guān)鍵字次大的記錄被安置在第n-1個(gè)記錄位置重復(fù)上述過(guò)程,宜到“在一趟排序過(guò)程中沒(méi)有迸行過(guò)交換記聲的蜂作好為止TnstmE)intaQl1J5,inti.;t;prinvfCinpul1。numbers=nw);for(i=1iVl1;"+)scan£C”%d.&a:i)孑printf<n”>?for<j=1;j<l=9;jHfor(i=1?i=joj*i-1-十)if£«iQAai+J二)t=aCil(aLi21=aIi-l-1Jprintf<thesortednumbers
35、士forG=1TVI:i十+)printf(%d。白口).算法冉改進(jìn)123654上述冒泡排序還可做如下改進(jìn):即記住最后一次交換發(fā)生位置lastExchangc泡排序.在“自下向上”冒泡車(chē)布趟掃描中,記住最后一次交換發(fā)生的位一置:lastExchange,位置之前的相鄰記錄均已有序).下一趟排序開(kāi)始時(shí),R|L.lastExchange-11是有序區(qū),RlastExchangcj是無(wú)序區(qū).這樣一趟排序可能使當(dāng)前有序區(qū)擴(kuò)充多個(gè)記錄,從而減少排序的趟數(shù),有獎(jiǎng)?wù)骷摮绦騋希爾排序排序過(guò)程:先取一個(gè)正整數(shù)d1<n,把所有相隔di的記錄放一組,組內(nèi)進(jìn)行直接插入排序;然后取d2<d1,重復(fù)上述分組
36、和排序操作;直至di=1,即所有記錄放進(jìn)一個(gè)組中排序?yàn)橹筄Q(nlogn)希爾排序是不穩(wěn)定的。例初始t4938659776132748554取dl=5一趟分組:49386597613274S554一趟排序:13274855449386、9776取d2=3二趟分組:1327485544938659776二趟排序:1344838274955659776取d3=l二趟分組:13448382749556597761三趟排序:4132738484955657697快速排序思想:快速排序是對(duì)冒泡排序的一種改進(jìn)。它的基本思想是:通過(guò)一躺排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,基準(zhǔn)數(shù)據(jù)排在這兩個(gè)子序列的中間;然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。:對(duì)rst中記錄進(jìn)行一趟快速排序,附設(shè)兩個(gè)指針i和j,設(shè)x-rp.key而始辭令仁s產(chǎn)t首先從j所指位置向前才的記錄,并和rp交換:記錄rp=rs.第一個(gè)關(guān)鍵字從后向刖再犍字位置起向后搜索,找到第一個(gè)關(guān)記錄,和甲交換;從前向
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《豬姜片吸蟲(chóng)病》課件
- 地理(內(nèi)蒙古)-【八省聯(lián)考】河南、山西、陜西、內(nèi)蒙古、四川、云南、寧夏、青海八省2025年高考綜合改革適應(yīng)性演練聯(lián)考試題和答案
- 《知識(shí)大考驗(yàn)》課件
- 小學(xué)一年級(jí)10以?xún)?nèi)連加連減口算練習(xí)題
- 出凝血疾病的實(shí)驗(yàn)診斷學(xué)思路-2019年華醫(yī)網(wǎng)繼續(xù)教育答案
- 作業(yè)姿勢(shì)的分類(lèi)分析及抗疲勞方案
- 2019工程倫理慕課答案(2019秋)習(xí)題及期末答案
- 2022年合肥幼兒師范高等專(zhuān)科學(xué)校單招面試題庫(kù)及答案解析
- 小學(xué)數(shù)學(xué)二年級(jí)數(shù)學(xué)加減法練習(xí)題
- 物流運(yùn)輸客服工作經(jīng)驗(yàn)
- 【川教版】《生命 生態(tài) 安全》四上第13課《預(yù)防凍瘡》課件
- 工廠籌建方案
- UPVC管道安裝施工方法
- 河南省鄭州高新技術(shù)產(chǎn)業(yè)開(kāi)發(fā)區(qū)2023-2024學(xué)年三年級(jí)上學(xué)期1月期末科學(xué)試題
- 女裝行業(yè)退貨率分析
- 計(jì)算機(jī)基礎(chǔ)理論-進(jìn)制的概念及換算試題及答案
- 森林草原防火工作培訓(xùn)課件
- 2023年婦科門(mén)診總結(jié)及計(jì)劃
- 方大重整海航方案
- 河北省秦皇島市昌黎縣2023-2024學(xué)年八年級(jí)上學(xué)期期末數(shù)學(xué)試題
- 礦山治理專(zhuān)項(xiàng)研究報(bào)告范文
評(píng)論
0/150
提交評(píng)論