一個檔案,內含一千萬行字串,每個字串在1K以內,要求找出所有相反的串對

dongyu2013發表於2014-05-17

一個檔案,內含一千萬行字串,每個字串在1K以內,要求找出所有相反的串對


一個檔案,內含一千萬行字串,每個字串在1K以內,要求找出所有相反的串對,如abc和cba。

當時怎麼想的忘記了,現在重新思考一下,檔案的大小上限是10G,不可能在記憶體操作了。考慮設計一種hash使得如果兩個字串維相反串能得出相同的hash值,然後用該hash將檔案中的字串雜湊到不同的檔案中,再在各檔案中進行匹配。比如這樣的hash函式對字串上所有字元的ascii求和,因為長度在1K以內,因此範圍在int之內。更進一步,可以在上面那個hash後面再加一個字串長度,可以得到更好的雜湊效果。(例如,a2b1c5,統計按照每個字母出現的次數進行一步的hash)

在各個單獨檔案中匹配時,如果採用的是第二種hash函式,那麼該檔案中的所有字串都有相同的長度。如果hash效果好,那麼這個檔案應該小到可以在記憶體中進行操作了。將檔案拷貝為兩份,分別按照不同規則hash:第一份按前k位雜湊,第二份將字串的頭尾進行顛倒後按前k位雜湊(只是對於排序演算法顛倒,不必實際顛倒)。這裡的按前k位雜湊只需要前k位相同能得到相同結果就好,比如第i位的ascii乘以2^i。兩份拷貝中hash值相同的就很可能是要求的相反串對了,再進行實際匹配,工作量應該就可以接受了。

第二步,將第一份字串放入hash_set中,然後將第二份的字串以顛倒的字串求hash_set,檢視是否在hash_set中,注意字串中字母完全相同的情況


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29012686/viewspace-1163147/,如需轉載,請註明出處,否則將追究法律責任。

相關文章