演算法導論 CLRS 2 3 7 2 2

2021-07-04 09:54:52 字數 1842 閱讀 9559

2.3 - 7

其實這道星號題的思路已經在前面幾個習題中給了提示。

思路是先用merge sort對陣列公升序排列,然後進行binary search即可, 時間複雜度為\t(

n)=θ

(nlogn

+logn)

=θ(n

logn)

演算法分析如下:

設二叉搜尋下邊界為lo

w ,上邊界為hi

gh,中間index為mi

d 。

則每次迭代後,待搜尋區域為ss

orte

d[lo

w...

high

] (loop invariant)。

針對loop invariant, 對演算法的三個階段進行分析驗證:

1. initialization: after merge-sort ss

orte

d[lo

w...

high

],lo

w=1,

high

=s.l

engt

h 此時loop invariant為待搜尋區域,初始條件正確。

2. maintenance: mi

d=⌊(

low+

high

)/2⌋

,每次迭代後,如果未滿足終止條件,則有兩種情況:

if s[m

id]+

s[mi

d+1]

low=

mid+

1 else if s[

mid]

+s[m

id−1

]>x:

high

=mid

−1迭代後均滿足loop invariant保持正確。

termination:

終止條件有兩種情況,一是找到了su

m=x , 二是沒找到。

if s[m

id]+

s[mi

d+1]

==x||

s[mi

d]+s

[mid

−1]==

x return yes

if low

>hi

ghreturn nil

感覺書上介紹的initialize-maintence-terminate分析方法很好用,用這個方法分析迭代演算法感覺條理很清晰,邊界問題也容易想清楚。根據分析結果來寫**感覺6了很多。

思考題 2-1

這題是將merge sort和insert sort綜合起來了,題設是把陣列分成k長度的sublist時開始用insert sort排序,最後merge。a.b.c很簡單,純粹數學題而已,這裡想記錄一下我自己對d小問的想法,問題如下:

d. how should we choose k in practice?

自己實在資質愚鈍,一開始沒什麼想法,只是感覺應該選乙個小一點的k。後來上網查,看到有人說選insert sort排序時間比merge sort排序時間小的最大k值即可。

乍看感覺很有道理,似乎取了乙個最優值,但是細想,覺得不對。從降低running time的角度出發,k值的選取應該是讓running time最小。因此,直覺上,感覺k值的選取應該是insert sort排序這個sublist時能夠比merge sort省最多的時間,也就是盡量選取靠近kt

max|

t=ti

nser

t−tm

erge

的k值. 這個k值不會是insert sort比merge sort時間小的最大k值,因為此時insert sort和merge sort所花費的時間已經相差無幾。

演算法導論為何被稱為CLRS

最近在學習演算法導論的時候發現經常被提到clrs這本書,最開始我很疑惑clrs是指哪本,後來發現基本指的就是mit的introduction to algorithms。那麼問題來了,為什麼這麼稱呼呢?去網上查了一下,如演算法導論wiki介紹首段的最後一句所說,原來這個簡寫就是幾位作者,thomas...

演算法導論CLRS 8 3 基數排序

8.3 基數排序 radix sort include include include includeusing namespace std typedef vector iterator tvecite typedef vector iterator tvecpite void radixsort...

CLRS 17 2核算法

17.2 1 每個 k 次push或pop執行一次copy,那麼使push和pop的 co st為 2 1份用來支付本身的操作,另 1 份用於copy。17.2 2 每次操作的代價都是 3,當 i 不是 2的冪時,支付一美元,信用為 2 美元 否則就支付 i美元,使用信用支付。由於攤還代價是 3 美...