2018考研計(jì)算機(jī)專業(yè)課核心考點(diǎn)總結(jié)(2)

字號(hào):


    新東方在線推薦:2018年考研順利課程!!一科不過(guò),全科免費(fèi)
    帶權(quán)圖的短路徑算法及應(yīng)用
    迪杰斯特拉(Dijkstra)算法求單源短路徑,算法思想:
    設(shè)S為短距離已確定的頂點(diǎn)集(看作紅點(diǎn)集),V-S是短距離尚未確定的頂點(diǎn)集(看作藍(lán)點(diǎn)集)。
    1.初始化:初始化時(shí),只有源點(diǎn)s的短距離是已知的(SD(s)=0),故紅點(diǎn)集S={s},藍(lán)點(diǎn)集為空。
    2.重復(fù)以下工作,按路徑長(zhǎng)度遞增次序產(chǎn)生各頂點(diǎn)短路徑,在當(dāng)前藍(lán)點(diǎn)集中選擇一個(gè)短距離小的藍(lán)點(diǎn)來(lái)擴(kuò)充紅點(diǎn)集,以保證算法按路徑長(zhǎng)度遞增的次序產(chǎn)生各頂點(diǎn)的短路徑。當(dāng)藍(lán)點(diǎn)集中僅剩下短距離為∞的藍(lán)點(diǎn),或者所有藍(lán)點(diǎn)已擴(kuò)充到紅點(diǎn)集時(shí),s到所有頂點(diǎn)的短路徑就求出來(lái)了。
    注意:①若從源點(diǎn)到藍(lán)點(diǎn)的路徑不存在,則可假設(shè)該藍(lán)點(diǎn)的短路徑是一條長(zhǎng)度為無(wú)窮大的虛擬路徑。②從源點(diǎn)s到終點(diǎn)v的短路徑簡(jiǎn)稱為v的短路徑;s到v的短路徑長(zhǎng)度簡(jiǎn)稱為v的短距離,并記為SD(v)。
    堆排序
    大根堆的定義:完全二叉樹(shù),任一非葉子結(jié)點(diǎn)都大于等于它的孩子,也就是說(shuō)根結(jié)點(diǎn)是大的。而且顯然大根堆的任一棵子樹(shù)也是大根堆。
    堆排序的基本思想:記錄區(qū)的分為無(wú)序區(qū)和有序區(qū)前后兩部分;用無(wú)序區(qū)的數(shù)建大根堆,得到的根(大的數(shù))和無(wú)序區(qū)的后一個(gè)數(shù)交換,也就是將該根歸入有序區(qū)的前端;如此重復(fù)下去,直至有序區(qū)擴(kuò)展至整個(gè)記錄區(qū)。
    具體操作可按下面步驟實(shí)現(xiàn):
    1.建大根堆
    2.交換根和無(wú)序區(qū)后一個(gè)數(shù)
    3.重建大根堆,因?yàn)榻粨Q只是使根改變了,所以左右子樹(shù)依然分別是大根堆。
    4.比較根,左子樹(shù)的根和右子樹(shù)的根,如果根大,則無(wú)須再作調(diào)整,樹(shù)已經(jīng)是大根堆了;如果左子樹(shù)的根大,交換它與根,再遞歸調(diào)整左子樹(shù);如果右子樹(shù)的根大,交換它與根,再遞歸調(diào)整右子數(shù)。
    5.遞歸調(diào)整到葉子的時(shí)候,樹(shù)就是大根堆了。
    各類排序算法的特點(diǎn)及比較
    幾種主要的排序算法:冒泡排序、選擇排序、插入排序、快速排序、歸并排序、Shell排序、堆排序等。
    冒泡排序算法思想:將待排序的元素看作是豎著排列的“氣泡”,較小的元素比較輕,從而要往上浮。在冒泡排序算法中我們要對(duì)這個(gè)“氣泡”序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個(gè)序列,并時(shí)刻注意兩個(gè)相鄰的元素的順序是否正確。如果發(fā)現(xiàn)兩個(gè)相鄰元素的順序不對(duì),即“輕”的元素在下面,就交換它們的位置。
    選擇排序算法思想:選擇排序的基本思想是對(duì)待排序的記錄序列進(jìn)行n-1遍的處理,第i遍處理是將L[i..n]中小者與L[i]交換位置。這樣,經(jīng)過(guò)i遍處理之后,前i個(gè)記錄的位置已經(jīng)是正確的了。
    插入排序算法思想:經(jīng)過(guò)i-1遍處理后,L[1..i-1]己排好序。第i遍處理僅將L[i]插入L[1..i-1]的適當(dāng)位置,使得L[1..i]又是排好序的序列。
    快速排序算法思想:快速排序的基本思想是基于分治策略的。對(duì)于輸入的子序列L[p..r],如果規(guī)模足夠小則直接進(jìn)行排序,否則分三步處理:1.分解(Divide):將輸入的序列L[p..r]劃分成兩個(gè)非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值。2.遞歸求解(Conquer):通過(guò)遞歸調(diào)用快速排序算法分別對(duì)L[p..q]和L[q+1..r]進(jìn)行排序。3.合并(Merge):由于對(duì)分解出的兩個(gè)子序列的排序是就地進(jìn)行的,所以在L[p..q]和L[q+1..r]都排好序后不需要執(zhí)行任何計(jì)算L[p..r]就已排好序。
    歸并排序算法思想:分而治之(divide - conquer)。每個(gè)遞歸過(guò)程涉及三個(gè)步驟:1.分解,把待排序的n個(gè)元素的序列分解成兩個(gè)子序列,每個(gè)子序列包括n/2個(gè)元素。2.治理,對(duì)每個(gè)子序列分別調(diào)用歸并排序MergeSort,進(jìn)行遞歸操作。3.合并,合并兩個(gè)排好序的子序列,生成排序結(jié)果。
    Shell排序算法思想:算法先將要排序的一組數(shù)按某個(gè)增量d分成若干組,每組中記錄的下標(biāo)相差d.對(duì)每組中全部元素進(jìn)行排序,然后再用一個(gè)較小的增量對(duì)它進(jìn)行,在每組中再進(jìn)行排序。當(dāng)增量減到1時(shí),整個(gè)要排序的數(shù)被分成一組,排序完成。
    堆排序算法思想:用大根堆排序的基本思想:1.先將初始文件R[1..n]建成一個(gè)大根堆,此堆為初始的無(wú)序區(qū)。2.再將關(guān)鍵字大的記錄R[1](即堆頂)和無(wú)序區(qū)的后一個(gè)記錄R[n]交換,由此得到新的無(wú)序區(qū)R[1..n-1]和有序區(qū)R[n],且滿足R[1..n-1].keys≤R[n].key。3.由于交換后新的根R[1]可能違反堆性質(zhì),故應(yīng)將當(dāng)前無(wú)序區(qū)R[1..n-1]調(diào)整為堆。