1、我们有很多瓶无色的液体,其中有一瓶是毒药,其它都是蒸馏水,实验的小白鼠喝了以后会在5分钟后死亡,而喝到蒸馏水的小白鼠则一切正常。现在有5只小白鼠,请问一下,我们用这五只小白鼠,5分钟的时间,能够检测多少瓶液体的成分(C)
A、5瓶 B、6瓶 C、31瓶 D、32瓶
PS:题目的用意是二进制法的思路,这个很容易做出是31瓶。虽然题目本身是有破绽的。
2、若某链表最常用的操作是在最后一个结点之后插入一个结点和删除最后一个结点,则采用()存储方式最节省时间?
A、单链表 B、带头结点的非循环双链表 C、带头节点的双循环链表 D、循环链表
3、如果需要对磁盘上的1000W条记录构建索引,你认为下面哪种数据结构来存储索引最合适?()
A、HashTable B、AVL-Tree C、B-Tree D、List
PS:索引和Hash应用的场合不同。正对大数据量的查找,应该用索引结构。如搜索引擎、数据库查找引擎。而索引广泛使用的结构是B-Tree。
4、可用来检测一个web服务器是否正常工作的命令是()
A、ping B、tracert C、telnet D、ftp
5、下面哪个操作是Windows独有的I/O技术()
A、Select B、Poll C、IOCP D、Epoll
PS:Poll、Epoll、Select都是Unix/Linux使用的I/O技术
6、IPV6地址包含了()位
A、16 B、32 C、64 D、128
7、数据库里建索引常用的数据结构是()
A、链表 B、队列 C、树 D、哈希表
8、在公司局域网上pingwww.taobao.com没有涉及到的网络协议是()
A、ARP B、DNS C、TCP D、ICMP
PS:DNS是域名到IP的解析;ARP是IP到Mac地址的解析;ICMP是ping命令所需要的。
二、填空题
1、http属于(应用层)协议,ICMP属于(网络层)协议。
2、深度为k的完全二叉树至少有(2^(k-1))个结点,至多有(2^k-1)个结点。
3、字节为6位的二进制有符号整数,其最小值是(-32)。
4、设有28盏灯,拟公用一个电源,则至少需有4插头的接线板数(9)个。
三、综合题
1、有一颗结构如下的树,对其做镜像反转后如下,请写出能实现该功能的代码。注意:请勿对该树做任何假设,它不一定是平衡树,也不一定有序。
1 1
/ | \/ | \
2 3 4 43 2
/|\ /\ || / \ / | \
6 5 7 8 9 10 10 9 8 7 5 6
答:用二叉树表示树,然后完全二叉树的镜像反转,最后完成二叉树到树的转换。
typedef struct node {
int element;
struct node *firstchild;
struct node *nextsibling
}*tree;
void reverse(tree root) {
tree temp;
if(!root)
return;
else {
temp = root->firstchild;
root->firstchild = root->nextsibling;
root->nextsibling = temp;
reverse(root->firstchild);
reverse(root->nextsibling);
}
}
2、假设某个网站每天有超过10亿次的页面访问量,出于安全考虑,网站会记录访问客户端访问的ip地址和对应的时间,如果现在已经记录了1000亿条数据,想统计一个指定时间段内的区域ip地址访问量,那么这些数据应该按照何种方式来组织,才能尽快满足上面的统计需求呢,设计完方案后,并指出该方案的优缺点,比如在什么情况下,可能会非常慢?
答:用B+树来组织,非叶子节点存储某个时间小段及相应的页面访问量,叶子节点是访问的IP地址。这个方案的优点是查询某个时间段内的IP访问量很快,但是要统计某个IP的访问次数或是上次访问时间就不得不遍历整个树的叶子节点。或者可以建立二级索引,分别是访问时间和IP地址来建立索引。
四、附加题
1、写出C语言的地址对齐宏ALIGN(P, ALGNBYTES),其中P是要对齐的地址,ALGNBYTES是要对齐的字节数(2的N次方),比如:ALIGN(13,16)=16
ALIGN(P,ALIGNBYTES) ( (void*)(((unsigned long)P+ALIGNBYTES-1) & ~(ALIGNBYTES-1)) )
2、在高性能服务器的代码中经常会看到类似这样的代码:
typedef union
{
erts_smp_rwmtx_t rwmtx;
bytecache_line_align_[ERTS_ALC_CACHE_LINE_ALIGN_SIZE(sizeof(erts_smp_rwmtx_t))];
} erts_meta_main_tab_lock_t;
erts_meta_main_tab_lock_tmain_tab_lock[16];
请问其中用来填充的cache_line_align的作用是?
解答:cache以块为单位进行数据更新,若两个线程的有用数据都集中在一个块上,则更新cache时为了保持数据一致性会造成很大的性能问题。因此将不同线程的数据内容放置到不同的块中,避免了号称是避免cache的trash.
3、在现代web服务系统的设计中,为了减轻源站的压力,通常采用分布式缓存技术,其原理如下图所示,前端的分配器将针对不同内容的用户请求分配给不同的缓存服务器向用户提供服务。
分配器
/ | \
缓存缓存 ...缓存
服务器1 服务器2 ...服务器n
1)请问如何设置分配策略,可以保证充分利用每个缓存服务器的存储空间(每个内容只在一个缓存服务器有副本)
2)当部分缓存服务器故障,或是因为系统扩容,导致缓存服务器的数量动态减少或增加时,你的分配策略是否可以保证较小的缓存文件重分配的开销,如果不能,如何改进?
3)当各个缓存服务器的存储空间存在差异时(如有4个缓存服务器,存储空间比为4:9:15:7),如何改进你的策略,按照如上的比例将内容调度到缓存服务器?
PS:此题是关于分布式缓存技术的内容,以后补充。
参考文章: http://blog.csdn.net/hackbuteer1/article/details/6823329
http://rdc.taobao.com/blog/cs/?p=523