百度面試-網頁搜索部

    今天參加了百度的面試,面試過程安排過程當中出了些問題,上午面試完成後居然要等到下午4點安排接下來的面試,安排的不是很緊湊,最好讓每一個面試者的連續面試安排在一塊兒,面試挺消耗精力了。不過週五遇上百度的summer party,在大廳等待的時候看到不少美女-_-!百度的前臺妹紙們真是很漂亮嘛。 linux

    一面:面試官很清瘦,個頭很高。後來發現人很nice,很隨和~,至少面試過程當中讓人感受很舒服。一些我回答出來的問題可能記憶的不是很清楚了,主要記錄一些我答的不是很好的問題。首先自我介紹,不過剛剛開始就被打斷開始進行詢問了,從課程至項目,聊了不少,面試官在百度的職位or他隸屬於的部門屬於百度的框架開發類職位,及相對於策略類的一個職位。不管個人課程或者經歷其實對於框架開發類職位比較不足,比較偏策略一些。不過繼續面試嘛,我興趣普遍,針對這個也很感興趣的~面試

    1.linux多線程編程的知識,這個答的不是很好,由於本身確實基本沒寫過多線程的知識,只是並行程序設計利用MPI實現過簡單的算法,概念知識不是很瞭解,因此針對linux多線程編程知識還須要補充一下。當時一個問題就是鎖的類型?算法

    2.linux中文件描述符FD的概念?當時想不到是什麼,而後面試官提示了一下,0,1,2,就想到了命令行中常常用到1,2就答了一下才瞭解到平時用到的這些就是文件描述符,本身殊不知道概念。編程

        標準輸入(standard input)的文件描述符是 0,標準輸出(standard output)是 1,標準錯誤(standard error)是 2。設計模式

    3.由於是搜索公司,因此面試官讓我描述一下整個搜索引擎的過程,包括用戶提交query以後的一系列工做,這部分概念缺失不少,答的不好。準備面試一家搜索公司,並且在搜索公司實習過一段時間,居然沒法完整答出這個問題,其實挺糟的。數組

        這個搜索一下比較好的架構~最好針對已經有的開源項目分析其框架最好。針對我可能分析一下Nutch和Solr比較好。安全

    4.針對數組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時間。架構

     5.虛擬析構函數的應用場景。框架

         當時答的是指向父類的指針實際指的子類對象,delete的時候須要調用子類析構函數!這是惟一應用場景!當時多嘴答了一下引用也可。其實引用必須顯示建立對象,這樣編譯器就會自動調用其析構函數,因此不屬於這一應用場景,即便指針和引用都可完成多態。

       實驗實例:

       

class A{
public:
	A() {
		cout<<"I am A"<<endl;
	}
	~A() {
		cout<<"Leave A"<<endl;
	}
};
class B:public A{
public:
	B() {
		cout<<"I am B"<<endl;
	}
	~B() {
		cout<<"Leave B"<<endl;
	}
};
int main() {
	A &atestr = B();
	A *atestp = new B();
	delete atestp;
}

  實驗結果:

     

     6.STL中list的底層實現?雙鏈表,由於能夠前進後退。STL中的deque的默認使用容器?其實當時不太肯定,思考了一下,猜了一下vector,由於不少容器默認容器均使用vector。當時若是問我deque的底層實現就行了,這個我更加了解-_-。

     7.vector的insert和erase操做,這個也不是很熟悉,可是屬於連續空間的插入和刪除,必須作內存的調整~,翻看一下STL源碼具體的實現。

    

     8.兩個簡單的算法題目,時間比較急,代碼寫的比較冗餘。

        a.一個數組中只有一個數字出現1次,其餘數字出現兩次。

            挺簡單的題目,由於見過,因此就跳過了這個題目,因此元素異或便可。

        b.一個m*n得棋盤,每一個格子中有一個數字,計算從左上角至右下角的最大路徑和,每一步行只可以向右或者向下行走。

            一個簡單的動態規劃題目,第一種方法首先時間複雜度O(mn)空間複雜度O(mn)的寫了代碼,代碼有些長,後來改進了一個時間複雜度O(mn)空間複雜度O(min(m,n))的算法,後來面試官問若是須要還原路徑如何作?採用O(mn)的額外空間記錄每一個單元走的路徑便可。

面試總結:算法題目其實挺簡單的,只不過不少基礎知識不夠牢固,好比linux的一些基礎知識(複習下《鳥哥linux私房菜》),多線程的編程知識(學習下《posix多線程程序設計》並簡單實踐一下),STL的知識和C++的知識也仍然須要鞏固複習(STL源碼剖析,Effective C++,More Effective C++,深度探索C++對象模型一本書內容仍是挺晦澀的,仍是要拜讀一下,面試的時候雖然可能不涉及這麼深刻的知識,可是仍是要繼續學習),另外就是儘量的逛一些技術社區,看一些東西了。由於像有序,無序數組那個題目,感受徹底是技術視野的問題,看到了就會,沒看到怎麼可以想到是CPU的優化,我都覺得是編譯器的優化,答題方向都掌握錯了。

    二面:二面的面試官相對於一面的面試官不是那麼的健談,更多的是讓我去說,他去加一些提醒,而後我繼續的回答。不過面試官也很nice,由於答題的過程中給了我不少的引導,由於題目我答的都不是很完善T_T!

    1.首先是問一個大數據處理的題目,兩個URL文件,分別有20億條記錄,每一個URL的項目大約1KB。文件中有重複的URL記錄,如何去除重複?

         由於在一面的過程當中瞭解到,有序的數組去除重複的時候可以獲得快速的去重,因此就考慮到了首先排序,可是兩個這麼大的文件單機排序?外部排序,k路歸併排序,而後面試官就順勢的問了我k路歸併排序的知識,k路歸併排序的時間估計,由於k路歸併排序不少時間在磁盤的IO上面,因此我猜想可能磁盤的IO纔是時間的平靜,每一個元素最終進出磁盤4次,因此我估計的方法是元素數量*4*磁盤IO平均時間。不知道這個方法對不對。

         多機的擴展,MapReduce程序應該能夠完成,可是我對hadoop不是很瞭解(因此這個方法沒有答)。本身想一下多機的擴展吧,固然也是分治,想一想也能夠多機k路歸併排序,後來面試官引導我說能夠不排序麼?我才意識到原始問題只是爲了去除重複,因此這裏分治而且利用hash的方法應該可以達到很快速的算法(複習一下《大型網站架構》這本書)一致性simhash方法應該是解決這個問題的。

    2.設計模式,單例設計模式的深刻討論。(複習《head first》設計模式)

         a.單例設計模式的應用場景?

         b.單例模式的代碼(白紙代碼)?

         c.多線程安全的單例模式代碼(須要加鎖)?

         d.如何實現一個高效的線程安全的單例模式代碼?(存在不加鎖的解決方案嗎?)

    3.簡單的聊了項目以後就問了一個算法題目。中國象棋中帥,將和一個將身邊的士,輸出其合理位置的方案。

       剛看到這個算法題目的時候還卡了一下,不事後來本身把棋盤編號爲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;
}

面試總結:對於系統設計海量數據的題目仍是要準備的,仍是須要複習《大型網站架構》一書,書中講述了不少海量數據處理的知識。學習下july的博客,瞭解一些經常使用的方法。另外就是設計模式中單例模式的掌握必定要很是的熟悉,不要讓面試官不斷的提醒修正錯誤,這樣會引出更多的問題,我此次面試就是,雖然及時的修正問題,可是都可以引出其餘的問題,好比講一下線程和進程?雖然這個問題比較普通,可是這種引出其餘問題仍是儘可能避免。

三面:這一面真是等了一個下午,12:30-4:20這個過程真是等待的很漫長,腦殼都秀逗了,面試官下午來了以後感受就是聊天了,也沒有針對我問一些技術問題,主要問了實習的一些工做,簡單的聊了半個小時就結束了,也沒有說後續的消息。不知道是否是還有後續,反正面試官仍是很詳細的描述了一下百度的狀況,也很認真的解答了我問的幾個關於百度的問題。當時也很差意思去問後續消息,就回來了。T_T。

    等待吧,但願不管結果好壞,百度都會給一個答覆,這樣也是一種提升。

相關文章
相關標籤/搜索