2.3-4
其中D(n)爲分解問題成子問題所需要的時間
C(n)爲合併子問題的解成原問題的解
2.3-5
僞代碼
Binary_Search(L, R, A, key)
mid = (L + R) / 2
if(A[mid] == key)
return mid
if(L == R) return false
if(A[mid] > key)
Binary_Search(mid + 1, R, A, key)
else Binary_Search(L, mid, A, key)
T(n) = T(n/2) + D(n) + C(n)
二分查找,每查找一個數,就能排除一半。除幾次之後,範圍鎖定。次數變爲
2.3-6
我們先看一下原來的代碼
while i>0 and A[i] > key
A[i + 1] = A[i]
i = i - 1;
key是什麼值,key的值是A[j]的值
i的值爲j-1。也就是說,j之前的值,也就是A[1, j - 1]都是排好序的,從小到大。
如果都是排好序的,尋找key,那麼我們是不是可以使用二分查找了。
我們可以把上述代碼替換爲:
pos = Binary_Search(A, key)
temp = A[j]
while j > pos
A[j] = A[j - 1]
j = j - 1
A[pos] = temp
Binary_Search的時間複雜度是
總共做Binary_Search的次數是:
而插入需要移動的次數是:1 + 2 + 3 + ... + n
所以總體來看時間複雜度依然是