百度筆試題之0-2011-09-28濟南筆試

1.虛擬內存的概念及意義;

虛擬內存是計算機系統內存管理的一種技術。它使得應用程序認爲它擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它通常是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在需要時進行數據交換。

2.深度、廣度優先遍歷的概念及區別,以及深度、廣度序列;

圖的深度優先遍歷

首先訪問出發點v,並將其標記爲已訪問過;然後依次從v出發搜索v的每個鄰接點w。若w未曾訪問過,則以w爲新的出發點繼續進行深度優先遍歷,直至圖中所有和源點v有路徑相通的頂點(亦稱爲從源點可達的頂點)均已被訪問爲止。若此時圖中仍有未訪問的頂點,則另選一個尚未訪問的頂點作爲新的源點重複上述過程,直至圖中所有頂點均已被訪問爲止。

圖的廣度優先遍歷

廣度優先遍歷從某個頂點出發,首先訪問這個頂點,然後找出這個結點的所有未被訪問的鄰接點,訪問完後再訪問這些結點中第一個鄰接點的所有結點,重複此方法,直到所有結點都被訪問完爲止。

3.面向對象的基本特徵以及它們的含義;

繼承,封裝,多態

4.英文句子逆序輸出,單詞逆序,單詞內字符不用逆序,給出代碼及複雜度分析;

不考慮字符

void ReverseWord(char* p, char* q)
{
    while(p < q)
    {
        char t = *p ;
        *p++ = *q ;
        *q-- = t ;
    }
}

// 將句子按單詞逆序
char* ReverseSentence(char *s)
{
    // 這兩個指針用來確定一個單詞的首尾邊界
    char *p = s ;    // 指向單詞的首字符
    char *q = s ;    // 指向空格或者 '\0'

    while(*q != '\0')
    {
        if (*q == ' ')
        {
            ReverseWord(p, q - 1) ;
            q++ ; // 指向下一個單詞首字符
            p = q ;
        }
        else
            q++ ;
    }

    ReverseWord(p, q - 1) ; // 對最後一個單詞逆序
    ReverseWord(s, q - 1) ; // 對整個句子逆序

    return s ;
}


5.100萬個數中求前100大,代碼及複雜度分析;

基本想法有兩個: 
1. 
算法如下:根據快速排序劃分的思想 
(1) 遞歸對所有數據分成[a,b)b(b,d]兩個區間,(b,d]區間內的數都是大於[a,b)區間內的數 
(2) 對(b,d]重複(1)操作,直到最右邊的區間個數小於100個。注意[a,b)區間不用劃分 
(3) 返回上一個區間,並返回此區間的數字數目。接着方法仍然是對上一區間的左邊進行劃分,分爲[a2,b2)b2(b2,d2]兩個區間,取(b2,d2]區間。如果個數不夠,繼續(3)操作,如果個數超過100的就重複1操作,直到最後右邊只有100個數爲止。 

2.先取出前100個數,維護一個100個數的最小堆,遍歷一遍剩餘的元素,在此過程中維護堆就可以了。具體步驟如下: 
step1:取前m個元素(例如m=100),建立一個小頂堆。保持一個小頂堆得性質的步驟,運行時間爲O(lgm);建立一個小頂堆運行時間爲m*O(lgm)=O(m lgm);       
step2:順序讀取後續元素,直到結束。每次讀取一個元素,如果該元素比堆頂元素小,直接丟棄 
如果大於堆頂元素,則用該元素替換堆頂元素,然後保持最小堆性質。最壞情況是每次都需要替換掉堆頂的最小元素,因此需要維護堆的代價爲(N-m)*O(lgm); 
最後這個堆中的元素就是前最大的10W個。時間複雜度爲O(N lgm)。 

 6.100億個網頁,每個不超過1M,設計一個網頁讀取顯示系統,給出思路

參考http://www.cnblogs.com/graphics/archive/2011/03/09/1977717.html

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