歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

2013年阿裡算法筆試題解題報告

解答題:

1、有一個算法,查找n個元素的的數組的最大值和最小值,要比較2n次;請寫一個最高效的算法,並說明他要比較的次數。請注意復雜度的常數

(不用寫代碼,說明步驟和過程即可,要定出比較的次數,沒寫不給分)

2、有三個非遞減序列的數組a[l]、b[m]、c[n],求他們之間的最小距離。已知距離的定義如下:

distance = max(|a[i]-b[j]|, |a[i]-c[k]|, |b[j]-c[k]|).其中0<=i<l, 0<=j<m, 0<=k<n

Answer:

1.一般情況下,我們是獨立的找出最大和最小值這各需要n-1的比較,一共是2n-2次的比較,個人認為最高的效率是3(n/2),具體的方法記錄已知的最小值和最大值,但是並不是將每一個輸入元素與當前的最大最小值比較,(如果是的話,那麼代價就是每個元素需要2次比較),而是對輸入元素成對的進行比較。首先先對輸入的一對元素進行比較,然後將較小的與當前最小值比較,較大的與當前最大值比較,這樣對2個元素一個需要3次比較,相對於前面的4次比較

2.max(|a[i]-b[j]|, |a[i]-c[k]|, |b[j]-c[k]|),需求最小.這個問題很明顯可以轉化為區間上取點問題。

設數組a: a1, a2,a3......

b: b1,b2,b3......

c: c1,c2,c3......

在這三個數列中每列任選一點,使得三點中最大與最小值的差最小。可以使用貪心來做,先在第一列任意選取一點x,然後在第二列中貪心求得與x 的差最小的點y , 接著比較得出x,y 的最大值value, 最後重新貪心選取一遍,結果就可以得出來了,時間復雜度n^3.

Oh ,對了,題目中說了是非遞減的,那麼就是有序的,那麼在用貪心在做選擇的時候,如果比較的差值比之前的大,那麼就可以跳出循環了,這樣就可以剪枝掉一部分的數據。那麼算法復雜度就會降下很多,具體的就要看數據。

如果各位有更好的想法,還希望能不吝賜教。

Copyright © Linux教程網 All Rights Reserved