計算機專業考研大綱核心考點解析

才智咖 人氣:2.43W

佇列和棧結構的概念理解

計算機專業考研大綱核心考點解析

棧是僅限制在表的一端進行插入和刪除運算的線性表,稱插入、刪除這一端為棧頂。表中無元素時為空棧。棧的修改是按後進先出的原則進行的。通常棧有順序棧和鏈棧兩種儲存結構。

佇列是一種運算受限的線性表,插入在表的一端進行,而刪除在表的另一端進行,允許刪除的一端稱為隊頭,允許插入的一端稱為隊尾,佇列的操作原則是先進先出的。佇列也有順序儲存和鏈式儲存兩種儲存結構。

線性表中單鏈表相關演算法設計與實現

一些基礎但又重要的單鏈表相關演算法,如:

1、列印單鏈表,void PrintList(List list);使用一個指標遍歷所有連結串列節點。

2、兩個升序連結串列,列印tarList中的相應元素,這些元素的序號由SeqList指定,void PrintLots(List tarList,List seqList);使用兩個指標分別遍歷兩個連結串列,每次取出序列連結串列的一個序號後,根據該序號,到達目標連結串列指定節點。

3、兩個升序連結串列的交集,List Intersect(List l1,List l2);

4、兩個升序連結串列的並集,List Join(List l1,List l2);

5、單鏈表就地置逆,void Reverse(List l);使用三個指標表示前驅,當前和後繼節點,每次將當前節點的Next指向前驅節點,然後向後遍歷直到連結串列末尾。

二元樹的遍歷

遍歷的過程就是把非線性結構的二元樹中的結點排成一個線性序列的過程。

二元樹遍歷方法可分為兩大類,一類是"寬度優先"法,即從根結點開始,由上到下,從左往右一層一層的遍歷;另一類是"深度優先法",即一棵子樹一棵子樹的遍歷。

從二元樹結構的整體看,二元樹可以分為根結點,左子樹和右子樹三部分,只要遍歷了這三部分,就算遍歷了二元樹。設D表示根結點,L表示左子樹,R表示右子樹,則DLR的組合共有6種,即DLR,DRL,LDR,LRD,RDL,RLD。若限定先左後右,則只有DLR,LDR,LRD三種,分別稱為先(前)序法(先根次序法),中序法(中根次序法,對稱法),後序法(後根次序法)。三種遍歷的遞迴演算法如下:

1、先序法(DLR)

若二元樹為空,則空操作,否則:訪問根結點?先序遍歷左子樹?先序遍歷右子樹。

2、中序法(LDR)

若二元樹為空,則空操作,否則:中序遍歷左子樹?訪問根結點?中序遍歷右子樹。

3、後序法(LRD)

若二元樹為空,則空操作,否則:後序遍歷左子樹?後序遍歷右子樹?訪問根結點。

完全二元樹中有關結點個數計算

完全二元樹的定義:深度為k,有n個結點的二元樹若且唯若其每一個結點都與深度為k的`滿二元樹中編號從1至n的結點一一對應時,稱為完全二元樹。

完全二元樹的葉子數為(n+1)/2取下整。

森林與二元樹之間的轉換以及轉換過程中結點之間的關係

將一棵樹轉換為二元樹的方法是:

1、樹中所有相鄰兄弟之間加一條連線。

2、對樹中的每個結點,只保留其與第一個孩子結點之間的連線,刪去其與其它孩子結點之間的連線。

3、以樹的根結點為軸心,將整棵樹順時針旋轉一定的角度,使之結構層次分明。

森林轉換為二元樹的方法如下:

1、將森林中的每棵樹轉換成相應的二元樹。

2、第一棵二元樹不動,從第二棵二元樹開始,依次把後一棵二元樹的根結點作為前一棵二元樹根結點的右孩子,當所有二元樹連在一起後,所得到的二元樹就是由森林轉換得到的二元樹。

樹和森林都可以轉換為二元樹,二者的不同是:樹轉換成的二元樹,其根結點必然無右孩子,而森林轉換後的二元樹,其根結點有右孩子。將一棵二元樹還原為樹或森林,具體方法如下:

1、若某結點是其雙親的左孩子,則把該結點的右孩子、右孩子的右孩子、……都與該結點的雙親結點用線連起來。

2、刪掉原二元樹中所有雙親結點與右孩子結點的連線。3.整理由1、2兩步所得到的樹或森林,使之結構層次分明。

對無向連通圖特性的理解

無向圖的每條邊,在頂點計算度的過程中,都要兩次參與計算(與邊兩關聯的2個頂點),因此所有頂點的度之和為偶數。

具有n個頂點的無向連通圖,其邊數大於或等於n-1。

在無向連通圖中,所有頂點的度數都有可能大於1。

對m階B樹定義的理解

一棵m階的B樹滿足下列條件:

1、每個結點至多有m棵子樹。

2、除根結點外,其它每個分支至少有m/2棵子樹。

3、根結點至少有兩棵子樹(除非B樹只有一個結點)。

4、所有葉結點在同一層上。B樹的葉結點可以看成一種外部結點,不包含任何資訊。

5、有j個孩子的非葉結點恰好有j-1個關鍵碼,關鍵碼按遞增次序排列。結點中包含的資訊為∶(p0,k1,p1,k2,p2,…,kj-1,pj-1),其中,ki為關鍵碼。

帶權圖的最短路徑演算法及應用

迪傑斯特拉(Di jkstra)演算法求單源最短路徑,演算法思想:

設S為最短距離已確定的頂點集(看作紅點集),V-S是最短距離尚未確定的頂點集(看作藍點集)。

1、初始化:初始化時,只有源點s的最短距離是已知的(SD(s)=0),故紅點集S={s},藍點集為空。

2、重複以下工作,按路徑長度遞增次序產生各頂點最短路徑,在當前藍點集中選擇一個最短距離最小的藍點來擴充紅點集,以保證演算法按路徑長度遞增的次序產生各頂點的最短路徑。當藍點集中僅剩下最短距離為∞的藍點,或者所有藍點已擴充到紅點集時,s到所有頂點的最短路徑就求出來了。

注意:①若從源點到藍點的路徑不存在,則可假設該藍點的最短路徑是一條長度為無窮大的虛擬路徑。②從源點s到終點v的最短路徑簡稱為v的最短路徑;s到v的最短路徑長度簡稱為v的最短距離,並記為SD(v)。

堆排序

大根堆的定義:完全二元樹,任一非葉子結點都大於等於它的孩子,也就是說根結點是最大的。而且顯然大根堆的任一棵子樹也是大根堆。

堆排序的基本思想:記錄區的分為無序區和有序區前後兩部分;用無序區的數建大根堆,得到的根(最大的數)和無序區的最後一個數交換,也就是將該根歸入有序區的最前端;如此重複下去,直至有序區擴充套件至整個記錄區。

具體操作可按下面步驟實現:

1、建大根堆

2、交換根和無序區最後一個數

3、重建大根堆,因為交換隻是使根改變了,所以左右子樹依然分別是大根堆。

4、比較根,左子樹的根和右子樹的根,如果根最大,則無須再作調整,樹已經是大根堆了;如果左子樹的根最大,交換它與根,再遞迴調整左子樹;如果右子樹的根最大,交換它與根,再遞迴調整右子數。

5、遞迴調整到葉子的時候,樹就是大根堆了。

各類排序演算法的特點及比較

幾種主要的排序演算法:氣泡排序、選擇排序、插入排序、快速排序、歸併排序、Shell排序、堆排序等。

氣泡排序演算法思想:將待排序的元素看作是豎著排列的"氣泡",較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個"氣泡"序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。如果發現兩個相鄰元素的順序不對,即"輕"的元素在下面,就交換它們的位置。

選擇排序演算法思想:選擇排序的基本思想是對待排序的記錄序列進行n-1遍的處理,第i遍處理是將L[i..n]中最小者與L[i]交換位置。這樣,經過i遍處理之後,前i個記錄的位置已經是正確的了。

插入排序演算法思想:經過i-1遍處理後,L[1..i-1]己排好序。第i遍處理僅將L[i]插入L[1..i-1]的適當位置,使得L[1..i]又是排好序的序列。

快速排序演算法思想:快速排序的基本思想是基於分治策略的。對於輸入的子序列L[p..r],如果規模足夠小則直接進行排序,否則分三步處理:1.分解(Divide):將輸入的序列L[p..r]劃分成兩個非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大於L[q+1..r]中任一元素的值。2.遞迴求解(Conquer):通過遞迴呼叫快速排序演算法分別對L[p..q]和L[q+1..r]進行排序。3.合併(Merge):由於對分解出的兩個子序列的排序是就地進行的,所以在L[p..q]和L[q+1..r]都排好序後不需要執行任何計算L[p..r]就已排好序。

歸併排序演算法思想:分而治之(divide-conquer)。每個遞迴過程涉及三個步驟:1.分解,把待排序的n個元素的序列分解成兩個子序列,每個子序列包括n/2個元素。2.治理,對每個子序列分別呼叫歸併排序MergeSort,進行遞迴操作。3.合併,合併兩個排好序的子序列,生成排序結果。

Shell排序演算法思想:演算法先將要排序的一組數按某個增量d分成若干組,每組中記錄的下標相差d.對每組中全部元素進行排序,然後再用一個較小的增量對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分成一組,排序完成。

堆排序演算法思想:用大根堆排序的基本思想:1.先將初始檔案R[1..n]建成一個大根堆,此堆為初始的無序區。2.再將關鍵字最大的記錄R[1](即堆頂)和無序區的最後一個記錄R[n]交換,由此得到新的無序區R[1..n-1]和有序區R[n],且滿足R[1..n-1]≤R[n]。3.由於交換後新的根R[1]可能違反堆性質,故應將當前無序區R[1..n-1]調整為堆。