一、選擇題
1、數據庫表設計最合理的是A.學生{id,name,age} ,學科{id,name} 分數{學生id,學科id,分數}
B.學生{id,name,age} ,分數{學生id,學科名稱,分數}
C.分數{學生姓名,學科名稱,分數}
D.學科{id,name},分數{學生姓名,學科id,分數}
解析:C,D肯定不對,B中將學科獨立成一個表結構會更加清晰,一個實體對應一張表。
2、在數據庫系統中,產生不一致的根本原因是
A.數據存儲量太大 B.沒有嚴格保護數據 C.未對數據進行完整性控制 D.數據冗餘
解析:基本概念
3、15L和27L兩個杯子可以精確地裝()L水?
A. 53 B. 25 C. 33 D. 52
解析:設A杯15L,B杯27L,用A打兩次水,將B裝滿,最後A還剩3L,將3L水裝至B,還是用A打兩次水,將B裝滿,最後A中有6L,6+27=33.9,12,15..同理
4、考慮左遞歸文法 S->Aa|b、 A ->Ac | Sd |e,消除左遞歸後應該爲(A)
A. B. C . D.
S->Aa|b S->Ab|a S->Aa|b S->Aa|b
A->bdA'|A' A->bdA'|A' A->cdA'|A' A->bdA'|A'
A->cA'|adA'|ε A->cA'|adA'|ε A->bA'|adA'|ε A->caA'|dA'|ε
解析:e爲空集,消除左遞歸,即消除 有A->A*的情況,消除做遞歸的一般形式爲U = Ux1 | U x2 |y1|y2
U = y1U' |y2 U'
U' = x1U'|x2U'|e
A = Ac|Aad|bd|e
A =bdA'|A'
A'= cA'|adA'|e
5、下列排序算法中,初始數據集合對排序性能無影響的是()
A.插入排序 B.堆排序 C.冒泡排序 D.快速排序
解析:插入和冒泡再原數據有序的情況下會出現性能的極端情況(O(n),O(n^2)).快速排序在對一個基本有序或已排序的數組做反向排序時,每次patition的操作,大部分元素都跑到了一遍,時間複雜度會退化到O(n^2)。
6、二分查找在一個有序序列中的時間複雜度爲()
A.O(N) B.O(logN) C.O(N*N) D.O(N*logN)
7、路由器工作在網絡模型中的哪一層()?
A.數據鏈路層 B.物理層 C.網絡層 D.應用層
解析:相關物理硬件和OSI協議層次的對應關係:
物理層 光纖、同軸電纜 雙絞線 中繼器和集線器
數據鏈路層 網橋、交換機、網卡
網絡層 路由器
傳輸層 網關
8、對於滿足SQL92標準的SQL語句:select foo,count(foo) from pokes where foo>10 group by foo having count(*)>5 order by foo,其執行順序應該是()
A.FROM ->WHERE -> GROUP BY -> HAVING -> SELECT ->ORDER BY
B.FROM ->GROUP BY ->WHERE -> HAVING -> SELECT ->ORDER BY
C.FROM ->WHERE -> GROUP BY -> HAVING ->ORDER -> BYSELECT
D.FROM ->WHERE ->ORDER BY -> GROUP BY -> HAVING -> SELECT
解析:SQL Select語句完整的執行順序:
1)from子句組裝來自不同數據源的數據;
2)where子句基於指定的條件對記錄行進行篩選;
3)group by子句將數據劃分爲多個分組;
4)使用聚集函數進行計算;
5)使用having子句篩選分組;
6)計算所有的表達式;
7)使用order by對結果集進行排序。
只有select選出了相應的表 才能對其排序,刪除之類的操作,因此 合理的答案應該爲 from --where-- group by-- having --select-- order by
9.使用深度優先算法遍歷下面的圖,遍歷的順序爲()
A.ABCDEFGHI B.BCEHIFGDA C.ABCEFHIGD D.HIFEGBCDA
無答案
解析:
用鄰接表的方式來表示圖
A->B->C->D
B->
C->
D->E->F->G
E->
F->H->I
G->
H->
I->
圖的深度優先搜索是沿着樹的深度遍歷樹的節點,儘可能深的搜索樹的分支。當節點v的所有邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點爲止。如果還存在未被發現的節點,則選擇其中一個作爲源節點並重復以上過程,整個進程反覆進行直到所有節點都被訪問爲止。
所以正確的過程是 A->B->C->D->E->F->H->I->G
10.UNIX系統中,目錄結構採用
A.單級目錄結構 B.二級目錄結構 C.單純樹形目錄結構 D.帶鏈接樹形目錄結構
11.請問下面的程序一共輸出多少個“-”?
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i=0; i<2; i++) { fork(); //複製父進程,調用一次,返回兩次 printf("-"); //緩衝區數據 } return 0; }
A.2個 B .4個 C.6個 D.8個
解析:
關鍵1.fock之後的代碼父進程和子進程都會運行;
關鍵2.printf(“-”);語句有buffer,所以,對於上述程序,printf(“-”);把“-”放到了緩存中,並沒有真正的輸出,在fork的時候,緩存被複制到了子進程空間,所以,就多了兩個,就成了8個,而不是6個。
12.請問下面的程序一共輸出多少個“-”?
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i=0; i<2; i++) { fork(); //複製父進程,調用一次,返回兩次 printf("-\n"); //緩衝區數據 } return 0; }
A.2個 B .4個 C.6個 D.8個
解析:printf("-\n")刷新了緩衝區
13.避免死鎖的一個著名的算法是()
A.先入現出法 B.銀行家算法 C.優先級算法 D.資源按需分配法
14.怎麼理解分配延遲(dispatch lantency)
A.分配器停止一個進程到開啓另一個進程的時間 B. 處理器將一個文件寫入磁盤的時間
C. 所有處理器佔用的時間 D.以上都不對
解析:分派程式停止某一個處理元使用中央處理器,並分派中央處理器給另一個處理元所需的時間,稱爲分派時間(Dispatch Latency)。
15.以下哪一個不是進程的基本狀態?
A. 阻塞態 B.執行態 C.就緒態 D. 完成態
解析:進程狀態轉移圖
1:就緒->執行, 當前運行進程阻塞,調度程序選一個優先權最高的進程佔有處理機;
2:執行->就緒, 當前運行進程時間片用完;
3:執行->阻塞,當前運行進程等待鍵盤輸入,進入了睡眠狀態。
4:阻塞->就緒,I/O操作完成,被中斷處理程序喚醒。
16.假定我們有3個程序,每個程序花費80%的時間進行I/O,20%的時間使用CPU。每個程序啓動時間和其需要使用進行計算的分鐘數如下,不考慮進程切換時間。
程序編號 啓動時間 需要CPU時間(分鐘)
1 00:00 3.5
2 00:10 2
3 00:15 1.5
請問在多線程/進程環境下,系統的總響應時間是()
A.22.5 B.23.5 C.24.5 D.25.5
解答:多道編程時CPU利用率的求法:
只有一個進程的時候,CPU利用率肯定是20%。
兩個進程的時候:CPu利用率是:20% + (1-20%)*20% = 36%
三個進程是:36% + (1-36%)*20% = 48.8%
其它的依次類推。
0-10分鐘的時候,只有一個進程1在運行。
單進程CPU佔有率是20%,所以這10分鐘內,進程1消耗了2分鐘的CPU。進程2是0,進程3也是0
然後在10-15分鐘內,有兩個進程在運行(1和2),雙進程的CPU利用率是36%,
所以,這五分鐘內,CPU一共利用了1.8分鐘,平均分給每個進程,是0.9分鐘。
此時,進程1已經佔用了CPU 2.9分鐘,還需要0.6分鐘,這時候有三個進程在運行,所有總的CPU時間需要1.8分鐘。
三進程的CPU利用率是48.8%,所以總共需要1.8/0.488=3.69分鐘。這時,進程1已經3.5分鐘的CPu利用時間利用完了。
此時還剩下2和3號進程在運行。
2號進程還需要0.5分鐘,所以0.5×2/0.36=2.78,此時2號進程的2分鐘CPU時間也利用完了。
3號進程還需要0.4分鐘的CPU利用時間。0.4/0.2 = 2
參考 - 操作系統多道編程
17.在所有非搶佔CPU調度算法中,系統平均響應時間最優的是()
A.實時調度算法 B.短任務優先算法 C.時間片輪轉算法 D.先來先服務算法
18.什麼是內存抖動(Thrashing)?
A.非常頻繁的換頁活動 B.非常高的CPU執行活動 C.一個極長的執行進程 D.一個極大的虛擬內存交換活動
解析:頁面的頻繁更換,導致整個系統效率急劇下降,這個現象稱爲內存抖動。
抖動一般是內存分配算法不好,內存太小引或者程序的算法不佳引起的頁面頻繁從內存調入調。
19. Belay's Anomaly 出現在哪裏()
A.內存管理算法 B.內存換頁算法 C.預防死鎖算法 D.磁盤調度算法
解析:Belady異常(Belady Anomaly):有些情況下,頁故障率(缺頁率)可能會隨着所分配的幀數的增加而增加。
原因:因爲使用了不恰當的演算法(如FIFO),雖然空間夠多(frame夠多),但因爲總是選到不應該被swap的page,所以反而讓page fault次數變多了。
20.下面的生產者消費者程序中,哪個不會出現死鎖,並且開銷最少?
解析:代碼太多,不做 - -
二、填空題
21.將下圖進行拓撲排序後,對應的序列爲 ABCFD
解析:拓撲排序的定義:對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若<u,v> ∈E(G),則u在線性序列中出現在v之前。
22.下面的函數使用二分查找算法,對已按升序排序的數組返回所要查找的數值的數據位置,請填寫缺少的兩句語句:
int* BinarySearch(int* arrayAddress, int arrayLength, int valueToSearch) { int head = 0 ; int tail = arrayLength - 1; while(head < tail) { mid = (head + tail)/2; if(arrayAddress[mid] > valueToSeatcj) tail = mid - 1; else head = mid + 1; } if(tail < arrayLength && arrayAddress[tail] == valueToSearch) return &arrayAddress[tail]; else return NULL; }
tail = mid -1 ;
head = mid + 1;
23.一個有N個正數元素的一維數組(A[0], A[1], A[2]...,A[N-1]), 求連續子數組和的最大值。
int max(int a,int b) int MaxSum(int *A, int length) { int nStart = A[0]; int nAll = A[0]; for(int i=1; i<lenght; i++) { nStart = max(nAll + A[i], 0); nAll = max(nAll, nStart); } return nAll; }
nStart = max(nAll + A[i] , 0);
nAll = max(nAll, nStart);
24. 請給出二叉樹的前序遍歷 abdefghc
25.最長遞增子序列(LIS)表示在一個序列中,保持遞增的最長子序列,比如(2,1,4,2,3,7,4,6)的LIS是{1,2,3,4,6},則LIS的長度是5.
對於一個有N個元素的序列,得到LIS的長度的最優時間複雜度是 O(nlogn) ,空間複雜度是o(n) 。
具體參考:
動態規劃-最長上升子序列(LIS)
26.給一系列的數1,2,3,,,n(有序的)和一個棧(stack),這個棧無限大,將這n個數按照順序放入棧中,但是隨機的從棧中彈出,n=5,一共有多少中彈棧方式。42
解析:這是卡特蘭數的典型應用。Catalan數的定義令h(1)=1,Catalan數滿足遞歸式:h(n) = h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1),n>=2該遞推關係的解爲:h(n) = C(2n,n)/(n+1),n=1,2,3,...(其中C(2n,n)表示2n箇中取n個的組合數)
h(5) = C(10,5)/6 = 42
27.請給出表達式 a + b*(c-d)/e-f 的逆波蘭式。abcd-*e/+f-
解析:先畫出式子的二叉樹,再寫出後序遍歷的結果。
三、Web前端方向附加題 略
四、其他方向附加題
1.微博廣告投放是騰訊收入來源之一,爲了保證投放的廣告對用戶更有幫助,必須分析用戶對什麼最感興趣。用戶的每條微薄都可以拆分成幾個關鍵字,騰訊微博每個月會收集到上T的關鍵字,請你分析出其中出現次數最多的十個關鍵字。
解析:先用Hashmap統計關鍵字的出現次數,再用“求最大的k個數”的方法,用堆來得到出現次數最大的10個關鍵字。
2.騰訊新聞首頁改版之後,爲了精確掌握改版效果,需要準實時統計每篇文章的IP數量,即從文章發表之後,有多少個不同的ip的用戶讀過這篇文章。每個用戶訪問請求都會被web服務器解析,並實時傳輸到後臺統計系統,請逆設計該“後臺統計系統”,以完成統計。