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 美...