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