有1千萬條簡訊,找出重複出現最多的前10條

2021-08-17 17:08:09 字數 1134 閱讀 3866

解析:對於本題來說,某些面試者想用資料庫的辦法來實現:首先將文字匯入資料庫,再利用select語句某些方法得出前10條簡訊。但實際上用資料庫是滿足不了5分鐘解決這個條件的。這是因為1千萬條簡訊即使1秒鐘錄入1萬條(這已經算是很快的資料錄入了)5分鐘才300萬條。即使真的能在5分鐘內錄入完1千萬條,也必須先建索引,不然sql語句5分鐘內肯定得不出結果。但對1千萬條記錄建索引即使在5分鐘之內都不可能完成的。所以用資料庫的辦法是不行的。

答案:方法1:可以用雜湊表的方法對1千萬條分成若干組進行邊掃瞄邊建雜湊表。第一次掃瞄,取首位元組,尾位元組,中間隨便兩位元組作為hash code,插入到hash table中。並記錄其位址和首席資訊官度和重複次數,1千萬條資訊,記錄這幾個資訊還放得下。同hash code且等長就疑似相同,比較一下。相同記錄只加1次進hash table,但將重複次數加1。一次掃瞄以後,已經記錄各自的重複次數,進行第二次hash table的處理。用線性時間選擇可在o(n)的級別上完成前10條的尋找。分組後每份中的top10必須保證各不相同,可hash來保證,也可直接按hash值的大小來分類。

方法2:可以採用從小到大排序的方法,根據經驗,除非是**的過節簡訊,否則字數越少的簡訊出現重複的機率越高。建議從字數少的簡訊開始找起,比如一開始搜乙個字的簡訊,找出重複出現的top10並分別記錄出現次數,然後搜兩個字的,依次類推。對於對相同字數的比較常的簡訊的搜尋,除了hash之類的演算法外,可以選擇只抽取頭、中和尾等幾個位置的字元進行粗判,因為此種判斷方式是為了加快查詢速度但未能得到真正期望的top10,因此需要做標記;如此搜尋一遍後,可以從各次top10結果中找到備選的top10,如果這top10中有剛才做過標記的,則對其對應字數的所有簡訊進行精確搜尋以找到真正的top10並再次比較。

方法3:可以採用記憶體對映的辦法,首先1千萬條簡訊按現在的簡訊長度將不會超過1g空間,使用記憶體對映檔案比較合適。可以一次對映(當然如果更大的資料量的話,可以採用分段對映),由於不需要頻繁使用檔案i/o和頻繁分配小記憶體,這將大大提高資料的載入速度。其次,對每條簡訊的第i(i從0到70)個字母按ascii嘛進行分組,其實也就是建立樹。i是樹的深度,也是簡訊第i個字母。

該問題主要是解決兩方面的內容,一是內容載入,二是簡訊內容比較。採用檔案記憶體對映技術可以解決內容載入的效能問題(不僅僅不需要呼叫檔案i/o函式,而且也不需要每讀出一條簡訊都分配一小塊記憶體),而使用樹技術可以有效減少比較的次數。

找出陣列中是否有重複的數

2010 09 09 23 03 59 分類 c c 標籤 c 字型大小大中小 訂閱 陣列a n 1至n 1這n 1個數存放在a n 中,其中某個數重複一次。寫乙個函式,找出被重複的數字。時間複雜度必須為o n 函式原型 int do dup int a,int n 假金條的數學思想 此演算法題借鑑...

找出陣列中是否有重複的數

題目是這樣的,陣列是無序的,可能沒有重複的數,但最多隻可能有乙個重複的數,要求用最快的方法找到是否有重複的數。乍一想,挺難的,但是其實非常的簡單。解決辦法 陣列a n 1 至n 1 這n 1 個數存放在 a n 中,其中某個數 重複一次 寫乙個函式,找出被重複的數字。時間複雜度必須為o n 函式原型...

1 找出陣列中重複的數字

方法1 通過構建hashmap,記錄每個值的重複情況。複雜度 o n o 1 class solution mapmap new hashmap for int i 0 i nums.length i else return 1 方法2 由於題目特徵,構建1 n 1的桶 將每個數字放到對應下標的正確...