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