1. 程式人生 > >演算法設計與分析基礎 第六章謎題

演算法設計與分析基礎 第六章謎題

習題6.1

9.數字填空 給定n個不同的整數以及一個包含n個空格的序列,每個空格之間事先給定有不等(>或<)符號,請設計一個演算法,將n個整數填入這n個空格中並滿足不等式約束。例如,數4,6,3,1,8可以填在這樣的5個空格中:

解答:將n個正整數從小到大排序,然後將數字填入空格之中:從左到右遍歷每一個空格,若空格之後是小於號,則填入當前正整數序列中的最小值;若為大於號,則填入當前正整數序列中的最大值。最後一個空格填入序列中最後留下的數字。

習題6.2

11.關燈遊戲 這個單人遊戲有一塊n×n的面板,都是1×1的電燈小面板組成的。每個小面板都有一個開關可以開啟或關閉,這會同時開啟或關閉水平和垂直鄰接的4塊小面板的燈(因此,撥動角上的面板的開關會改變3個面板的燈,撥動邊界上的非角落的面板開關會改變4個面板的燈)。如果知道初始時那些燈是點亮的,如何關閉所有的燈呢?

a. 請說明求解該問題可以利用mod2運算和解線性方程,該方程的係數和等式右邊都是0/1。

解答:用0/1表示燈滅/燈亮,分別用S,F表示起始和目標面板狀態,求解該問題可以用以下方程表示:

                                                          

其中xij  表示所求解,Aij  表示按下第i行第j列開關對狀態的改變,例如在n=3時:

                                                              

 

b. 利用高斯消去法解該問題的2×2全1例項,也就是說2×2面板上所有的燈一開始都亮著。

解答:線性方程為

 

利用高斯消去法得

解得    

c. 利用高斯消去法解該問題的3×3全1例項,也就是說3×3面板上所有的燈一開始都亮著。

解答:  ,其餘項為零。

 

習題6.3

9.為包含實數的2-3樹設計一個演算法,來計算它的值域(也就是說,最大數和最小數的差),並確定該演算法的最差效率。

解答:2-3樹中的最小和最大鍵分別是最左邊葉子中的第一個鍵和最右邊葉子中的第二個鍵。因此,搜尋從根到葉的最左指標的路徑以及從根到葉的最右指標的路徑。由於2-3樹的高度始終為Θ(logn)演算法的時間效率為Θ(logn)+Θ(logn)+Θ(1)=Θ(logn)。

 

習題6.4

12.麵條排序 想象一把義大利生面條,每一根麵條代表一個需要排序的數字。

a. 描述一個“麵條排序”演算法——一種利用了這種非正統描述的排序演算法。

解答:將一堆義大利麵條杆垂直放在桌面上,重複地取出其中剩餘的最高杆,直到不再留下杆。 這將按照長度的降序對杆進行分類。

b. 這個在電腦科學界流傳的例子,如何從一般性上闡述了本章的主題,又如何特別闡述了堆排序?

解答:該方法與堆排序共享其主要思想:以一種簡單地查詢和刪除最大專案的方式來排序。 從更一般的角度來看,義大利麵條排序是表示變治演算法的一個例子。

 

習題6.5

12.多項式內插 給定n個數據點(xi, yi)的集合,其中任意兩個xi均不同。求一個至多n-1階的多項式p(x),使得對於每個i=1,2,…,n,都有p(xi) = yi。

解答 , 當x=xi時,只有包含yi的那一項不為零。

 

習題6.6

11.吃醋的丈夫謎題 有n對夫婦要越過一條河。他們有一條船,但一次最多隻能載兩個人。為了使情況複雜化,我們假設所有的丈夫都愛吃醋,因此在過河的全過程中,即使有他人在場,如果沒有本人的陪伴,丈夫也不會允許妻子和其他妻子的丈夫在河的同一個岸上。在這種約束下,他們能越過河去嗎?

a. 對於n=2的情況,解這個問題。

解答:用H代表丈夫,W代表妻子,畫出狀態空間圖,共有四條路徑:

b. 對於n=3的情況,解這個問題,這是該問題的經典版本。

解答:

 

c. 對於任何n>=4的情況,這個問題有解嗎?如果有解,請指出他們一共要過多少次河;如果無解,請解釋一下原因。

解答:該問題n≥4時無解。在3對夫婦的基礎上,如果我們從1個或多個額外的夫婦開始,將不會產生新的狀態,並且在六次過河之後,將到達n-1對夫婦和船在初始河岸,有一對夫婦在另一岸的狀態。 從該狀態唯一允許的變化是將該夫婦運送到另一岸而回到之前的狀態。

 

12.雙n多米諾 多米諾是一種骨牌,兩面刻有點數。一幅標準的“雙六”多米諾有28塊骨牌:每一塊為從(0,0)到(6,6)的無序整數對。也就是說,一幅“雙n”多米諾是由從(0, 0)到(n, n)的無序整數對構成。請確定n的所有值,使得在“雙n”多米諾里的所有骨牌能組成一個環。

解答:可以將該問題轉化為具有n + 1個頂點的完全圖的歐拉回路問題。在該圖中頂點i表示在雙n多米諾兩面上的點數,頂點i和j之間的邊表示有i和j點的多米諾骨牌,組成一個環可以轉化成歐拉回路問題。根據定理可知當n為偶數時具有偶數連通度,此時可以構成一個環。