一、算法效率比較
題目:針對數組A和數組B,兩個數組的元素內容相同,不過數組A是已經排序的,數組B是亂序的,針對數組的中位數,存在以下兩組程序,比較其效率並分析原因。
int g; int main() { g = 0; for(int i = 0 ; i < n ; i++) { if( A[i] > mid ) g++; } for(int i = 0 ; i < n ; i++) { if(B[i] > mid ) g++; } }
當包含流水線技術的處理器處理分支指令時就會遇到一個問題,根據判定條件的真/假的不同,有可能會產生轉跳,而這會打斷流水線中指令的處理,因為處理器無法確定該指令的下一條指令,直到分支執行完畢。流水線越長,處理器等待的時間便越長,因為它必須等待分支指令處理完畢,才能確定下一條進入流水線的指令。
這個題目之前在網上瀏覽到過,知道有序的數組的效率其實比無序的要高很多,但是原因實在想不出來。現在搜一下,原來是stackoverflow上面的經典問答呢,原因不是編譯器動手腳,而是CPU動的手腳,CPU有一個叫分支預測的技術,是這個技術導致有序數組的效率很高。 CPU指令執行的過程是流水線,簡單的分支預測方案是針對當前元素(實際是處理過元素的統計學規律)判斷下一個元素的指令跳轉方向,有序的話分支預測的准確率很高,無序的話分支預測技術就不生效了,無法提前裝載指令進入流水線,這樣就損耗了一定的CPU時間。
二、簡單算法之求不同元素
題目:一個數組中只有一個數字出現1次,其他數字出現兩次。
挺簡單的題目,因為見過,所以就跳過了這個題目,所以元素異或即可。
三、DP題目
題目:一個m*n得棋盤,每個格子中有一個數字,計算從左上角至右下角的最大路徑和,每一步行只能夠向右或者向下行走。
ACM的時候做過,我只知道是DP,不過不是很理解,現在好好高一下。
先初始化二維數組S,用雙重for循環,Arrays.fill方法只可初始化一維數組 s[0][0] = a[0][0]; for(int i=1; i<N; i++) s[i][0] = a[i][0] + s[i-1][0]; for(int j=1; j<M; j++) s[0][j] = a[0][j] + s[0][j-1]; for(int i=1; i<N; i++) for(int j=1; j<M; j++) s[i][j] += a[i][j] + Math.max(s[i-1][j],s[i][j-1]);
三、海量數據處理
問題:兩個URL文件,分別有20億條記錄,每個URL的項目大約1KB。文件中有重復的URL記錄,如何去除重復?
因為在一面的過程中了解到,有序的數組去除重復的時候能夠得到快速的去重,所以就考慮到了首先排序,但是兩個這么大的文件單機排序?外部排序,k路歸並排序,然后面試官就順勢的問了我k路歸並排序的知識,k路歸並排序的時間估計,因為k路歸並排序很多時間在磁盤的IO上面,所以我猜測可能磁盤的IO才是時間的平靜,每個元素最終進出磁盤4次,所以我估計的方法是元素數量*4*磁盤IO平均時間。不知道這個方法對不對。
多機的擴展,MapReduce程序應該可以完成,但是我對hadoop不是很了解(所以這個方法沒有答)。自己想一下多機的擴展吧,當然也是分治,想想也可以多機k路歸並排序,后來面試官引導我說可以不排序么?我才意識到原始問題只是為了去除重復,所以這里分治並且利用hash的方法應該能夠達到很快速的算法(復習一下《大型網站架構》這本書)一致性simhash方法應該是解決這個問題的。
我首先想到的是hash,因為前面見過如何求出訪問最多的IP,就是對IP進行Hash,只不過不知道如何Hash而已,過兩天專門搞海量數據的Hash處理。
參考文獻http://www.cnblogs.com/weixliu/p/3900633.html
四、象棋問題
中國象棋中帥,將和一個將身邊的士,輸出其合理位置的方案。
剛看到這個算法題目的時候還卡了一下,不過后來自己把棋盤編號為1,2,3,4,5,6,7,8,9之后豁然開朗~不過我的代碼if,else比較多,3類情況枚舉,后來在面試官的提示下進行條件合並,節省了很多的代碼。
for(int s = 1 ; s <= 9;s++) { for(int j = 1 ; j <= 9;j++) { for(int jsb = 1; jsb <= 9;jsb += 2) { if( validposition(s,j,jsb)) printf("%d,%d,%d",s,j,jsb); } } } bool validposition(int s,int j,int jsb) { //將和帥相對應,並且不是士兵擋在將的前面的情況??? if ( s%3 == j%3 && !( jsb % 3 == j % 3 && jsb < j ) ) return false; return true; }