歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 百度2012實習生校園招聘筆試題

百度2012實習生校園招聘筆試題

日期:2017/2/28 15:30:45   编辑:Linux教程

1、給一個單詞a,如果通過交換單詞中字母的順序可以得到另外的單詞b,那麼b是a的兄弟單詞,比如的單詞army和mary互為兄弟單詞。
現在要給出一種解決方案,對於用戶輸入的單詞,根據給定的字典找出輸入單詞有哪些兄弟單詞。請具體說明數據結構和查詢流程,要求時間和空間效率盡可能地高。
字典樹的典型應用,一般情況下,字典樹的結構都是采用26叉樹進行組織的,每個節點對應一個字母,查找的時候,就是一個字母一個字母的進行匹配,算法的時間復雜度就是單詞的長度n,效率很高。因此這個題目可以定義一個字典樹作為數據結構來查詢的,時間效率會很高,這樣就轉化為在一棵字典樹中查找兄弟單詞,只要在字典樹中的前綴中在存儲一個vector結構的容器,這樣查找起來就是常數級的時間復雜度了,效率很高的。。
數據結構可以定義如下:

  1. struct word
  2. {
  3. vector<string> brother; // 用於保存每個單詞的兄弟單詞
  • word *next[26]; // 字典樹中每個節點代表一個字符,並指向下一個字符
  • };

如上述數據結構所示,字典樹的建立是在預處理階段完成的,首先根據字典中的單詞來建立字典樹,建立的時候,需要稍微特殊處理一下,就是比如pots、stop和tops互為兄弟單詞,那麼在字典中按照首字母順序的話,應該先遇到pots單詞,那麼我首先對其進行排序,結果是opts,那麼字典樹中就分別建立4個節點,分別為o->p->t->s,當然這個是不同層次的,在節點s處的vector容器brother中添加單詞pots,遇到stop的時候,同樣的方法,排序是opts,此時發現這4個節點已經建立了,那麼只需要在第四個節點s處的vector容器brother中添加單詞stop,tops單詞的處理方法是同樣的。
這樣建立完字典樹後,查詢兄弟單詞的效率就會很高了,比哈希的效率還要高;查到tops的兄弟的單詞的時候,首先排序,那麼就是opts,然後在字典樹中查找opts,在s處將其vector容器brother中的的單詞輸出就是tops的所有兄弟單詞。
2、系統中維護了若干數據項,我們對數據項的分類可以分為三級,首先我們按照一級分類方法將數據項分為A、B、C......若干類別,每個一級分類方法產生的類別又可以按照二級分類方法分為a、b、c......若干子類別,同樣,二級分類方法產生的類別又可以按照是三級分類方法分為i、ii、iii......若干子類別,每個三級分類方法產生的子類別中的數據項從1開始編號。我們需要對每個數據項輸出日志,日志的形式是key_value對,寫入日志的時候,用戶提供三級類別名稱、數據項編號和日志的key,共五個key值,例如,write_log(A,a,i,1,key1),獲取日志的時候,用戶提供三級類別名稱、數據項編號,共四個key值,返回對應的所有的key_value對,例如get_log(A,a,i,1,key1),
請描述一種數據結構來存儲這些日志,並計算出寫入日志和讀出日志的時間復雜度。

Copyright © Linux教程網 All Rights Reserved