算法導論有趣題——4-2,6-3

4-2:

題目描述:

某數組A[1,2,...n]含有所有從0到n的證書,但其中一個整數不在數組中。通過輔助數組B[0,...n]來記錄A中出現的整數

(1)在O(n)時間找到缺失整數

(2)若數組中每個數值是二進制的,不能直接對每個數取出其數值,則如何找到缺失



解答:
(1)遍歷數組A,將每個出現的值存儲在B中下標對應值,之後遍歷一次B即可

eg:

for val in A:
    B[val] = 1

for i in range(len(B)):
    if B[i] == 0:
        return i

(2)使用異或操作來處理。1^0 = 0,1^1 = 0,0^0 = 0,既:兩個相等的數異或結果爲0,而0與任何數異或得該數本身。因此,將A中的值與0~n異或,得到的結果就是缺失的整數。


6-3:

題目描述:Young 氏矩陣:從左到右遞增,從上到下遞增。

(1)插入一個新元素的算法及複雜度

(2)對n*n個數使用young氏矩陣排序的複雜度爲O(n^3)

(3)在m*n矩陣中找到一個給定數,複雜度O(m + n)


解答:

(1)在矩陣右下角插入新元素。若新元素大於上方與前方的元素,則插入成功。否則, 將新元素往小的方向比較交換過去。最壞情況的複雜度爲:走到了左上角O(n+m)

void insert(vec,i,j)
{
    //此處僅提供參考思想,不具體涉及邊緣控制
    curr = vec[i][j];
    left = vec[i][j-1];
    up = vec[i-1][j];
    if(curr >= left && curr >= up)
        return;  //找到合適位置
    else if(curr < left)
        insert(v,i,j-1)
    else
        insert(v,i-1,j)
}

2)對 n * n 個元素使用Young矩陣,每個元素插入該矩陣的複雜度是O(n+n),則,總的複雜度爲O(2n*n*n) = O(n^3)。對一個Y矩陣,左上角爲最小值,最左一列遞增,最頂一行遞增,則使用合併排序中的摸牌式合併方法,O(m+n)的複雜度就可以排序好第一列與第一行。同樣的方法。遍歷整個矩陣一次,就可以完成排序


(3) 從左下角起尋找元素。若當前值小於需要值,則往右;若當前值大於需要值,則往上。複雜度爲O(m + n)


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