百度筆試題4

2021-05-23 18:51:36 字數 4763 閱讀 6165

、15分如下資料結構:

typedef struct treenode

請實現兩棵樹是否相等的比較

,相等返回

0否則返回其它值

.並說明你的演算法複雜度

int comptree(treenode* tree1, treenode* tree2);

注:a,b

兩棵樹相等當且僅當

roota->c==rootb->c

,而且a和b

的左右子樹對應相等或

者左右互換後相等.

answer

:http://www.gzu521.com/campus/article/it/200710/159904_3.htm 函式

btreeequal(bintreenode*t1

,bintreenode*t2)

的功能是遞迴法判斷兩棵二叉樹是否相等,若相等則返回

1,否則返回

0。函式中引數t1和

t2分別為指向這兩棵二叉樹根結點的指標。當兩棵樹的結構完全相同,並且對應結點的值也相同時才被認為相等。

已知二叉樹中的結點型別

bintreenode

定義為:

struct bintreenode;其中

data

為結點值域,

left

和right

分別為指向左、右子女結點的指標域,

【函式4.2

】int btreeequal(bintreenode*t1

,bintreenode*t2)

【答案】

(4)tl==null

‖t2==null(5)tl->data==t2->data

&&btreeequal(t1->left

,t2->left)

&&btreeequal(t1->right

,t2->right) 2

、已知乙個字串由

gbk漢字和

ansi

編碼的數字字母混合組成,編寫

c語言函式實現從中去掉所有

ansi

編碼的字母和數字

(包括大小寫

),要求在原字串上返回結果。

函式介面為:

int filter_ansi(char* gbk_string)

注:漢字的

gbk編碼範圍是

0x8140-0xfefe (

15分)

answer

:不採用移動的方法,而採用覆蓋,變數

j記錄新的字串的最後位置。遍歷字串

string

(變數i

),如果當前字元c是

ansi

編碼,那麼

a[j++]=c

;否則,

continue

,i++

。j=0;

for(i=0;i

else

string[j]=』/0』;//

加結束符}

3、30分

晶元測試:有2k

塊晶元,已知好晶元比壞晶元多.請設計演算法從其中找出一片好晶元,說明你所用的比較次數上限.

其中:好晶元和其它晶元比較時,能正確給出另一塊晶元是好還是壞.

壞晶元和其它晶元比較時,會隨機的給出好或是壞。

題目中給出的最重資訊是比較方法

. 根據比較方法

, 我們可以得出最重的結論是

, 如果兩個晶元兩兩比較出現了壞的情況

, 那麼這兩個晶元必有至少乙個是壞的

. 定義乙個方法

bcmp(a,b),表示a

和b兩兩比較

, 返回值

0表示至少有一塊晶元是壞的

, 1表示

a,b都是好的或者都是壞的

. 這個推理是充分的

, 但不是必要的.

因為好晶元比壞晶元多

, 所以從

2k塊晶元中隨機取出

k塊晶元必然有至少一塊好晶元

, 也可能全部都是好晶元

. 將這

k塊晶元中的隨機一塊基準晶元與其它所有的

k-1塊晶元進行

bcmp(),

如果全返回

1, 說明這

k塊晶元全部都是好晶元

, 因為如果至少有一塊壞晶元話

, 該壞晶元必能被其中至少的一塊好晶元檢測出來.

如果不是全部都是好晶元的情況

, 那麼當

bcmp()返回0

時, 同時將兩塊晶元排除

, 得到的

2(k-1)

塊晶元仍然滿足題設的條件

. 然後繼續進行二分.

如果k為1

時, 兩塊晶元都是好的.

該演算法最壞的情況是對晶元進行二分總是無法得到全部都是好晶元的情況

, 而且直到最後一次

bcmp

才返回0.

所以比較次數

((k-1)+(k-2)+...+1)*2=(k^2-k).

注意到bcmp()

進行再次比較.

解題思想

: 遞迴.

4、40分

請設計乙個網頁儲存系統,能儲存千萬量級的網頁。

要求:

1.支援按照

url為鍵值的隨機新增,刪除和修改網頁 2.

支援多個執行緒同時新增,修改和刪除 3.

支援多執行緒按照入庫時間批量的獲取網頁,並盡可能的快 提示

:設計應包括如下幾方面:

1.網頁的儲存方式設計

,即硬碟資料的組織形式 2.

如何支援隨機查詢 3.

如何優化批量檢索 4.

增刪改查之間的同步和互斥

,如何達到最大的併發.

系統限制和一些參考引數:

硬碟400g

, 記憶體4g

硬碟的i/o

比記憶體的

i/o速度慢

1000倍

硬碟的連續

i/o比隨機

i/o快10倍

網頁的平均長度為

25k

附加:請說明你的系統在億到十億規模的擴充套件方法.

方案一:

設計開始的考慮: 1

)平均每個網頁

25k,千萬個網頁就是

25k*1000w=256g

個位元組,

32位作業系統每個檔案

4g,那麼需要

(25k*1000w)/4g=62.5

個檔案來儲存所有網頁的內容。

給每個網頁分配乙個從

0開始的編號,編號順序及為入庫時間順序(也可以再做乙個時間與編號的對照表),網頁內容按編號順序連續儲存在多個內容檔案中。

索引資訊主要是,乙個

url包含多少個網頁、包含哪些網頁(指向內容檔案中網頁內容的指標)。 2

)如何支援隨機查詢

有個陣列按照網頁編號順序記錄每個編號的網頁內容在內容檔案中的指標。 3

)如何優化批量檢索

支援多執行緒檢索,將以前檢索的結果快取到記憶體 4

)增刪改查之間的同步和互斥

,如何達到最大的併發

新增的時候沒辦法,只能鎖住資訊,進行新增,不過可以先新增內容,因為內容是向後追加的,這時候不影響檢索和更新,最後再修改索引資料的時候加鎖。

遮蔽位,即用

1000

萬個位(約

1.25m

)的陣列記錄所有網頁,網頁編號表示這個網頁在遮蔽陣列中的遮蔽位是第幾位。

刪除的時候,將這個位陣列加鎖、置位、解鎖。

更新就是先刪除,再新增。

最後根據遮蔽位陣列定期對內容和索引進行維護,**浪費的空間。

資料的使用: 硬碟

400g

> 256g

說明方案可行 記憶體

4g具體做索引的時候會用到

硬碟的i/o

比記憶體的

i/o速度慢

1000

倍使用記憶體快取優化

硬碟的連續

i/o比隨機

i/o快10倍

內容連續儲存,可以一次性連續讀取某段時間的網頁內容。

網頁的平均長度為

25k判斷需要分檔案儲存。

最後資料億

~十億,就要分多台機器了。可以根據網頁

url雜湊到多台機器。

方案二:

第二道不錯

,基礎的

ir知識

隨機查詢可以使用

trie( <

演算法分析與設計

>)

硬碟使用大檔案偏移量來解決,

更新刪除可以寫入新的字元

,更新標記

,通過後期的檔案優化來**空間.

優化批量檢索如果指的是多個查詢請求的話可以基於

lexicon

的cache

如果是檢索中有多個

key word

可使用lucene

的skip data

來優化

至少多執行緒

,鎖應該不是好的解決方案

百度筆試題

一 選擇題 15分 共10題 1.在排序方法中,關鍵碼比較次數與記錄地初始排列無關的是 a.shell排序 b.歸併排序 c.直接插入排序 d.選擇排序 2.以下多執行緒對int型變數x的操作,哪幾個需要進行同步 a.x y b.x c.x d.x 1 3.void func 中,變數val的記憶體...

百度筆試題

一 選擇題 15分 共10題 1.已知乙個線性表 38,25,74,63,52,48 採用的雜湊函式為hash key key mod 7,將元素雜湊到表長為7的雜湊表中儲存。請選擇後面兩種衝突解決方法分別應用在該雜湊表上進行等概率成功查詢的平均查詢長度,拉鍊法 線性探測法 a.1.0 b.1.5 ...

百度筆試題

1 完成函式 size t foo unsigned int a1,size t al1,unsigned int a2,size t al2 其中a1和a2都為無符號陣列,al1和al2為陣列的長度,陣列的長度為偶數。無符號陣列由一對數字區間組成。如下例 a1 為 0,1,3,6,10,20 a2...