Introduction to Algorithm 第二章第三節

2.3-4

 T(n) = T(n - 1) + D(n) + C(n)

其中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)

二分查找,每查找一個數,就能排除一半。除幾次之後,範圍鎖定。次數變爲log_{2}(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的時間複雜度是log_{2}n 

總共做Binary_Search的次數是:nlog_{2}n

而插入需要移動的次數是:1 + 2 + 3 + ... + n\frac{(1 + n) * n}{2}

所以總體來看時間複雜度依然是O(n^{2})

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章