第一部分 單選題
1假設把整數關鍵碼K散列到N個槽列表,以下哪些散列函數是好的散列函數
A: h(K)=K/N;
B: h(K)=1;
C: h(K)=K mod N;
D: h(K)=(K+rand(N)) mod N, rand(N)返回0到N-1的整數
D選項隨機函數第二次使用得到的值不同,當散列完用該表達式找不到值得位置
2 下面排序算法中,初始數據集的排列順序對算法的性能無影響的是
A: 堆排序
B:插入排序
C: 冒泡排序
D:快速排序
3 下面說法錯誤的是
A: CISC計算機比RISC計算機指令多
B: 在指令格式中,採用擴展操作碼設計方案的目的是爲了保持指令字長不變而增加尋址空間
C:增加流水線段數理論上可以提高CPU頻率
D:馮諾依曼體系結構的主要特徵是存儲程序的工作方式
4 不屬於馮諾依曼體系結構必要組成部分是:
A:CPU
B: Cache
C:RAM
D:ROM
5 一個棧的入棧序列式ABCDE則不可能的出棧序列是:
A:DECBA
B:DCEBA
C:ECDBA
D:ABCDE
6 你認爲可以完成編寫一個C語言編譯器的語言是
A:彙編
B:C語言
C:VB
D:以上全可以
7 關於C++/JAVA類中的static成員和對象成員的說法正確的是:
A:static成員變量在對象構造時候生成
B: static成員函數在對象成員函數中無法調用
:C 虛成員函數不可能是static成員函數
D: static成員函數不能訪問static成員變量
8、假設下圖中每個正方形的邊長爲1,則從A到Z的最短路徑條數
A11 B 12 C 13 D 14
9:某進程在運行過程中需要等待從磁盤上讀入數據,此時進程的狀態將:
A: 從就緒變爲運行
B:從運行變爲就緒
C: 從運行變爲阻塞
D:從阻塞變爲就緒
10:下面算法的時間複雜度爲:
Int f(unsigned int n)
{
If(n==0||n==1)
Return 1;
Else
Return n*f(n-1);
}
A: O(1)
B:O(n)
C:O(N*N)
D:O(n!)
函數結果爲n!但求的是時間複雜度
11: n從1開始,每個操作可以選擇對n加1或者對n加倍。若想獲得整數2013,最少需要多少個操作
A:18
B:24
C:21
D;不可能
倒推則每次操作可以選擇-1或/2故,2013-1=2012---2012/2=1006---1006/2=503--503-1=502--502/2=251--251-1=250--125--124--62--31--30--15--14--7--6--3--2--1.
12:對於一個具有n個頂點的無向圖,若採用鄰接表數據結構表示,則存放表頭節點的數組大小爲:
A: n
B: n+1
C: n-1
D:n+邊數
13 考慮一個特殊的hash函數h,能將任一字符串hash成一個整數k,其概率p(k)=2^(-k),k=1,2,...。對於一個未知大小的字符串集合S中的每一個元素取hash值所組成的集合h(S)。若h(S)中最大元素max(S)=10,那麼S的大小的期望
A1024 B 512 C5 D 10
每個字符串取hash可以看成同分布的獨立函數,每個時間出現的10的概率爲1/1024,故期望爲1/p。
14:如下函數,在32bits系統foo(2^31-3)的值是:
Int foo(int x)
{
Return x&-x;
}
A: 0
B: 1
C:2
D:4
-的優先級高於2^31-3=2^28 ^爲異或運算符。
15:對於順序存儲的線性數組,訪問節點和增加節點刪除節點的時間複雜度爲:
A: O(n),O(n)
B:O(n),O(1)
C:O(1),O(n)
D:O(n),O(n)
16:在32爲系統環境,編譯選項爲4字節對齊,那麼sizeof(A)和sizeof(B)是:
Struct A
{
Int a;short b;int c;char d;
};
Struct B
{int a;short b;char d;int c;};
A: 16,16
B:13,12
C:16,12
D:11,16
sizeof(A)=4+2+2(爲了對齊空出來)+4+1+3(爲了對齊空出來的)=16;sizeof(B)=4+2+2(足以存儲char,故追加後面)+4=12
17:袋中有紅球,黃球,白球各一個,每次任意取一個放回,如此連續3次,則下列事件中概率是8/9的是:
A: 顏色全相同
B:顏色不全相同
C:顏色全不同
D:顏色無紅色
全爲紅色的概率爲1/27.故顏色全相同的概率爲1/9
顏色全不同的概率爲3*(1/3*2*1/3*1/3)=2/3
顏色無紅色的概率爲8/27
顏色不全相同的概率:是全相同的互斥時間故1-1/9=8/9
18:一個洗牌程序的功能是將n張牌的順序打亂,以下關於洗牌程序的功能定義說法最恰當的是:
A: 每張牌出現在n個位置上的概率相等
B: 每張牌出現在n個位置上的概率獨立
C: 任何連續位置上的兩張牌的內容獨立
D: n張牌的任何兩個不同排列出現的概率相等
19:用兩種顏色去染排成一個圈的6個棋子,如果通過旋轉得到則只算一種,一共有多少種染色:
A: 10
B:11
C:14:
D:15
設黑白兩種顏色N(n)表示有n個黑色的種類
N(0)=N(6)=1;
N(1)=N(5)=1;
N(2)=N(4)=3;黑黑白白白白,黑白黑白白白,黑白白黑白白
N(3)=4 黑黑黑白白白,黑黑白黑白白,黑白黑白黑白,黑黑白白黑白白
故14
20:遞歸式的先序遍歷一個n節點,深度爲d的二叉樹,則需要棧空間的大小爲:
A: O(n)
B:O(d)
C:O(logn)
D:(nlogn)
因爲二叉樹不是完全二叉樹,故d!=lgn,
第二部分:多選
21:兩個線程運行在雙核機器上,每個線程主線程如下,線程1:x=1;r1=y;
線程2:y=1;r2=x;
X和y是全局變量,初始爲0。以下哪一個是r1和r2的可能值:
A: r1=1,r2=1
B: r1=1,r2=0
C:r1=0,r2=0
D:r1=0,r2=1
22.關於Linux系統的負載,以下表述正確的是:
A: 通過就緒和運行的進程數來反映
B: 通過TOP命令查看
C: 通過uptime查看
D: Load:2.5,1.3,1.1
表示系統的負載壓力在逐漸變小
23:關於排序算法的以下說法,錯誤的是:
A: 快速排序的平均時間複雜度O(nlogn),最壞O(N^2)
B:堆排序平均時間複雜度O(nlogn),最壞O(nlogn)
C:冒泡排序平均時間複雜度O(n^2),最壞O(n^2)
D:歸併排序的平均時間複雜度O(nlogn),最壞O(n^2)
24:假設函數rand_k會隨機返回一個【1,k】之間的隨機數(k>=2),並且每個證書出現的概率相等。目前有rand_7,通過調用rand_7()和四則運算符,並適當增加邏輯判斷和循環控制邏輯,下列函數可以實現的有:
A:rand_3B:rand_21 C:rand_23D:rand_49
網上搜的答案。。。。
1. 首先它是由兩個隨機變量組成,亦即7X+Y,只不過X與Y是獨立同分布的而已,所以上式子表示爲Z=7X+Y
那麼對於隨機變量X,你可以理解爲它是一個“量級”的概念,X取值爲1~7
當X=1時,隨機變量Z取值範圍是1*7+(1~7),也就是8~14
當X=2時,隨機變量Z取值範圍是2*7+(1~7),也就是15~21
當X=3時,隨機變量Z取值範圍是3*7+(1~7),也就是22~28
以此類推。。。
可以產生8~56的隨機數。
那麼產生的8~56的隨機數,概率都相等嗎?
答案是必然的,因爲X是量級的概念,達到每個量級的概率是1/7,在量級內,Y達到1~7每個數的概率依然是1/7,所以8~56的每個數的概率都是1/49
好了我們可以得到1/49等概率的8~56,直接在生產的時候-7,得到等概率1/49的1~49.。。。。
好,現在只需要記住,得到rand_49,1~49的每個數都是等概率的就可以了,因爲我們要截斷,也就是說,爲了得到rand_23直接截斷,判斷輸出如果>23,直接忽略,否則輸出,大家可能有點彆扭,因爲有的隨機數生成的時候可能時間上要比其他的長點。但是要記住,1~23每個數輸出的概率都是相等的,只不過不能保證每次輸出時間都分秒不差而已。時間長短是跟概率無關的概念
第三部份
1、兩個較長的單向鏈表a和b,爲了找出及誒單noed滿足node in a
並且node
in b
,請設計空間使用盡量小的算法(用c/c++,java
或者僞代碼)
2、當存儲數據量超出單節點數據管理能力的時候,可以採用的辦法有數據庫sharding
的解決方案,也就是按照一定的規律把數據分散存儲在多個數據管理節點N中(節點編號爲0,1,2,,,,N-1)。
假設存儲的數據時a 請完成爲數據a計算存儲節點的程序。
#define N 5
int hash(int element){
return element*2654435761;
}
int shardingIndex(int a){
int p = hash(a);
_________________________; //這裏是空格
return p;
}
3、宿舍內5個同學一起玩對戰遊戲。每場比賽有一些人作爲紅方,另一些人作爲藍方。請問至少需要多少場比賽,才能使任意兩個人之間有一場紅方對藍方和藍方對紅方的比賽?
4、一個有10億條記錄的文本文件,已按照關鍵字排好序存儲。請設計算法,可以快速的從文件中查找指字關鍵字的記錄