百度網頁搜索部


一、算法效率比較

      題目:針對數組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,不過不是很理解,現在好好高一下。

       P2Z0200[WO{SF`BZ()GL@M0  

      7Y0]E2Y34_`$[}C64A2$UI6

先初始化二維數組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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM