1. 假設乙個 *** 搜尋引擎收錄了 2^24 首歌曲,並記錄了可收聽這些歌曲的 2^30 條 url,但每首歌的 url 不超過 2^10 個。系統會定期檢查這些 url,如果乙個 url 不可用則不出現在搜尋結果中。現在歌曲名和 url 分別通過整型的 song_id 和 url_id 唯一確定。對該系統有如下需求:
1) 通過 song_id 搜尋一首歌的 url_id,給出 url_id 計數和列表
2) 給定乙個 song_id,為其新增乙個新的 url_id
3) 新增乙個新的 song_id
4) 給定乙個 url_id,將其置為不可用
限制條件:記憶體占用不超過 1g,單個檔案大小不超過 2g,乙個目錄下的檔案數不超過 128 個。
分析:song_id和url_id都從0開始。
一首歌曲的最大url列表的大小:2^10 * 4 = 2^12 byte = 4 kb
乙個檔案最多容納歌曲數目:2g / 4kb = 2*2^30 / 2^12 = 2^19
最少檔案數目:2^24 / 2^19 = 2^5 = 32
解答:1、檔案系統
檔案以二進位制格式儲存資料,以file_id唯一確定,從0開始。
乙個檔案容納歌曲數目為song_count = 2^18,需要的檔案數目為file_count = 64。
檔案儲存的資訊分為兩部分:在檔案頭部儲存歌曲資訊:歌曲id,能收聽該歌曲的url數目,url列表在檔案中的偏移量,即:song_id,url_count,url_offset。一首歌曲占用song_info_size = 12byte,所有歌曲占用即檔案頭部大小為song_count*song_info_size。下一部分對於每一首歌曲,按順序儲存其url列表,一首歌曲的url列表占用song_url_size = 4kb,所有歌曲占用song_count*song_url_size。
所有的歌曲無論存在與否,都寫入檔案,預先占用空間。若歌曲不存在,其song_id設定為-1,其餘資料未定義。
給定一首歌曲的song_id,確定它的位置:儲存它的檔案file_id = song_id / song_count,在檔案中的偏移量是file_offset = song_id % song_count * song_info_size。
再用另外乙個檔案儲存所有的url是否可用,乙個url對應乙個bit,1為可用,0為不可用,占用2^30bit。
2、主系統
採用快取方案,使用者查詢時,先從快取中查詢,若找到,直接返回,若找不到,從檔案中查詢,並讀取到快取中。
使用者查詢系統,分層:一是接入層,接收使用者查詢請求,將請求存到請求佇列,從響應佇列取出響應,傳送給使用者;二是業務邏輯層,從請求佇列讀取請求,呼叫快取系統的方法得到歌曲資料,處理,將響應存到響應佇列。接入層需要管理大量socket,windows平台使用io完成埠,linux平台使用epoll。在多核平台,業務邏輯層可使用執行緒池。
快取系統,使用雜湊表儲存歌曲資訊,以song_id為鍵,url列表為值,保持2^10首歌曲資訊。快取系統負責,從檔案中讀取歌曲資訊和url資訊,將改變了的歌曲資訊或url資訊存回檔案,以老化演算法定期清理最近最少訪問的歌曲。
給定乙個 song_id,為其新增乙個新的 url_id,二叉查詢新url應該在的位置,可能需要將該位置以後的url_id集體後移。
百度筆試題
一 選擇題 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...