版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第一章 數(shù)據(jù)結(jié)構(gòu)與算法一、內(nèi)容要點(一)算法1算法的基本概念算法是指解題方案的準(zhǔn)確而完整的描述。即是一組嚴(yán)謹(jǐn)?shù)囟x運算順序的規(guī)則,并且每一個規(guī)則都是有效的,且是明確的,沒有二義性,同時該規(guī)則將在有限次運算后可終止。1)算法的基本特征(1)可行性由于算法的設(shè)計是為了在某一個特定的計算工具上解決某一個實際的問題而設(shè)計的,因此,它總是受到計算工具的限制,使執(zhí)行產(chǎn)生偏差。如:計算機(jī)的數(shù)值有效位是有限的,當(dāng)大數(shù)和小數(shù)進(jìn)行運算時,往往會因為有效位數(shù)的影響而使小數(shù)丟失,因此,在算法設(shè)計時,應(yīng)該考慮到這一點。(2)確定性算法的設(shè)計必須是每一個步驟都有明確的定義,不允許有模糊的解釋,也不能有多義性。例如,一個實
2、際的問題,小寶和萍萍共有12個蘋果,小寶比萍萍多4個,請問小寶和萍萍各有幾個蘋果?這個問題,我們可以立一個方程組x+y=12和x-y=4來求解,要求x和y的值,公式是正確的,但如何讓計算能夠進(jìn)行計算,我們的算法不能把公式直接輸進(jìn)去,而應(yīng)該設(shè)計出解題的步驟和過程。即設(shè)計的算法是計算工具所能夠正常解決問題的過程。(3)有窮性算法的有窮性,即在一定的時間是能夠完成的,即算法應(yīng)該在計算有限個步驟后能夠正常結(jié)束。例如,在數(shù)學(xué)中的無窮級數(shù),在計算機(jī)中只能求有限項,即計算的過程是有窮的。(4)擁有足夠的情報算法的執(zhí)行與輸入的數(shù)據(jù)和提供的初始條件相關(guān),不同的輸入或初始條件會有不同的輸出結(jié)果,提供準(zhǔn)確的初始條件
3、和數(shù)據(jù),才能使算法正確執(zhí)行。2)算法的基本要素一是數(shù)據(jù)對象的運算和操作,二是算法的控制結(jié)構(gòu)。(1)算法中對數(shù)據(jù)的運算和操作算法實際上是按解題要求從環(huán)境能進(jìn)行的所有操作中選擇合適的操作所組成的一組指令序列。即算法是計算機(jī)所能夠處理的操作所組成的指令序列。(2)算法的控制結(jié)構(gòu)算法的功能不僅取決于所選用的操作,而且還與各操作之間的順序有關(guān)。在算法中,操作的執(zhí)行順序又稱算法的控制結(jié)構(gòu),一般的算法控制結(jié)構(gòu)有三種:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。在算法描述是,有相關(guān)的工具對這三種結(jié)構(gòu)進(jìn)行描述,常用的描述工具有:流程圖、N-S結(jié)構(gòu)圖和算法描述語言等。3)算法設(shè)計的基本方法為用計算機(jī)解決實際問題而設(shè)計的算法,即
4、是計算機(jī)算法。通常的算法設(shè)計有如下幾種:(1)列舉法列舉法的基本思想是,根據(jù)提出的問題,列舉出所有可能的情況,并用問題中給定的條件檢驗?zāi)男┦菨M足條件的,哪些是不滿足條件的。列舉法通常用于解決“是否存在”或“有哪些可能”等問題。例如,我國古代的趣味數(shù)學(xué)題:“百錢買百雞”、“雞兔同籠”等,均可采用列舉法進(jìn)行解決。使用列舉法時,要對問題進(jìn)行詳細(xì)的分析,將與問題有關(guān)的知識條理化、完備化、系統(tǒng)化,從中找出規(guī)律。(2)歸納法歸納法的基本思想是,通過列舉少量的特殊情況,經(jīng)過分析,最后找出一般的關(guān)系。歸納是一種抽象,即從特殊現(xiàn)象中找出一般規(guī)律。但由于在歸納法中不可能對所有的情況進(jìn)行列舉,因此,該方法得到的結(jié)論
5、只是一種猜測,還需要進(jìn)行證明。(3)遞推遞推,即是從已知的初始條件出發(fā),逐次推出所要求的各個中間環(huán)節(jié)和最后結(jié)果。其中初始條件或問題本身已經(jīng)給定,或是通過對問題的分析與化簡而確定。遞推的本質(zhì)也是一種歸納,遞推關(guān)系式通常是歸納的結(jié)果。例如,裴波那契數(shù)列,是采用遞推的方法解決問題的。(4)遞歸在解決一些復(fù)雜問題時,為了降低問題的復(fù)雜程序,通常是將問題逐層分解,最后歸結(jié)為一些最簡單的問題。這種將問題逐層分解的過程,并沒有對問題進(jìn)行求解,而只是當(dāng)解決了最后的問題那些最簡單的問題后,再沿著原來分解的逆過程逐步進(jìn)行綜合,這就是遞歸的方法。遞歸分為直接遞歸和間接遞歸兩種方法。如果一個算法直接調(diào)用自己,稱為直接
6、遞歸調(diào)用;如果一個算法A調(diào)用另一個算法B,而算法B又調(diào)用算法A,則此種遞歸稱為間接遞歸調(diào)用。(5)減半遞推技術(shù)減半遞推即將問題的規(guī)模減半,然后,重復(fù)相同的遞推操作。例如,一元二次方程的求解。(6)回溯法有些實際的問題很難歸納出一組簡單的遞推公式或直觀的求解步驟,也不能使用無限的列舉。對于這類問題,只能采用試探的方法,通過對問題的分析,找出解決問題的線索,然后沿著這個線索進(jìn)行試探,如果試探成功,就得到問題的解,如果不成功,再逐步回退,換別的路線進(jìn)行試探。這種方法,即稱為回溯法。如人工智能中的機(jī)器人下棋。2算法復(fù)雜度算法的復(fù)雜度包括時間復(fù)雜度和空間復(fù)雜度。1)時間復(fù)雜度即實現(xiàn)該算法需要的計算工作量
7、。算法的工作量用算法所執(zhí)行的基本運算次數(shù)來計算。同一個問題規(guī)模下,如果算法執(zhí)行所需要的基本次數(shù)取決于某一特定輸入時,可以用以下兩種方法來分析算法的工作量:算法工作量=f(n)(1)平均性態(tài)用各種特定輸入下的基本運算次數(shù)的加權(quán)平均值來度量算法的工作量。設(shè)x是某個可能輸入中的某個特定輸入,p(x)是x出現(xiàn)的概率,t(x)是算法在輸入為x時所執(zhí)行的基本運算次數(shù),則算法的平均性態(tài)定義為:Dn表示當(dāng)規(guī)模為n時,算法執(zhí)行時所有可能輸入的集合。(2)最壞情況復(fù)雜度指在規(guī)模為n時,算法所執(zhí)行的基本運算的最大次數(shù)。它定義為:例如,在具有n個元素的數(shù)列中搜索一個數(shù)x。平均性態(tài):即該數(shù)在數(shù)列中任何位置出現(xiàn)的數(shù)列是相
8、同的,也有可能不存在,存在的概率為q。如果有一半的機(jī)會存在,則概率q為1/2,平均性態(tài):如果查找的元素一定在數(shù)列中,則每個數(shù)存在的概率即為1,則平均性態(tài)為:最壞情況分析:即要查找的元素X在數(shù)列的最后或不在數(shù)列中,顯然,它的最壞情況復(fù)雜度為:2)算法的空間復(fù)雜度指要執(zhí)行該算法所需要的內(nèi)存空間。算法所占用的內(nèi)存空間包括算法程序所占的空間、輸入的初始數(shù)據(jù)所占的存儲空間以及算法執(zhí)行過程中所需要的額外空間,如執(zhí)行過程中工作單元以及某種數(shù)據(jù)結(jié)構(gòu)所需要的附加存儲空間等。(二)數(shù)據(jù)結(jié)構(gòu)的基本概念1概念數(shù)據(jù)結(jié)構(gòu)是指相互有關(guān)聯(lián)的數(shù)據(jù)元素的集合。它包括以下兩個方面:表示數(shù)據(jù)元素的信息表示各數(shù)據(jù)之間的前后件關(guān)系1)數(shù)
9、據(jù)的邏輯結(jié)構(gòu)是指反映數(shù)據(jù)元素之間的邏輯關(guān)系的數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)的邏輯結(jié)構(gòu)有兩個要素:數(shù)據(jù)元素的集合,記作D數(shù)據(jù)之間的前后件關(guān)系,記作R則數(shù)據(jù)結(jié)構(gòu)B=(D,R)2)數(shù)據(jù)的存儲結(jié)構(gòu)數(shù)據(jù)的邏輯結(jié)構(gòu)在計算機(jī)存儲空間中的存放形式稱為數(shù)據(jù)的存儲結(jié)構(gòu),或數(shù)據(jù)的物理結(jié)構(gòu)。即數(shù)據(jù)存儲時,不僅要存放數(shù)據(jù)元素的信息,而且要存儲數(shù)據(jù)元素之間的前后件關(guān)系的信息。通常的數(shù)據(jù)存儲結(jié)構(gòu)有順序、鏈接、索引等存儲結(jié)構(gòu)。2數(shù)據(jù)結(jié)構(gòu)的圖形表示數(shù)據(jù)結(jié)構(gòu)的圖形表示有兩個元素:中間標(biāo)有元素值的方框表示數(shù)據(jù)元素,稱為數(shù)據(jù)結(jié)點用有向線段表示數(shù)據(jù)元素之間的前后件關(guān)系,即有向線段從前件結(jié)點指向后件結(jié)點注意:在結(jié)構(gòu)圖中,沒有前件的結(jié)點稱為根結(jié)點,沒有后
10、件的結(jié)點稱為終端結(jié)點,也稱葉子結(jié)點。3線性結(jié)構(gòu)與非線性結(jié)構(gòu)如果一個數(shù)據(jù)元素都沒有,該數(shù)據(jù)結(jié)構(gòu)稱為空數(shù)據(jù)結(jié)構(gòu);在空數(shù)據(jù)結(jié)構(gòu)中插入一個新的元素后數(shù)據(jù)結(jié)構(gòu)變?yōu)榉强諗?shù)據(jù)結(jié)構(gòu);將數(shù)據(jù)結(jié)構(gòu)中的所有元素均刪除,則該數(shù)據(jù)結(jié)構(gòu)變成空數(shù)據(jù)結(jié)構(gòu)。如果一個非空的數(shù)據(jù)結(jié)構(gòu)滿足如下條件,則該數(shù)據(jù)結(jié)構(gòu)為線性結(jié)構(gòu):有且只有一個根結(jié)點每一個結(jié)點最多只有一個前件,也最多只有一個后件線性結(jié)構(gòu)又稱線性表。注意:在線性結(jié)構(gòu)表中插入或刪除元素,該線性表仍然應(yīng)滿足線性結(jié)構(gòu)。如果一個數(shù)據(jù)結(jié)構(gòu)不滿足線性結(jié)構(gòu),則稱為非線性結(jié)構(gòu)。(三)線性表及其順序存儲結(jié)構(gòu)1基本概念線性表是最常用的數(shù)據(jù)結(jié)構(gòu),它由一組數(shù)據(jù)元素組成。注意:這里的數(shù)據(jù)元素是一個廣義的
11、數(shù)據(jù)元素,并不僅僅是指一個數(shù)據(jù)。如,矩陣、學(xué)生記錄表等。非空線性表的結(jié)構(gòu)特征:有且只有一個根結(jié)點,它無前件有且只有一個終端結(jié)點,它無后件除根結(jié)點和終端結(jié)點之外,所有的結(jié)點有且只有一個前件和一個后件。線性表中結(jié)點的個數(shù)稱為結(jié)點的長度n。當(dāng)n=0時,稱為空表。2順序存儲結(jié)構(gòu)順序存儲結(jié)構(gòu)的特點:線性表中所有的元素所占的存儲空間是連續(xù)的線性表中各數(shù)據(jù)元素在存儲空間中是按邏輯順序依次存放的通常,順序存儲結(jié)構(gòu)中,線性表中每一個數(shù)據(jù)元素在計算機(jī)存儲空間中的存儲地址由該元素在線性表中的位置序號唯一確定。線性表的順序存儲結(jié)構(gòu)下的基本運算:在指定位置插入一個元素刪除線性表中的指定元素查找某個或某些特定的元素線性表
12、的排序按要求將一個線性表拆分為多個線性表將多個線性表合并為一個線性表復(fù)制線性表逆轉(zhuǎn)一個線性表3線性表的基本操作1)順序表的插入運算在順序存儲結(jié)構(gòu)的線性表中插入一個元素。注意:找到插入位置后,將插入位置開始的所有元素從最后一個元素開始順序后移。另外,在定義線性表時,一定要定義足夠的空間,否則,將不允許插入元素。2)順序表的刪除運算在順序在存儲結(jié)構(gòu)的線性表中刪除一個元素。注意:找到刪除的數(shù)據(jù)元素后,從該元素位置開始,將后面的元素一一向前移動,在移動完成后,線性表的長度減1(四)棧和隊列1棧及其基本運算1)棧棧是一種特殊的線性表,它是限定在一端進(jìn)行插入和刪除的線性表。它的插入和刪除只能在表的一端進(jìn)行
13、,而另一端是封閉的,不允許進(jìn)行插入和刪除操作。在棧中,允許插入和刪除操作一端稱為棧頂,不允許插入和刪除操作的一端則稱為棧底。棧頂?shù)脑乜偸亲詈蟊徊迦氲脑?,也是最先被刪除的元素。它遵循的原則是:先進(jìn)后出或后進(jìn)先出。堆棧指針總是指向棧頂元素的。2)棧的順序存儲及其運算在棧的順序存儲空間S(1:m)中,S(bottom)通常為棧底元素,S(top)為棧頂元素。Top=0表示???;top=m表示棧滿。1)入棧運算即在棧的頂部插入一個新元素。操作方式是:將棧頂指針加1,再將元素插入至指針?biāo)傅奈恢谩?)退棧運算退棧運算即將棧頂元素取出并賦給一個指定的變量。操作方式是:先將棧頂元素賦給指定的變量,再將棧
14、頂指針減1。3)讀棧頂元素將棧頂元素賦給某一指定變量,但棧頂指針不變。2隊列及其基本運算1)隊列隊列即是允許在一端進(jìn)行插入,而在另一端進(jìn)行刪除的線性表。允許插入的一端稱為隊尾,通常用一個尾指針指向隊尾;允許刪除的一端稱為隊首,通常用一個隊首指針指向排隊元素的前一個位置。隊列遵循的規(guī)則是:先進(jìn)先出或后進(jìn)后出2)循環(huán)隊列及其運算隊列的順序存儲結(jié)構(gòu)一般采用循環(huán)隊列的形式。循環(huán)隊列,即是次隊列存儲空間的最后一個位置繞到第一個位置,形成邏輯上的環(huán)狀空間,供隊列循環(huán)使用。在循環(huán)隊列中,用隊尾指針rear指向隊列中的隊尾元素,用排頭指針front指向排頭元素的前一個位置,因此,從排頭指針front指向的后一
15、個位置到隊尾指針rear指向的位置之間所有的元素均為隊列中的元素。循環(huán)隊列的初始狀態(tài)為空,即rear=front=m。這里m即為隊列的存儲空間。循環(huán)隊列的基本運算:入隊運算和退隊運算。入隊運算:每進(jìn)行一次入隊運算,隊尾指針加1。當(dāng)隊尾指針rear=m+1時,即表示隊列空間的尾部已經(jīng)放置了元素,則下一個元素應(yīng)該旋轉(zhuǎn)到隊列空間的首部,即rear=1退隊運算:每退隊一個元素,排頭指針加1。當(dāng)排頭指針front=m+1時,即排頭指針指向隊列空間的尾部,退隊后,排頭指針指向隊列空間的開始,即front=1。在隊列操作時,循環(huán)隊列滿時,front=rear,隊列空時,也有rear=front,即在隊列空或
16、滿時,排頭指針和隊尾指針均指向同一個位置。要判斷隊列空或滿時,還應(yīng)增加一個標(biāo)志,s值的定義:判斷隊列空與隊列滿的條件下:隊列空的條件:s=0隊列滿的條件:s=1、front=rear(1)入隊運算即在隊尾加入一個新元素。這個運算有兩個基本操作:首先,將隊尾指針加1,即rear=rear+1,當(dāng)rear=m+1時,置rear=1,然后,將新元素插入到隊尾指針指向的位置。當(dāng)循環(huán)隊列非空(s=1),且front=rear時,隊列滿,不能進(jìn)行入隊操作。此情況稱“上溢”。(2)退隊操作即將隊首的元素賦給一個指定的變量。該運算也有兩個基本操作:首先,將排頭指針加1,即front=front+1,當(dāng)fron
17、t=m+1時,置front=1,然后,將排頭指針指向的元素賦給指定的變量。當(dāng)循環(huán)隊列為空(s=0)時,不能進(jìn)行退隊運算。此種情況稱為“下溢”。(五)線性鏈表1基本概念前面的線性表均是采用順序存儲結(jié)構(gòu)及在順序存儲結(jié)構(gòu)下的運算。1)順序存儲的優(yōu)點:結(jié)構(gòu)簡單運算方便2)順序存儲結(jié)構(gòu)的缺點:要在順序存儲的線性表中插入一個新元素或刪除一個元素時,為了保證插入或刪除后的線性表仍然為順序存儲。在插入或刪除元素時,需要移動大量的數(shù)據(jù)元素,因此運算效率較低。如果一個線性表分配順序存儲空間后,如果出現(xiàn)線性表的存儲空間已滿,但還需要插入元素時,會發(fā)生“上溢”錯誤。在實際應(yīng)用時,可能有多個線性表同時使用存儲空間,這樣
18、給存儲空間的分配帶來問題,有可能使有的隊列空間不夠或過多造成浪費。基于上述情況,對于大的線性表或元素變動頻繁的大線性表不宜采用順序存儲結(jié)構(gòu),而應(yīng)采用鏈?zhǔn)酱鎯Y(jié)構(gòu)。3)鏈?zhǔn)酱鎯Y(jié)構(gòu)假設(shè)每一個數(shù)據(jù)結(jié)點對應(yīng)一個存儲單元,該存儲單元稱為存儲結(jié)點,簡稱結(jié)點。在鏈?zhǔn)酱鎯Ψ绞街?,要求每一個結(jié)點由兩部分組成:一部分用于存放數(shù)據(jù)元素,你為數(shù)據(jù)域;另一部分用于存放指針,稱為指針域。該指針用于指向該結(jié)點的前一個或后一個結(jié)點。在鏈?zhǔn)酱鎯Y(jié)構(gòu)中,存儲數(shù)據(jù)結(jié)構(gòu)的存儲空間可以不連續(xù),各數(shù)據(jù)結(jié)點的存儲順序與數(shù)據(jù)元素之間的邏輯關(guān)系不一致,而數(shù)據(jù)元素之間的邏輯關(guān)系是由指針域來確定的。鏈?zhǔn)酱鎯Y(jié)構(gòu)既可以用于線性結(jié)構(gòu),也可用于非線性
19、結(jié)構(gòu)。4)線性鏈表線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)稱為線性鏈表。將存儲空間劃分成若干的小塊,每塊占用若干個字節(jié),這些小塊稱為存儲結(jié)點。將存儲結(jié)點分為兩個部分,一部分用于存儲數(shù)據(jù)元素的值,稱為數(shù)據(jù)域;另一部分用于存儲元素之間的前后件關(guān)系,即存放下一個元素在存儲序號(即存儲地址),即指向后件結(jié)點,稱為指針域。在線性鏈表中用一個專門的指針HEAD指向線性鏈表中第一個數(shù)據(jù)元素的結(jié)點(即存放第一個元素的地址)。線性表中最后一個元素沒有后件,因此,線性鏈表中的最后一個結(jié)點的指針域為空(用Null或0表示),表示鏈終結(jié)。在線性鏈表中,各元素的存儲序號是不連續(xù)的,元素間的前后件關(guān)系與位置關(guān)系也是不一致的。在線性鏈表中,前
20、后件的關(guān)系依靠各結(jié)點的指針來指示,指向表的第一個元素的指針HEAD稱為頭指針,當(dāng)HEAD=NULL時,表示該鏈表為空。對于線性鏈表,可以從頭指針開始,沿著各結(jié)點的指針掃描到鏈表中的所有結(jié)點。這種線性鏈表稱為線性單鏈表,即可以從表頭開始向后掃描鏈表中的所有結(jié)點,而不能從中間或表尾結(jié)點向前掃描位于該結(jié)點之前的元素。這種鏈表結(jié)構(gòu)的缺點是不能任意地對鏈表中的元素按下同的方向進(jìn)行掃描。在某些應(yīng)用時,如果對鏈表中的元素設(shè)置兩個指針域,一個為指向前件的指針域,稱為左指針(LLink),一個為指向后件的指針域,稱為右指針(RLink)。則這種鏈表是雙向鏈表。5)帶鏈的棧帶鏈的棧即是用來收集計算機(jī)存儲空間中的所
21、有空閑的存儲結(jié)點,這種帶鏈的棧稱為可利用棧。當(dāng)需要存儲結(jié)點時,即從可利用的棧的頂部取出棧頂結(jié)點;當(dāng)系統(tǒng)要釋放一個存儲結(jié)點時,將該結(jié)點空間放回到可利用棧的棧頂。即在計算機(jī)中所有空閑的空間,均可以以結(jié)點的方式鏈接到可利用棧中,隨著其他線性鏈表中結(jié)點的插入與刪除,可利用棧處于動態(tài)變化之中,即可利用棧經(jīng)常要進(jìn)行退棧和入棧操作。6)帶鏈的隊列隊列也是線性表,也可利用鏈?zhǔn)酱鎯Y(jié)構(gòu)來進(jìn)行保存。2線性鏈表的基本運算線性鏈表包括的基本運算:在鏈表中包含指定元素的結(jié)點之前插入一個新元素在鏈表中刪除包含指定元素的結(jié)點將兩個線性鏈表按要求合并成一個線性鏈表將一個線性鏈表按要求進(jìn)行分解逆轉(zhuǎn)線性鏈表復(fù)制線性鏈表線性鏈表的
22、排序線性鏈表的查找1)線性鏈表中查找指定的元素在線性鏈表中查找元素X:從頭指針指向的結(jié)點開始往后沿指針進(jìn)行掃描,直到后面已沒有結(jié)點或下一個結(jié)點的數(shù)據(jù)域為X為止。元素的查找,經(jīng)常是為了進(jìn)行插入或刪除操作而進(jìn)行的,因此,在查找時,往往是需要記錄下該結(jié)點的前一個結(jié)點。2)線性鏈表的插入線性鏈表的插入即在鏈?zhǔn)酱鎯Y(jié)構(gòu)的線性表中插入一個新元素。在線性鏈表中包含元素x的結(jié)點之前插入新元素b,插入過程:(1)從可利用棧中取得一個結(jié)點,設(shè)該結(jié)點號為p,即取得的結(jié)點的存儲序號存放在變量p中。并置結(jié)點p的數(shù)據(jù)域為插入的元素值b。(2)在線性鏈表中尋找包含元素x的前一個結(jié)點,該結(jié)點的存儲序號為q。(3)將結(jié)點p插入
23、到結(jié)點q之后。具體的操作:首先,使結(jié)點p插入到結(jié)點q之后(即結(jié)點q的后件結(jié)點),然后,使結(jié)點q的指針域 內(nèi)容改為指向結(jié)點p。線性鏈表的插入操作,新結(jié)點是為來自于可利用棧,因此不會造成線性表的溢出。同樣,由于可利用??杀欢鄠€線性表利用,因此,不會造成存儲空間的浪費,大家動態(tài)地共同使用存儲空間。3)線性鏈表的刪除線性鏈表的刪除,即是在鏈?zhǔn)酱鎯Y(jié)構(gòu)下的線性表中刪除指定元素的結(jié)點。操作方式:(1)在線性表中找到包含指定元素x的前一個結(jié)點p(2)將該結(jié)點p后的包含元素x的結(jié)點從線性鏈表中刪除,然后將被刪除結(jié)點的后一個結(jié)點q的地址提供給結(jié)點p的指針域,即將結(jié)點p指向結(jié)點q。(3)將刪除的結(jié)點送回可利用棧。
24、從以上的刪除操作可見,刪除一個指定的元素,不需要移動其他的元素即可實現(xiàn),這是順序存儲的線性表所不能實現(xiàn)的。同時,此操作還可更有效地利用計算機(jī)的存儲空間。3循環(huán)鏈表及其基本操作在線性鏈表中,雖然對數(shù)據(jù)元素的插入和刪除操作比較簡單,但由于它對第一個結(jié)點和空表需要單獨處理,使得空表與非空表的處理不一致。循環(huán)鏈表,即是采用另一種鏈接方式,它的特點如下:(1)在循環(huán)鏈表中增加一個表頭結(jié)點,其數(shù)據(jù)域為任意或根據(jù)需要來設(shè)置,指針域指向線性表的第一個元素的結(jié)點。循環(huán)鏈表的頭指針指向表頭結(jié)點。(2)循環(huán)鏈表中最后一個結(jié)點的指針域不是空的,而是指向表頭結(jié)點。在循環(huán)鏈表中,所有結(jié)點的指針構(gòu)成一個環(huán)狀鏈。在循環(huán)鏈表中
25、,只要指出表中任何一個結(jié)點的位置,均可以從它開始掃描到所有的結(jié)點,而線性鏈表做不到,線性鏈表是一種單向的鏈表,只能按照指針的方向進(jìn)行掃描。循環(huán)鏈表中設(shè)置了一個表頭結(jié)點,因此,在任何時候都至少有一個結(jié)點,因此空表與非空表的運算相統(tǒng)一。(六)樹與二叉樹1樹的基本概念樹是一種簡單的非線性結(jié)構(gòu)。在樹結(jié)構(gòu)中,數(shù)據(jù)元素之間有著明顯的層次結(jié)構(gòu)。在樹的圖形表示中,用直線連接兩端的結(jié)點,上端點為前件,下端點為后件。在樹結(jié)構(gòu)中,每一個結(jié)點只有一個前件,稱為父結(jié)點。如A即為結(jié)點B、C、D的父結(jié)點。沒有父結(jié)點的結(jié)點只有一個,稱為根結(jié)點。如上圖所示,結(jié)點A即為根結(jié)點。每一個結(jié)點可以有多個后件,它們均稱為該結(jié)點的子結(jié)點。
26、如結(jié)點G、H、I是結(jié)點D的子結(jié)點。沒有后件的結(jié)點,稱為葉子結(jié)點。上圖中,葉子結(jié)點有:J、M、N、L、C、G、H、I。在樹結(jié)構(gòu)中,一個結(jié)點所擁有的后件結(jié)點個數(shù)稱為該結(jié)點的度。例如,結(jié)點D的度為3,結(jié)點E的度為1等,按此原則,所有葉子結(jié)點的度均為0。在樹中,所有結(jié)點中最大的度稱為該樹的度。上圖所示的樹中,所有結(jié)點中最大的度是3,所以該樹的度為3。樹分層,根結(jié)點為第一層,往下依次類推。同一層結(jié)點的所有子結(jié)點均在下一層。如上圖:A結(jié)點在第1層,B、C、D結(jié)點在第2層;E、F、G、H、I在第3層;J、K、L在第4層;M、N在第5層。樹的最大層次稱為樹的深度。上圖樹的深度為5。在樹中,某結(jié)點的一個子結(jié)點為
27、根構(gòu)成的樹稱作該結(jié)點的子樹。葉子結(jié)點沒有子樹。在計算機(jī)中,可以用樹來表示算術(shù)表達(dá)式。原則如下:(1)表達(dá)式中每一個運算符在樹中對應(yīng)一個結(jié)點,稱為運算符結(jié)點(2)運算符的每一個運算對象在樹中為該運算符結(jié)點的子樹(在樹中的順序為從左到右)(3)運算對象中的單變量均為葉子結(jié)點樹在計算機(jī)中用多重鏈表表示。多重鏈表中的每個結(jié)點描述了樹中對應(yīng)結(jié)點的信息,而每個結(jié)點中的鏈域(即指針域)個數(shù)將隨著樹中該結(jié)點的度而定義。如果在樹中,每一個結(jié)點的子結(jié)點的個數(shù)不相同,因此在多重鏈中各結(jié)點的鏈域個數(shù)也不相同,會導(dǎo)致算法太復(fù)雜。因此,在樹中,常采用定長結(jié)點來表示樹中的每一個結(jié)點,即取樹的度作為每個結(jié)點的鏈域的個數(shù)。這樣
28、,管理相對簡化了,但會造成空間的浪費,因為有許多的結(jié)點存在空鏈域。2二叉樹及其基本性質(zhì)1)二叉樹的定義二叉樹的特點:非空二叉樹只有一個根結(jié)點每一個結(jié)點最多只有兩個子結(jié)點,且結(jié)點分左右。則一個結(jié)點最多可以有兩棵子樹,分別稱為左子樹和右子樹在二叉樹中,每一個結(jié)點的度最大為2,即二叉樹的度為2。在二叉樹中,任何的子樹也均為二叉樹。在二叉樹中,每一個結(jié)點的子樹被分為左子樹和右子樹。在二叉樹中,允許某一個結(jié)點只有左子樹或只有右子樹。如果一個結(jié)點既沒有左子樹,也沒有右子樹,則該結(jié)點為葉子結(jié)點。2)二叉樹的性質(zhì)性質(zhì)1:在二叉樹的第k層上,最多有2k-1(k1)個結(jié)點。性質(zhì)2:深度為m的二叉樹最多有2m-1個
29、結(jié)點。性質(zhì)3:在任意一棵二叉樹中,度為0的結(jié)點(即葉子結(jié)點)總比度為2的結(jié)點多一個。性質(zhì)4:具有n個結(jié)點的二叉樹,其深度至少為log2n+1,其中l(wèi)og2n表示log2n的整數(shù)部分。3)滿二叉樹與完全二叉樹(1)滿二叉樹滿二叉樹的特點:除最后一層外,每一層上的所有結(jié)點都有兩個子結(jié)點。即在滿二叉樹中,每一層上的結(jié)點數(shù)都達(dá)到最大值,即在滿二叉樹上的第k層上有2k-1個結(jié)點。如下即為一棵滿二叉樹。(2)完全二叉樹特點:除最后一層外,每一層上的結(jié)點數(shù)均達(dá)到最大值,在最后一層上只缺少右邊的若干個結(jié)點。即如果從根結(jié)點開始,對二叉樹的結(jié)點自上而下、自左而右用自然數(shù)進(jìn)行連續(xù)編號,則深度為m、且有n個結(jié)點的二叉
30、樹,當(dāng)且僅當(dāng)其每一個結(jié)點都與深度為m的滿二叉樹中編號從1到n的結(jié)點一一對應(yīng),則是完全二叉樹。對于完全二叉樹,葉子結(jié)點只能在層次最大的兩層中出現(xiàn);對于任何一個結(jié)點,若其右分支下的子樹結(jié)點的最大層次為p,則其分支下的子孫結(jié)點的最大層次為p或p+1。完全二叉樹具有的性質(zhì):性質(zhì)5:具有n個結(jié)點的完全二叉樹的深度為log2n+1性質(zhì)6:設(shè)完全二叉樹共有n個結(jié)點。如果從根結(jié)點開始,按層次(每一層從左到右)用自然數(shù)1、2、n給結(jié)點編號,對于編號為k(k=1,2,n)的結(jié)點有如下結(jié)論: 若k=1,則該結(jié)點為根結(jié)點,它沒有父結(jié)點;若k1,則該結(jié)點的父結(jié)點編號為INT(k/2)。 若2kn,則編號為k的結(jié)點的左子
31、結(jié)點編號為2k;否則該結(jié)點無左子結(jié)點(當(dāng)然也沒有右子結(jié)點) 若2k+1n,則編號為k的結(jié)點的右子結(jié)點編號為2k+1;否則該結(jié)點無右子結(jié)點。3二叉樹的存儲結(jié)構(gòu)二叉樹的存儲常采用鏈?zhǔn)酱鎯Y(jié)構(gòu)。存儲二叉樹中各元素的存儲結(jié)點由兩個部分組成:數(shù)據(jù)域和指針域。在二叉樹中,由于每個結(jié)點可有兩個子結(jié)點,則它的指針域有兩個:一個用于存儲該結(jié)點的左子結(jié)點的存儲地址,即稱為左指針域;一個用于存儲指向該結(jié)點的右子結(jié)點的存儲地址,稱為右指針域。存儲結(jié)構(gòu)如下:即二叉樹的存儲結(jié)構(gòu)中每一個存儲結(jié)點都有兩個指針域,因此,二叉樹的鏈?zhǔn)酱鎯Y(jié)構(gòu)也稱為二叉樹的鏈表。在二叉樹在存儲中,用一個頭指針指向二叉樹的根結(jié)點的存儲地址。如圖所示
32、的二叉樹:如果我們將該二叉樹的所有結(jié)點順序編號,順序存放在存儲空間里,則它們在內(nèi)存空間中的存放方式是:當(dāng)然,對于滿二叉樹或完全二叉樹而言,也可采用順序存儲的方式,但順序存儲的方式不適合其他的二叉樹。4二叉樹的遍歷二叉樹的遍歷即是不重復(fù)地訪問二叉樹的所有結(jié)點。在遍歷二叉樹時,一般先遍歷左子樹,然后再遍歷右子樹。在先左后右的原則下,二叉樹的遍歷又可分為三種:前序遍歷、中序遍歷和后序遍歷。1)前序遍歷前序遍歷即先訪問根結(jié)點,然后遍歷左子樹,最后遍歷右子樹。在遍歷左子樹和遍歷右子樹時,依然是先遍歷根結(jié)點,然后是左子樹,再是右子樹。操作的具體方式:若二叉樹為空,則結(jié)束返回。否則:訪問根結(jié)點前序遍歷左子樹
33、前序遍歷右子樹如上圖所示的完全二叉樹,它的前序遍歷結(jié)果是:A、B、D、H、P、Q、I、R、E、J、K、C、F、L、M、G、N、O2)中序遍歷中序遍歷,即先遍歷左子樹,然后訪問根結(jié)點,最后是遍歷右子樹。具體的操作方式:若二叉樹為空,則結(jié)束返回。否則:中序遍歷左子樹訪問根結(jié)點 中序遍歷右子樹這里強(qiáng)調(diào),在遍歷左子樹和右子樹時,仍然要采用中序遍歷的方法。如上圖所示的完全二叉樹,它的中序遍歷結(jié)果是:P、H、Q、D、R、I、B、J、E、K、A、L、F、M、C、N、G、O3)后序遍歷后序遍歷,即選遍歷左子樹,然后是遍歷右子樹,最后訪問根結(jié)點。具體的操作方式:若二叉樹為空,則結(jié)束返回。否則:前序遍歷左子樹前序
34、遍歷右子樹訪問根結(jié)點如上圖所示的完全二叉樹,它的后序遍歷結(jié)果是:P、Q、H、R、I、D、J、K、E、B、L、M、F、N、O、G、C、A(七)查找技術(shù)查找即是指在一個給定的數(shù)據(jù)結(jié)構(gòu)中查找某個指定的元素。1順序查找順序查找又稱順序搜索。一般是在線性表中查找指定的元素?;静僮鞣椒ㄊ牵簭木€性表的第一個元素開始,與被查元素進(jìn)行比較,相等則查找成功,否則繼續(xù)向后查找。如果所有的元素均查找完畢后都不相等,則該元素在指定的線性表中不存在。順序查找的最好情況:要查找的元素在線性表的第一個元素,則查找效率最高;如果要查找的元素在線性表的最后或根本不存在,則查找需要搜索所有的線性表元素,這種情況是最差情況。對于線
35、性表而言,順序查找效率很低。但對于以下的線性表,也只能采用順序查找的方法:線性表為無序表,即表中的元素沒有排列不是按大小順序進(jìn)行排列的,這類線性表不管它的存儲方式是順序存儲還是鏈?zhǔn)酱鎯?,都只能按順序查找方式進(jìn)行查找即使是有序線性表,如果采用鏈?zhǔn)酱鎯?,也只能采用順序查找方式例如,現(xiàn)有線性表:7、2、1、5、9、4,要在序列中查找元素6,查找的過程是:整個線性表的長度為5查找計次n=1,將元素6與序列的第一個7元素進(jìn)行比較,不等,繼續(xù)查找n=2,將6與第二個元素2進(jìn)行比較,不等,繼續(xù)n=3,將6與第三個元素1進(jìn)行比較,不等,繼續(xù)n=4,將6與第四個元素5進(jìn)行比較,不等,繼續(xù)n=5,將6與第五個元素
36、9進(jìn)行比較,不等,繼續(xù)n=6,將6與第六個元素4進(jìn)行比較,不等,繼續(xù)n=7,超出線性表的長度,查找結(jié)束,則該表中不存在要查找的元素。2二分查找二分查找只適用于順序存儲的有序表。此處所述的有序表是指線性中的元素按值非遞減排列(即由小到大,但允許相鄰元素值相等)。二分查找的方法如下:將要查找的元素與有序序列的中間元素進(jìn)行比較:如果該元素比中間元素大,則繼續(xù)在線性表的后半部分(中間項以后的部分)進(jìn)行查找如果要查找的元素的值比中間元素的值小,則繼續(xù)在線性表的前半部分(中間項以前的部分)進(jìn)行查找這個查找過程一直按相同的順序進(jìn)行下去,一直到查找成功或子表長度為0(說明線性表中沒有要查找的元素)有序線性表的
37、二分法查找,條件是必須這個有序線性表的存儲方式是順序存儲的。它的查找效率比順序查找要高得多,它的最壞情況的查找次數(shù)是log2n次,而順序查找的最壞情況的查找次數(shù)是n次。當(dāng)然,二分查找的方法也支持順序存儲的遞減序列的線性表。有非遞減有序線性表:1、2、4、5、7、9,要查找元素6。查找的方法是:序列長度為n=6,中間元素的序號m=(n+1)/2=3查找計次k=1,將元素6與中間元素即元素4進(jìn)行比較,不等,64查找計次k=2,查找繼續(xù)在后半部分進(jìn)行,后半部分子表的長度為3,計算中間元素的序號:m=3+(3+1)/2=5,將元素與后半部分的中間項進(jìn)行比較,即第5個元素中的7進(jìn)行比較,不等,67查找計
38、次k=3,繼續(xù)查找在后半部分序列的前半部分子序列中查找,子表長度為1,則中間項序號即為m=3+(1+1)/2=4,即與第4個元素5進(jìn)行比較,不相等,繼續(xù)查找的子表長度為0,則查找結(jié)束(八)排序技術(shù)排序即是將一個無序的序列整理成按值非遞減順序排列的有序序列。在這里,我們討論的是順序存儲的線性表的排序操作。1交換類排序法交換類排序法,即是借助于數(shù)據(jù)元素之間的互相交換進(jìn)行排序的方法。1)冒泡排序法冒泡排序法即是利用相鄰數(shù)據(jù)元素之間的交換逐步將線性表變成有序序列的操作方法。操作過程如下:從表頭開始掃描線性表,在掃描過程中逐次比較相鄰兩個元素的大小,若相鄰兩個元素中前一個元素的值比后一個元素的值大,將兩
39、個元素位置進(jìn)行交換,當(dāng)掃描完成一遍時,則序列中最大的元素被放置到序列的最后。再繼續(xù)對序列從頭進(jìn)行掃描,這一次掃描的長度是序列長度減1,因為最大的元素已經(jīng)就位了,采用與前相同的方法,兩兩之間進(jìn)行比較,將次大數(shù)移到子序列的末尾。按相同的方法繼續(xù)掃描,每次掃描的子序列的長度均比上一次減1,直至子序列的長度為1時,排序結(jié)束。例如,有序列5、2、9、4、1、7、6,將該序列從小到大進(jìn)行排列。采用冒泡排序法,具體操作步驟如下:序列長度n=7掃描的次數(shù),最多需要掃描n-1次,如果序列已經(jīng)就位,則掃描結(jié)束。測試是否已經(jīng)就位,可設(shè)置一個標(biāo)志,如果該次掃描沒有數(shù)據(jù)交換,則說明數(shù)據(jù)排序結(jié)束。2)快速排序法冒泡排序方法每次交換只能改變相鄰兩個元素之間的逆序,速度相對較慢。如果將兩個不相鄰的元素之間進(jìn)行交換,可以消除多個逆序??焖倥判虻姆椒ㄊ牵簭木€性表中選取一個元素,設(shè)為T,將線性表后面小于T的元素移到前面,而前面大于T的元素移到后面,結(jié)果將線性表分成兩個部分(稱為兩個子表),T插入到其分界線的位置處,這個過程稱為線性表的分割。對過對線性表的一次分割,就以T為分界線,將線性表分成前后兩個子表,且前面子表中的所有元素均
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 質(zhì)量檢測合同模板
- 2024年度平房區(qū)環(huán)境整治:建筑施工合同范本
- 開發(fā)商授權(quán)拆遷補(bǔ)償合同
- 2024年住家保姆工作協(xié)議
- 勞務(wù)協(xié)議書樣式
- 簡單工程承包協(xié)議范例
- 2024標(biāo)準(zhǔn)臨時用工合同樣本
- 2024年蘇州市租房合同范本
- 拼車服務(wù)協(xié)議示例
- 2024中介的買賣合同書范文
- 初中語文人教七年級上冊要拿我當(dāng)一挺機(jī)關(guān)槍使用
- 北京頌歌原版五線譜鋼琴譜正譜樂譜
- 病史采集和臨床檢查方法
- PSUR模板僅供參考
- 火力發(fā)電企業(yè)作業(yè)活動風(fēng)險分級管控清單(參考)
- 民法典合同編之保證合同實務(wù)解讀PPT
- 全國第四輪學(xué)科評估PPT幻燈片課件(PPT 24頁)
- 大氣污染控制工程課程設(shè)計-某廠酸洗硫酸煙霧治理設(shè)施設(shè)計
- 名牌包包網(wǎng)紅主播電商直播帶貨話術(shù)腳本
- 高考語文作文素材人物速遞——蘇炳添課件18張
- 蛋雞養(yǎng)殖場管理制度管理辦法
評論
0/150
提交評論