![自考02331數(shù)據(jù)結構重點總結(最終修訂)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/1/a246c2ff-f4d1-40ee-938d-214ac798c9a3/a246c2ff-f4d1-40ee-938d-214ac798c9a31.gif)
![自考02331數(shù)據(jù)結構重點總結(最終修訂)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/1/a246c2ff-f4d1-40ee-938d-214ac798c9a3/a246c2ff-f4d1-40ee-938d-214ac798c9a32.gif)
![自考02331數(shù)據(jù)結構重點總結(最終修訂)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/1/a246c2ff-f4d1-40ee-938d-214ac798c9a3/a246c2ff-f4d1-40ee-938d-214ac798c9a33.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、自考 02331 數(shù)據(jù)結構重點總結 ( 最終修訂 )第一章 概論1. 瑞士計算機科學家沃思提出:算法 +數(shù)據(jù)結構 =程序。算法是對數(shù)據(jù)運算的描述,而數(shù)據(jù)結構包括邏輯結構和存儲 結構。由此可見,程序設計的實質是針對實際問題選擇一種好的數(shù)據(jù)結構和設計一個好的算法,而好的算法在很大 程度上取決于描述實際問題的數(shù)據(jù)結構。2. 數(shù)據(jù) 是信息的載體。 數(shù)據(jù)元素 是數(shù)據(jù)的根本單位。一個數(shù)據(jù)元素可以由假設干個數(shù)據(jù)項 組成, 數(shù)據(jù)項 是具有獨立含義的最小標識單位。 數(shù)據(jù)對象 是具有相同性質的數(shù)據(jù)元素的集合。3. 數(shù)據(jù)結構 指的是數(shù)據(jù)元素之間的相互關系,即數(shù)據(jù)的組織形式。 數(shù)據(jù)結構一般包括以下三方面內容:數(shù)據(jù)的邏
2、輯結構、數(shù)據(jù)的存儲結構、數(shù)據(jù)的運算 數(shù)據(jù)的邏輯結構是從邏輯關系上描述數(shù)據(jù),與數(shù)據(jù)元素的存儲結構無關,是獨立于計算機的。 數(shù)據(jù)的邏輯結構分類 : 線性結構和非線性結構。線性表 是一個典型的線性結構。棧、隊列、串等都是線性結構。數(shù)組、廣義表、樹和圖等數(shù)據(jù)結構都是非線性結構。 數(shù)據(jù)元素及其關系在計算機內的存儲方式,稱為數(shù)據(jù)的存儲結構(物理結構)。數(shù)據(jù)的存儲結構是邏輯結構用計算機語言的實現(xiàn),它依賴于計算機語言。 數(shù)據(jù)的運算 。最常用的檢索、插入、刪除、更新、排序等。4. 數(shù)據(jù)的四種根本存儲方法 : 順序存儲、鏈接存儲、索引存儲、散列存儲( 1 )( 2 )( 3 ) ( 4 )順序存儲 鏈接存儲 索引
3、存儲 散列存儲通常借助程序設計語言的 數(shù)組 描述。 通常借助于程序語言的指針來描述。 索引表由假設干索引項組成。關鍵字是能唯一標識一個元素的一個或多個數(shù)據(jù)項的組合。 該方法的根本思想是:根據(jù)元素的關鍵字直接計算出該元素的存儲地址。5 個準那么: 輸入 , 0 個或多個數(shù)據(jù)作為輸入; 輸出 ,產(chǎn)生一個或多個輸出; 有窮性 ,算法執(zhí)行有限 可行性 ,算法是可行的。5. 算法必須滿足 步后結束; 確定性 ,每一條指令的含義都明確;算法與程序的區(qū)別:程序必須依賴于計算機程序語言,而一個算法可用自然語言、計算機程序語言、數(shù)學語言或約定的符號語言來描述。目前常用的描述算法語言有兩類:類Pascal 和類
4、C。6. 評價算法的優(yōu)劣:算法的 "正確性 "是首先要考慮的。此外,主要考慮如下三點: 執(zhí)行算法所消耗的時間,即時間復雜性; 執(zhí)行算法所消耗的存儲空間,主要是輔助空間,即空間復雜性; 算法應易于理解、易于編程,易于調試等,即可讀性和可操作性。以上幾點最主要的是時間復雜性,時間復雜度常用漸進時間復雜度表示。7. 算法求解問題的 輸入量稱為問題的規(guī)模,用一個正整數(shù)n表示。8. 常見的時間復雜度按數(shù)量級遞增排列依次為: 常數(shù)階 0(1) 、對數(shù)階 0(log 2n) 、線性階 0(n) 、線性對數(shù)階 0(nlog 2n) 、 平方階0(n2)立方階0(n3)、k次方階0(nk)、
5、指數(shù)階0(2)和階乘階0(n!)。9. 一個算法的空間復雜度 S(n) 定義為該算法所消耗的存儲空間,它是問題規(guī)模 n 的函數(shù) , 它包括存儲算法本身所占 的存儲空間、算法的輸入輸出數(shù)據(jù)所占的存儲空間和算法在運行過程中臨時占用的存儲空間。第二章 線性表1. 數(shù)據(jù)的運算是定義在邏輯結構上的,而運算的具體實現(xiàn)是在存儲結構上進行的。2. 只要確定了線性表存儲的起始位置,線性表中任意一個元素都可隨機存取,所以順序表是一種隨機存取結構。3. 常見的線性表的根本運算 :(1) 置空表 InitList ( L) 構造一個空的線性表 L。 求表長ListLength ( L)求線性表L中的結點個數(shù),即求表長
6、。(3)GetNode ( L, i ) 取線性表 L 中的第 i 個元素。LocateNode ( L, x)在L中查找第一個值為x的元素,并返回該元素在L中的位置。假設L中沒有元素的值為 x ,那么返回 0 值。InsertList( L, i , x)在線性表L的第i個元素之前插入一個值為 x的新元素,表L的長度加1。(6)DeleteList( L, i )刪除線性表 L 的第 i 個元素,刪除后表 L 的長度減 1。4. 順序存儲方法:把線性表的數(shù)據(jù)元素按邏輯次序依次存放在一組地址連續(xù)的存儲單元里的方法。順序表( Sequential List ):用順序存儲方法存儲的線性表稱為順序
7、表。 順序表 是一種 隨機存取結構 , 順序表的特 點是邏輯上相鄰的結點其物理位置亦相鄰。順序表中結點 ai的存儲地址:LOC ( a) = LOC (a) + (i-1 ) *c Ki <n,5順序表上實現(xiàn)的根本運算:(1) 插入:該算法的平均時間復雜度是0(n),即在順序表上進行插入運算,平均要移動一半結點(n/2 )。在第i個位置插入一個結點的移動次數(shù)為n-i+1(2) 刪除:順序表上做刪除運算,平均要移動表中約一半的結點(n-1)/2,平均時間復雜度也是 0(n)。刪除第i個結點移動次數(shù)為n-i6. 采用鏈式存儲結構可以防止頻繁移動大量元素。一個單鏈表可由頭指針唯一確定,因此單鏈
8、表可以用頭指針的名 字來命名。 生成結點變量的標準函數(shù)p=( ListNode *)malloc(sizeof(ListNode) ; /函數(shù)malloc分配一個類型為 ListNode的結點變量的空間,并將其首地址放入指針變量p中 釋放結點變量空間的標準函數(shù)free(p) ; /釋放p所指的結點變量空間 結點分量的訪問方法二:p- > data和p- > next 指針變量p和結點變量*p的關系:指針變量p的值一一結點地址,結點變量*p的值一一結點內容7. 建立單鏈表:(1) 頭插法建表:算法:p=(ListNode *)malloc(sizeof(ListNode);/ 生成新
9、結點(2) 尾插法建表: 算法: p=(ListNode *)malloc(sizeof(ListNode);/ 生成新結點p->data=ch; II將讀入的數(shù)據(jù)放入新結點的數(shù)據(jù)域中if (head=NULL) head=p;/ 新結點插入空表else rear-next=p;/將新結點插到*r之后rear=p;/尾指針指向新表尾hmil(3) 尾插法建帶頭結點的單鏈表: 頭結點及作用:頭結點是在鏈表的開始結點之前附加一個結點。它具有兩個優(yōu)點:1由于開始結點的位置被存放在頭結點的指針域中,所以在鏈表的第一個位置上的操作就和在表的其它位置上操作一致,無須進行特殊處理;2無論鏈表是否為空,
10、其頭指針都是指向頭結點的非空指針(空表中頭結點的指針域空),因此空表和非空表的處理也就統(tǒng)一了。heiid 生站開檢絡點I I1卡II.P1 4 帀I,頭結點數(shù)據(jù)域的陰影表示該局部不存儲信息。 中可用于存放表長等附加信息。在有的應用PH I(M fflR希軋站點的單儺左具體算法:r=head;/尾指針初值也指向頭結點while(ch=getchar()!='n')s=(ListNode *)malloc(sizeof(ListNode);/生成新結點s->data=ch;/將讀入的數(shù)據(jù)放入新結點的數(shù)據(jù)域中r->n ext=s;r=s;r-> next=NULL;
11、 終端結點的指針域置空,或空表的頭結點指針域置空 以上三個算法的時間復雜度均為0(n)。8. 單鏈表上的查找:(帶頭結點)(1)按結點序號查找:序號為 0的是頭結點。算法:p=head;j=0;/ 從頭結點開始掃描順指針向后掃描,直到while(p-> next&&j<i)p=p->n ext;j+;if(i=j) return p; else return NULL;/p->next 為 NULL或 i=j 為止找到了第i個結點當i<0或i>0時,找不到第時間復雜度:在等概率假設下,平均時間復雜度為:為 (2 )按結點值查找:具體算法:Li
12、stNode *p=head-> next;/while(p&&p->data!=key)i個結點n/2=0( n)表非空,p初始值指向開始結點從開始結點比擬。直到p為NULL或p->data 為key為止p=p-> next;/掃描下一結點return p;/ 假設p=NULL那么查找失敗,否那么p指向值為key的結點時間復雜度為:O(n)9.插入運算:插入運算是將值為x的新結點插入到表的第i個結點的位置上,即插入到an與a之間。曲單璉喪上桶入昴點示總自s=(ListNode *)malloc(sizeof(ListNode); s->data=
13、x; s->n ext=p->n ext; p->n ext=s;算法的時間主要消耗在查找結點上,故時間復雜度亦為0(n)。10. 刪除運算r=p->next;/使r指向被刪除的結點 ai p->next=r->next;將ai從鏈上摘下free(r);/釋放結點ai的空間給存儲池算法的時間復雜度也是O(n) .p指向被刪除的前一個結點。鏈表上實現(xiàn)的插入和刪除運算,無須移動結點,僅需修改指針。11. 單循環(huán)鏈表一在單鏈表中,將終端結點的指針域NULL改為指向表頭結點或開始結點即可。判斷空鏈表的條件是head=head->n ext;12. 僅設尾指針的
14、單循環(huán)鏈表:用尾指針rear表示的單循環(huán)鏈表對開始結點a1和終端結點an查找時間都是 O(1)。而表的操作常常是在表的首尾位置上進行,因此,實用中多采用尾指針表示單循環(huán)鏈表。判斷空鏈表的條件為rear=rear- >n ext;僅訛甩抒訂的申忡(代農13. 循環(huán)鏈表:循環(huán)鏈表的特點是無須增加存儲量,僅對表的鏈接方式稍作改變,即可使得表處理更加方便靈活。假設 在尾指針表示的單循環(huán)鏈表上實現(xiàn),那么只需修改指針,無須遍歷,其執(zhí)行時間是O(1)。卜W訃H悩代怙押馥氓fl .:汕具體算法:LinkList Connect(LinkList A,LinkList B)/ 假設 A, B為非空循環(huán)鏈表
15、的尾指針LinkList p=A->next;/保存A表的頭結點位置A->n ext=B-> next-next;/B表的開始結點鏈接到 A表尾free(B->next);/釋放B表的頭結點B-> next=p;return B;/返回新循環(huán)鏈表的尾指針循環(huán)鏈表中沒有NULL指針。涉及遍歷操作時,其終止條件就不再是像非循環(huán)鏈表那樣判別p或p- > next是否為空,而是判別它們是否等于某一指定指針,如頭指針或尾指針等。在單鏈表中,從一結點出發(fā),只能訪問到該結點及其后續(xù)結點,無法找到該結點之前的其它結點。而在單 循環(huán)鏈表中,從任一結點出發(fā)都可訪問到表中所有結點
16、,這一優(yōu)點使某些運算在單循環(huán)鏈表上易于實現(xiàn)。14. 雙向鏈表:雙(向)鏈表中有兩條方向不同的鏈,即每個結點中除next域存放后繼結點地址外,還增加一個指向其直接刖趨的指針域prior。 雙鏈表由頭指針 head惟一確定的。 帶頭結點的雙鏈表的某些運算變得方便。 將頭結點和尾結點鏈接起來,為雙(向)循環(huán)鏈表。15. 雙向鏈表的前插和刪除本結點操作 雙鏈表的前插操作void DinsertBefore(DListNode *p,DataType x)/在帶頭結點的雙鏈表中,將值為 x的新結點插入*p之前,設pz NULLDListNode *s=malloc(sizeof(DListNode);s
17、->data=x;/ s->prior=p->prior;/ s->n ext=p;/p->prior- >n ext=s;/p->prior=s;/mI雙鏈表上刪除結點 *p自身的操作void DDeleteNode(DListNode *p)/在帶頭結點的雙鏈表中,刪除結點*p,設*p為非終端結點p->prior- >n ext=p->n ext;/p_>n ext->prior=p->prior;free(p); /data ilclI與單鏈表上的插入和刪除操作不同的是,在雙鏈表中插入和刪除必須同時修改兩個方向
18、上的指針。上述兩個算法的時間復雜度均為16.順序表和鏈表比擬0(1)。時間性能:a、線性表:經(jīng)常性的查找;b、鏈式存儲結構:經(jīng)常插入刪除操作;空間性能:a、對數(shù)據(jù)量大小事先能夠知道的用線性表;b、數(shù)據(jù)量變化較大的用鏈式存儲結構。存儲密度越大,存儲空間的利用率越高。顯然,順序表的存儲密度是1,鏈表的存儲密度肯定小于1。第三章棧和隊列1. 棧稱為后進先出Last In First Out的線性表,簡稱為 LIFO表。棧是運算受限的線性表,順序棧也是用數(shù)組表示的。進棧操作:進棧時,需要將 S- > top加1,S- > top=StackSize-1 表示棧滿 "上溢"
19、;現(xiàn)象-當棧滿時,再做進棧運算產(chǎn)生空間溢出的現(xiàn)象。Fitnekl 中有 4亍天幸5- iki (J)退棧操作:退棧時,需將 S- > top減1,S- >top<0表示空棧下溢現(xiàn)象-當棧空時,做退棧運算產(chǎn)生的 溢出現(xiàn)象。下溢是正常現(xiàn)象,常用作程序控制轉移的條件??諚r棧頂指針不能是0,只能是-1。兩個棧共享同一存儲空間:當程序中同時使用兩個棧時,可以將兩個棧的棧底分別設在順序存儲空間的兩端,讓兩個棧頂各自向中間延伸。當一個棧中的元素較多 而棧使用的空間超過共享空間的一半時,只要另一個棧的元素不多,那么前者就可以占用后者的局部存儲空間。當Top 1=Top2-1時,棧滿2. 為
20、了克服順序存儲分配固定空間所產(chǎn)生的溢出和空間浪費問題??刹捎面準酱鎯Y構來存儲棧。鏈棧是沒有附加頭結點的運算受限的單鏈表。棧頂指針就是鏈表的頭指針。順序隊列的根本操作鏈棧中的結點是動態(tài)分配的,所以可以不考慮上溢,無須定義StackFull 運算棧的一個重要應用是實現(xiàn)遞歸,直接調用自己或間接調用自己的函數(shù)。3. 隊列Queue是只允許在一端進行插入,而在另一端進行刪除 的運算受限的線性表。允許刪除的一端稱為隊頭Front ,允許插入的一端稱為 隊尾Rear,當隊列中沒有元素時稱為空隊列,隊列亦稱作先進先出First In First Out的線性表,簡稱為FIFO表。隊列的順序存儲結構稱為順序隊
21、列,順序隊列實際上是一個受限的線性表。 入隊時:將新元素插入 rear所指的位置,然后將 rear加1。 出隊時:刪去front所指的元素,然后將 front加1并返回被刪元素。當頭尾指針相等時,隊列為空。在非空隊列里,頭指針始終指向隊頭元素,而隊尾指針始終指向隊尾元素的下一位置。而棧頂指針指向棧頂元素。4. 循環(huán)隊列:為充分利用數(shù)組空間,克服上溢,可將數(shù)組空間想象為一個環(huán)狀空間,并稱這種環(huán)狀數(shù)組表示的隊列 為循環(huán)隊列。循環(huán)隊列中進行出隊、入隊操作時,頭尾指針仍要加1朝前移動。只不過當頭尾指針指向向量上界( QueueSize-1)時,其加1操作的結果是指向向量的下界0。這種循環(huán)意義下的加1操
22、作可以描述為: 方法一:if(i+1=QueueSize) i=0;/i表示 front 或 rearelse i+; 方法二-利用"模運算i=(i+1)%QueueSize ;循環(huán)隊列中,由于入隊時尾指針向前追趕頭指針;出隊時頭指針向前追趕尾指針,造成隊空和隊滿時頭尾指針均相等。因此,無法通過條件Q.front=Q.rear來判別隊列是"空還是滿。解決這個問題的方法至少有三種: 另設一個標志位以區(qū)別隊列是空還是滿; 設置一個計數(shù)器記錄隊列中元素的總數(shù)(即隊列長度)。 少用一個元素的空間。約定入隊前,測試尾指針在循環(huán)意義下加1后是否等于頭指針,假設相等那么認為隊列滿即尾指針
23、Q.rear所指的單元始終為空。5. 循環(huán)隊列的根本運算: 置隊空:Q->front=Q->rear=0; 判隊空:return Q->rear=Q->front; 判隊滿:return (Q->rear+1)%QueueSize=Q->front; 入隊 Q->dataQ->rear=x;/新元素插入隊尾Q->rear=(Q->rear+1)%QueueSize; 出隊 temp=Q->dataQ->front;Q->front=(Q->front+1)%QueueSize;/ 循環(huán)意義下的頭指針加1retu
24、rn temp; 取隊頭元素return Q->dataQ->fro nt;6. 隊列的鏈式存儲結構簡稱為鏈隊列。它是限制僅在表頭刪除和表尾插入的單鏈表。為了簡化處理,在隊頭結點之前附加一個頭結點,并設隊頭指針指向此結點。UHfroTl AQf如N |-H.卜H1H<b)那空盤列i.i :川小心計鏈隊列的根本運算:(帶頭結點)(1) 構造空隊:Q->rear=Q->front ; Q->rear->next=NULL;(2) 判隊空:return Q->rear=Q->fro nt;( 3 ) 入隊: QueueNode *p=(Queue
25、Node *)malloc(sizeof(QueueNode);/申請新結點p->data=x; p->next=NULL;Q->rear->next=p; /*p 鏈到原隊尾結點后 Q->rear=p; / 隊尾指針指向新的尾(4) 出隊:當隊列長度大于 1 時,只需修改頭結點指針,尾指針不變 s=Q->front->next; Q->front->next=s->next;x=s->data; free(s); return x; 當隊列長度等于 1 時,不僅要修改頭結點指針,還要修改尾指針 s=Q->front-&g
26、t;next; Q->front->next=NULL; Q->rear=Q->front;x=s->data; free(s); return x;( 5) 取隊頭元素: return Q->front->next->data;因為有頭結點,所以用了 next 和鏈棧類似,無須考慮判隊滿的運算及上溢。 在出隊算法中,一般只需修改隊頭指針。但當原隊中只有一個結點時,該結點既是隊頭也是隊尾,故刪去此結點 時亦需修改尾指針,且刪去此結點后隊列變空。7. 用計算機來處理計算算術表達式問題,首先要解決的問題是如何將人們習慣書寫的中綴表達式轉換成后綴表達式
27、。第四章 多維數(shù)組和廣義表1. 數(shù)組的順序存儲方式 : 一般采用順序存儲方法表示數(shù)組。1行優(yōu)先順序a 11 ,a 12,a in,a 21 ,a 22,a2n,ami,am2,,amn2列優(yōu)先順序a 11,a 21,a m1,a 12,a 22,am2,a1 n,a2n,,amnPascal和C語言是按行優(yōu)先順序存儲的,而Fortran語言是按列優(yōu)先順序存儲的。按行優(yōu)先順序存儲的二維數(shù)組Amn地址計算公式LOC(aj )=L0C(a11)+(i-1) x n +j -1 xd (注:此公式下界為 1,如下界為0,那么公式變?yōu)閕 x n +j )按列優(yōu)先順序存儲的二維數(shù)組Amn地址計算公式LOC
28、(a )=LOC(an)+(j-1) x m+i-1 xd(注:此公式下界為 1,如下界為0,那么公式變?yōu)閖 x m+i)按行優(yōu)先順序存儲的三維數(shù)組Amnp地址計算公式LOC(aijk)=LOC(a111)+(i-1)xnxp+(j -1)xp+k-1xd (注: 此公式下界為 1, 如下界為 0, 那么公式變?yōu)閕 x nx p+j x p+k)2. 為了節(jié)省存儲空間,可以對矩陣中有許多值相同或值為零的元素的矩陣,采用壓縮存儲。 特殊矩陣是指相同值的元素或零元素在矩陣中的分布有一定的規(guī)律。常見的有對稱矩陣、三角矩陣。(1 )對稱矩陣 在一個n階方陣A中,假設元素滿足下述性質:a ij =aji
29、 0< i , j <n -1稱為 n 階對稱矩陣,它的元素是關于主對角線對稱的,所以只需要存儲矩陣上三角或下三角元素即可,讓兩個 對稱的元素共享一個存儲空間。矩陣元素a。和數(shù)組元素sa【k】之間的關系是k=i x(i+1)/2+j i >j 0<k<n(n+1) /2-1k=jx(j+1)/2+i i vj 0<k<n(n+1) /2-1對稱矩陣的地址計算公式:LOC(aj )=LOC(sa0)+l x (I+1) /2+J x d,其中 l=max(i,j) , J=min(i,j)(2) 三角矩陣: 以主對角線劃分,三角矩陣有上三角和下三角兩種。
30、上三角矩陣是指它的下三角(不包括主角線 )中的元素均為常數(shù) c或零;下三角矩陣的主對角線上方均為常數(shù)c或零。一般情況,三角矩陣的常數(shù)c均為零。三角矩陣的壓縮存儲:三角矩陣中的重復元素c可共享一個存儲空間,其余的元素正好有nx(n+1) /2個,因此,三角矩陣可壓縮存儲在一維數(shù)組san(n+1)/2+1中,其中c存放在數(shù)組的最后一個元素中。 上三角矩陣中 aij 和 sak 之間的對應關系k=i x (2n -i+1)/2+j-i 當 i wj k=nx(n+1)/2 當 i >j 下三角矩陣中 aij 和 sak 之間的對應關系k=i x (i+1) /2+j 當 i >j k=n
31、x(n+1)/2 當 i v j三角矩陣的壓縮存儲結構是隨機存取結構 。3. 稀疏矩陣:設矩陣Am沖有s個非零元素,假設s遠遠小于矩陣元素的總數(shù),那么稱A為稀疏矩陣。為了節(jié)省存儲單元,可用壓縮存儲方法只存儲非零元素。由于非零元素的分布一般是沒有規(guī)律的,因此在存儲非零元素的同時,還必須 存儲非零元素所在的行、列位置,所以可用三元組 (i , j, aij )來確定非零元素。稀疏矩陣進行壓縮存儲通常有兩類方法: 順序存儲 (三元組表 )和鏈式存儲 (十字鏈表 )。稀疏矩陣的壓縮存儲會失去 隨機存取功能。稀吹艇曲*審曲三冗釧醫(yī)舸4. 廣義表是線性表的推廣,又稱列表。廣義表是n(n >0)個元素
32、ai, a2,,a,,an的有限序列。其中 ai或者是原子或者是一個廣義表。 廣義表通常用圓括號括起來,用逗號分隔其中的元素。 為了區(qū)分原子和廣義表,書寫時用大寫字母表示廣義表,用小寫字母表示 原子。 假設廣義表Ls非空(n > 1),貝U ai是LS的表頭,其余元素組成的表(ai, a2,,an)稱為Ls的表尾。 廣義表具有遞歸和共享的性質廣義表的深度:一個表展開后所含括號的層數(shù)稱為廣義表的深度。19.廣義表是一種多層次的線性結構,實際上這就是一種樹形結構。廣義表的兩個特殊的根本運算:取表頭head(Ls)和取表尾tail(Ls).任何一個非空廣義表的表頭可以是原子,也可以是子表,而其
33、表尾必定是子表。head=(a , b)=a , tail(a , b)=(b)對非空表 A和(y),也可繼續(xù)分解。注意:廣義表()和()不同。前者是長度為0的空表,對其不能做求表頭和表尾的運算;而后者是長度為I的由空表作元素的廣義表,可以分解得到的表頭和表尾均是空表()。廣義表是一種有層次的非線性結構,通常采用鏈式存儲結構,每個元素用一個結點表示,結點由3個域構成,其中一個是tag標志位,用來區(qū)分結點是原子還是子表,當tag為零時結點是子表,第二個域為 slink,用以存放子表的地址;當tag為1時結點是原子,第二個域為 data,用以存放元素值。第五章樹和二叉樹1. 樹的表示法:最常用的是
34、樹形圖表示法;還有3種嵌套集合、凹形、廣義表。樹結構的根本術語(1 )結點的度(Degree)樹中的一個結點擁有的子樹數(shù)稱為該結點的度(Degree)。一棵樹的度是指該樹中結點的最大度數(shù)。度為零的結點稱為 葉子(Leaf)或終端結點。度不為零的結點稱 分支結點或非終端結點。 除根結點之外的分支結點統(tǒng)稱為內部結點。根結點又稱為開始結點。(2)路徑(path )假設樹中存在一個結點序列k1,k2,,ki,使得ki是ki+1的雙親(1 <i<j),那么稱該結點序列是從kl到kj的一條路徑(Path)。一個結點的祖先是從根結點到該結點路徑上所經(jīng)過的所有結點,而一個結點的子孫那么是以該結點為
35、根的子樹中的所 有結點。結點的層數(shù)(Level)從根起算:根的層數(shù)為1,其余結點的層數(shù)等于其雙親結點的層數(shù)加1。雙親在同一層的結點互為堂兄弟。樹中結點的最大層數(shù)稱為樹的高度(Height)或深度(Depth)。假設將樹中每個結點的各子樹看成是從左到右有次序的(即不能互換),那么稱該樹為有序樹(OrderedTree);否那么稱為無序樹(UnoderedTree)。假設不特別指明,一般討論的樹都是有序樹。森林(Forest)是m(詳0)棵互不相交的樹的集合。樹和森林的概念相近。刪去一棵樹的根, 就得到一個森林;反之,加上一個結點作樹根,森林就變?yōu)橐豢脴洹?. 二叉樹與度數(shù)為 2的有序樹不同:在有
36、序樹中,雖然一個結點的孩子之間是有左右次序的,但是假設該結點只有一 個孩子,就無須區(qū)分其左右次序。而在二叉樹中,即使是一個孩子也有左右之分。二叉樹的性質:性質1二叉樹第i層上的結點數(shù)目最多為 2i-1 (i > 1)。例如5層的二叉樹,第5層上的結點數(shù)目最多為24=16k5性質2深度為k的二叉樹至多有2 -1個結點(k > 1)。例如深度為 5的二叉樹,至多有 2 -仁31個結點性質3在任意-棵二叉樹中,假設終端結點的個數(shù)為n0,度為2的結點數(shù)為n2,那么no=n?+1。例如一棵深度為4的二叉樹(a),其終端結點數(shù)no為8,度為2的結點樹為7,那么8=7+1, n°=n2
37、+1成立(b)其終端結點數(shù)no為6,度為2的結點樹為5,那么6=5+1, n°=n2+1成立1'和冷勺KMIh-kiltd-ImI «1 '"線索,這種加上線索的二叉鏈表稱為線索線索鏈表的結點結構:滿二叉樹:一棵深度為k且有2k-1個結點的二又樹稱為滿二叉樹。滿二叉樹的特點:(1)每一層上的結點數(shù)都到達最大值。即對給定的高度,它是具有最多結點數(shù)的二叉樹。(2)滿二叉樹中不存在度數(shù)為1的結點,每個分支結點均有兩棵高度相同的子樹,且樹葉都在最下一層上。完全二叉樹:假設一棵深度為k的二叉樹,其前 k-1層是一棵滿二叉樹,而最下面一層上的結點都集中在該層最
38、左邊的假設干位置上,那么此二叉樹稱為完全二叉樹。特點:(1) 滿二叉樹是完全二叉樹,完全二叉樹不一定是滿二叉樹。(2) 在滿二叉樹的最下一層上,從最右邊開始連續(xù)刪去假設干結點后得到的二叉樹仍然是一棵完全二叉樹。(3) 在完全二叉樹中,假設某個結點沒有左孩子,那么它一定沒有右孩子,即該結點必是葉結點。性質4具有n個結點的完全二叉樹的深度為。?logn ?+1或?log(n+1) ?例,具有 100 個結點的完全二叉樹的深度為:?lg100 ?+1=7,26=64 2 7=128 所以?lg100 ?=6,?lg(100+1) ?=74. 完全二叉樹的編號特點:完全二叉樹中除最下面一層外,各層都充
39、滿了結點。每一層的結點個數(shù)恰好是上一層結 點個數(shù)的2倍。從一個結點的編號就可推得其雙親,左、右孩子等結點的編號。編號從0開始 假設i=0,貝U q為根結點,無雙親;否那么,qi的雙親編號為?(i-1)/2 ?。 假設2i+1<n,那么qi的左孩子的編號是 2i+1 ;否那么,qi無左孩子,即q必定是葉子。 假設2i+2<n,那么qi的右孩子的編號是 2i+2 ;否那么,q無右孩子。對于完全二叉樹而言,使用順序存儲結構既簡單又節(jié)省存儲空間。但對于一般二叉樹來說,采用順序存儲時,為了 使用結點在數(shù)組中的相對位置來表示結點之間的邏輯關系,就必須增加一些虛結點使其成為完全二叉樹的形式。5鏈
40、式存儲結構:二叉樹的每個結點最多有兩個孩子。用鏈接方式存儲二叉樹時,每個結點除了存儲結點本身的數(shù)據(jù)外,還應設置兩個指針域lchild和rchild,分別指向該結點的左孩子和右孩子。結點的結構為:二叉鏈表是一種常用的二叉樹存儲結構。建立二叉鏈表方法:a、按廣義表方法,靠近左括號的結點是在左子樹上,而逗號右邊結點是在右子樹上。b、按完全二叉樹的層次順序建立結點。具有n個結點的二叉鏈表中,共有 2n個指針域。其中有 n-1個用來指示結點的左、右孩子,其余的n+1個為空。二叉樹遍歷算法中的遞歸終止條件是二叉樹為空。中序遍歷的遞歸算法定義:(1)遍歷左子樹;(2)訪問根結點;遍歷右子樹。先序遍歷的遞歸算
41、法定義:(1)訪問根結點;(2)遍歷左子樹;遍歷右子樹。后序遍歷得遞歸算法定義:(1)遍歷左子樹;(2)遍歷右子樹;訪問根結點。遞歸工作棧中包括兩項:一項為哪一項遞歸調用的語句編號,另一項那么是指向根結點的指針。一棵二叉樹的前序和中序遍歷序列或中序和后序遍歷序列,可唯一確定一棵二叉樹。具體方法如下: 首先根據(jù)前序或后序遍歷序列確定二叉樹的各子樹的的根,然后根據(jù)中序遍歷序列確定各子樹根的左右子樹。6. 線索二叉樹:n個結點的二叉鏈表必定存在n+1個空指針域,可以利用這些空指針域,存放指向結點在某種遍歷次序下的前趨和后繼結點的指針,這種指向前驅和后繼結點的指針稱為鏈表,相應的二叉樹稱為 線索二叉樹
42、(ThreadedBinaryTree)其中:ltag 和rtag是增加的兩個標志域,用來區(qū)分結點的左、右指針 域是指向其左、右孩子的指針,還是指向其前趨或后繼的線索。圖中的實線表示指針,虛線表示線索。線索二叉樹中,一個結點是葉結點的充要條件為:左、右標志均是1。7. 二叉樹的線索化:把對一棵二叉線索鏈表結構中所有結點的空指針域按照某種遍歷次序加線索的過程稱為線索化。n個結點的二叉樹,線索化的算法時間復雜度和中序遍歷算法一樣,遞歸過程中對每結點僅做一次訪問。因此對于 為 0(n)。-,丨B0/ r11 |D1* k0E000| -、1H1丄11 r r8. 樹、森林到二叉樹的轉換:樹中每個結點
43、最多只有一個最左邊的孩子(長子)和一個右鄰的兄弟。將樹轉換成二叉樹:在所有兄弟結點之間加一道連線;對每個結點,除了保存與其長子的連線外,去掉該結點 與其它孩子的連線。由于樹根沒有兄弟,故樹轉化為二叉樹后,二叉樹的根結點的右子樹必為空。樹到二叉樹的轉換h罰A;D|1 J對*汁皓點,除了保S'jJC的長子的連錢外.點可用他孫子的將一個森林轉換為二叉樹將森林中的每棵樹轉化成二叉樹,然后再將二叉樹的根節(jié)點看做兄弟連在一起,形成一棵二叉樹講一涉;九豺飲樸中的何棵 樹箜沖二叉榔第二步為兄弟從左住右連在 起.就形脈丁一棵一義9.二叉樹到樹、森林的轉換方式是:假設二叉樹中結點 x是雙親y的左孩子,那么
44、把 x的右孩子,右孩子的右孩子,都與y用連線連起來,最后去掉所有雙親到右孩子的連線。下標JeLnpotent.ABCDFGIIIJ(J00113012 3 I S 6 7 « 910. 樹的存儲結構:1. 雙親表示法:雙親鏈表表示法利用樹中每個結點的雙親唯一性, 在存儲結點信息的同時,為每個結點附設一個指向其雙親的指針 pare nt ,惟一地表示任何-棵樹。1 雙親鏈表表示法的實現(xiàn)分析:E和F所在結點的雙親域是 1,它們的雙親結點在向量中的位 置是1,即卩B是它們的雙親。注意: 根無雙親,其pare nt域為-1。雙親鏈表表示法中指針 pare nt向上鏈接,適合求指定結 點的雙親
45、或祖先包括根;求指定結點的孩子或其它后代時,可能 要遍歷整個數(shù)組。2. 孩子鏈表法:孩子鏈表表示法是為樹中每個結點設置一個孩子鏈 表,并將這些結點及相應的孩子鏈表的頭指針存放在一個向量中。roo t =*OukiA I riithili2十Annr"4181 -j-rirrTh、:":嘰'J «(1 'i'l-Jl. .''L-bd孩子兄弟鏈表表示。注意: 孩子結點的數(shù)據(jù)域僅存放了它們在向量空間的序號。 與雙親鏈表表示法相反,孩子鏈表表示便于實現(xiàn)涉及孩子及其子孫的運算,但不便于實現(xiàn)與雙親有關的運算。 將雙親鏈表表示法和孩子鏈
46、表表示法結合起來,可形成雙親孩子鏈表表示法。3. 孩子兄弟表示法:在存儲結點信息的同時,附加兩個分別指向該結點最左孩子和右鄰兄弟的指針域,即可得樹的這種存儲結構的最大優(yōu)點是:它和二叉樹的二叉鏈 表表示完全一樣??衫枚鏄涞乃惴▉韺崿F(xiàn)對樹的操 作。11. 樹的遍歷:般都只給出兩種次序遍歷樹的方法:前序先根次序遍歷和后序后根次序遍歷。前序遍歷一棵樹等價于前序遍歷該樹對應的二叉樹 后序遍歷一棵樹等價于中序遍歷該樹對應的二叉樹。對下面a圖中所示的森林進行前序遍歷和后序遍歷,那么得到該森林的前序序列和后序序列分別為ABCDEFIGJH和BDCAIFJGHE而b圖所示二叉樹的前序序列和中序序列也分別為A
47、BCDEFIGJH BDCAIFJGHE 前序遍歷森林等同于前序遍歷該森林對應的二叉樹 后序遍歷森林等同于中序遍歷該森林對應的二叉樹12. 從根結點到某結點之間的路徑長度與該結點上權的乘積稱為該結點的帶權路徑長度,樹種所有葉子結點的帶權路徑長度之和稱為樹的帶權路徑長度。帶權路徑長度WPL最小的二叉樹稱為哈夫曼樹或最優(yōu)二叉樹。哈夫曼樹不一定是二叉樹。哈夫曼樹又稱為最優(yōu)樹,是一類帶權路徑長度最短 的樹。完全二叉樹就是這種 路徑長度最短的二叉樹。 只有葉結點上的權值均相同時,完全二叉樹一定是最優(yōu)二叉樹,否那么完全二叉樹不一定是最優(yōu)二叉樹。 最優(yōu)二叉樹中,權越大的葉子離根越近。 最優(yōu)二叉樹的 形態(tài)不唯
48、一, WPL最小。13哈夫曼算法:根本思想是:(1)根據(jù)給定的n個權值w ,wz,,wn構成n棵二叉樹的森林F=Ti,T2,,Tn,其中每棵二叉樹T中都只有一個權值為 w的根結點,其左右子樹均空。(2) 在森林F中選出兩棵根結點權值最小的樹 (當這樣的樹不止兩棵樹時,可以從中任選兩棵),將這兩棵樹合并成一棵新樹,為了保證新樹仍是二叉樹,需要增加一個新結點作為新樹的根,并將所選的兩棵樹的根分別作為新根的左右孩子(誰左,誰右無關緊要),將這兩個孩子的權值之和作為新樹根的權值。(3) 對新的森林F重復,直到森林F中只剩下一棵樹為止。這棵樹便是哈夫曼樹。 注意: 初始森林中的n棵二叉樹,每棵樹有一個孤
49、立的結點,它們既是根,又是葉子 n個葉子的哈夫曼樹要經(jīng)過n-1次合并,產(chǎn)生n-1個新結點。最終求得的哈夫曼樹中共有2n-1個結點。 哈夫曼樹是嚴格的二叉樹,沒有度數(shù)為1的分支結點。14哈夫曼編碼:數(shù)據(jù)壓縮過程稱為編碼,反之,解壓縮的過程稱為解碼。設計一種長短不等的編碼,那么必須保證任一字符的編碼都不是另一個字符編碼的前綴,這種編碼稱為前綴編碼。可以利用二叉樹來設計二進制的前綴編碼,其左分支表示字符0,右分支表示字符1,那么以根結點到葉結點路徑上的分支字符組成的串作為該葉節(jié)點的字符編碼。因此設計電文總長最短的二進制前綴編碼,就是以n種字符出現(xiàn)的頻率作為權構造一棵哈夫曼樹,由哈夫曼樹求得的編碼就是
50、哈夫曼編碼。譯碼過程是從樹根結點出發(fā),逐個讀入電文中的二進制碼。第六章圖1. 圖G由兩個集合構成,頂點集合和邊集合,也可以圖G只有頂點而沒有邊。用尖括號表示圖的有向邊<Vi,Vj>,有向邊又稱為弧,起點稱為弧尾,終點稱為弧頭。無向圖的頂點對用圓括號表示(Vi,V j)。在無向圖中,稱 Vi和Vj相鄰接,在有向圖中稱頂點Vi鄰接到Vj,頂點Vj鄰接于Vi在無向圖中,n的取值范圍是0-n(n-1)/2 ,將具有n(n-1)/2 條邊的無向圖稱為無向完全圖。 在有向圖中,n的取值范圍是0-n(n-1),將具有n(n-1)條邊的有向圖稱為有向完全圖。無向圖中,頂點的度定義為以該頂點為一個端
51、點的邊的數(shù)目,有向圖的度等于出度和入度之和。在無向圖中,任意兩頂點都有路徑,那么稱兩頂點連通。假設圖G中的任意兩個頂點都連通,稱G為連通圖。無向圖的極大連通子圖稱為連通分量,顯然,任何連通圖的連通分量只有一個,即其自身,而非連通的無向圖有多個連通分量。在有向圖中,圖 G中任意兩頂點連通,稱為強連通圖,極大連通子圖稱為強連通分量。假設在一個圖的每條邊上標上某種數(shù)值,該數(shù)值稱為該邊的權。邊上帶權的圖稱為帶權圖,帶權的連通圖稱為網(wǎng)絡。2. 圖的存儲結構:鄰接矩陣和鄰接表表示法。圖的頂點編號從0開始。鄰接矩陣表示法:<Vi ,v j>或(v i ,v j)是邊,那么值為1,不是邊那么值為
52、0。無向圖的鄰接矩陣是按主對角線對稱的。假設G是帶權圖,只要把 1換成相應邊上的權值即可,0的位置上可以不動或將其換成無窮大表示。無向圖的鄰接矩陣表示法可以僅存儲主對角線以下的元素,時間復雜度為0( n2)鄰接表表示法: 鄰接表是圖的一種鏈式存儲結構。將無向圖的鄰接表稱為邊表,將有向圖的鄰接表稱為出邊表, 將鄰接表的表頭向量稱為頂點表。假設無向圖有n個頂點和e條邊,那么它的鄰接表共有n個頭結點和2e個表結點。建立鄰接表的時間復雜度是0(n+e)。圖的鄰接表表示不是唯一的,這是因為在每個頂點的鄰接表中,各邊結點的鏈接次序可以是任意的,其具體鏈接次序與邊的輸入次序和生成算法有關。3. 圖的遍歷:遍
53、歷圖的算法是求解圖的連通性、圖的拓撲排序等算法的根底。 圖的遍歷常用的是深度優(yōu)先搜索遍歷和廣度優(yōu)先搜索遍歷兩種方法。深度優(yōu)先搜索遍歷(DFS)類似于前序(先根)遍歷。按訪問頂點的先后次序得到的頂點序列稱為圖的深度優(yōu)先遍歷序 列,或簡稱為 DFS序列。共需要搜索 n2個矩陣元素,時間復雜度為鄰接矩陣0(n2)或鄰接表0(n+e)。1無梅圖仃:C起點仃湖涇度此先搜常和力過呻示總廣度優(yōu)先搜索遍歷(BFS)類似于樹的按層次遍歷,先被訪問的頂點,其鄰接點也先被訪問,就是先進先出。 時間復雜度為鄰接矩陣 0(n2)或鄰接表0(n+e),空間復雜度都是 0(n)。fl *第1屈;轉"慮f攀西宗*4
54、. 生成樹是連通圖的包含圖中所有頂點的一個極小連通子圖,一個圖的極小連通子圖恰為一個無回路的連通圖,也 就是說,假設圖中任意添加一條邊,就會出現(xiàn)回路,假設去掉任意一條邊,都會使之成為非連通圖。因此,一個具有 n個頂點的生成樹有且僅有n-1條邊,但有n-1條邊的圖不一定是生成樹,同一個圖可以有不同的生成樹。生成樹定義為:假設從圖的某頂點出發(fā),可以系統(tǒng)的訪問到圖的所有頂點,那么遍歷時經(jīng)過的邊和圖的所有頂點所構 成的子圖,稱為該圖的生成樹。最小生成樹:圖的生成樹不唯一,把權值最小的生成樹稱為最小生成樹(MST。構造最小生成樹的算法:普里姆Prim算法的時間復雜度為0( n2)與網(wǎng)中邊數(shù)無關適于稠密圖
55、??唆斔箍朘ruskal算法的時間復雜度為 0( eloge ),主要取決于邊數(shù),較適合于稀疏圖。【例63】利用艸里姆算達給山求圖6J7(a所示的無向網(wǎng)絡的最小生成樹的過程。5. 最短路徑:Dijkstra 迪杰斯特拉算法,提出了按路徑長度遞增的順序產(chǎn)生諸頂點的最短路徑算法。拓撲排序:子工程稱為活動,頂點代表活動,有向邊代表活動的先后關系。這樣的有向無環(huán)圖DAG稱為頂點活動網(wǎng),簡稱為AOV網(wǎng)。將有向無環(huán)圖G中所有頂點排成一個線性序列,假設<u, v> E (G),那么在線性序列u在v之前,這種線性序列稱為拓撲序列。由AOV網(wǎng)構造拓撲序列的過程稱為拓撲排序。檢測的方法是:對有向圖構造其頂點的拓撲序列,假設網(wǎng)中所有頂點都在他的拓撲序列中,那么AOV網(wǎng)必定不存在環(huán)。AOV網(wǎng)的拓撲序列不是唯一的。拓撲排序的描述思想:a、在有向圖中選一個沒有前趨 (入度為零)的頂點,且輸出之。b、從有向圖中刪除該頂點 及其與該頂點有關的所有邊。c、重復上述步驟,直到全部頂點都已輸出或圖中剩余的頂點中沒有前趨頂點為止。d、輸出剩余的無前趨結點。拓撲排序實際上是對鄰接表表示的圖G
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大學生玩具創(chuàng)業(yè)計劃書
- 關于安裝電合同范本
- 修路拆除建筑合同范本
- 寫過勞動合同范本
- 修理修配勞務合同范本
- 低價轉讓木材設備合同范例
- 養(yǎng)殖公司轉讓合同范例
- 勞務運輸中介合同范本
- 住建部檢測合同范本
- 代理收放貨合同范本
- 部編版小學語文四年級下冊教師教學用書(教學參考)完整版
- 初中生物面團發(fā)酵實驗報告
- 工程項目總投資的構成及估算
- 串通招投標法律問題研究
- 高原鐵路建設衛(wèi)生保障
- 顳下頜關節(jié)盤復位固定術后護理查房
- 新版藥品管理法培訓完整版本課件
- 醫(yī)院信息系統(tǒng)HIS知識培訓教學課件-HIS的主要內容
- 硝苯地平控釋片
- 合成聚氨酯原料及助劑生產(chǎn)項目
- 四川省瀘州市2019年中考物理考試真題與答案解析
評論
0/150
提交評論