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