一個檔案,內含一千萬行字串,每個字串在1K以內,要求找出所有相反的串對
一個檔案,內含一千萬行字串,每個字串在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux - 查詢目錄下的所有檔案中是否含某個字串Linux字串
- 每天一個 PHP 語法二字串使用及內部結構PHP字串
- 判斷一個字串是否包含一個子串的方法字串
- 轉:一個在文字檔案搜尋指定字串的程式字串
- C# 輸出一個字串的字首、字尾和它的子串(資訊內容安全 實驗一)C#字串
- 找出倆個字串的相同並刪除字串
- js替換字串中的所有指定內容JS字串
- 兩個字串的最長公共子串字串
- 查詢含特定字串的檔案 (轉)字串
- 總結:44個Python3字串內建方法大全及示例Python字串
- Python判斷一個檔案中的字串是否存在於另外一個檔案中Python字串
- 搜尋檔案下包含某個字串的檔案字串
- 一個對檔案內容定位分析修改的問題,謝謝!
- 教你一招!Python讀取檔案內容為字串的方法Python字串
- python實現將資料夾內所有txt檔案合併成一個檔案Python
- (字串動態規劃)一個字串變成另一個字串的步驟數字串動態規劃
- mysql 擷取指定的兩個字串之間的內容MySql字串
- 一串字串的翻轉字串
- 將字串每一個單詞第一個字元設定為大寫字串字元
- 【轉】linux查詢目錄下的所有檔案中是否含有某個字串Linux字串
- 計算兩個字串最大公有子串字串
- 檔案 編碼為Base64字串字串
- Python查詢包含指定字串的所有檔案Python字串
- 判斷某一個字串是否存在另一個字串中字串
- . 【JAVA】給定任意 字串"yekmaakkccekymbvb",求出字串中有多少種字元,以及每個字元的個數?Java字串字元
- 使用正規表示式找出所有不包含某字串的行字串
- 動態規劃題:把一個字串變為迴文串動態規劃字串
- SPOJ 694 求一個字串有多少子串 字尾陣列字串陣列
- Shell 命令求兩個檔案每行對比的相同內容
- Scala Essentials: 字串內插字串
- 內部類,Object,字串Object字串
- 檢測一個字串是否在jvm的常量池中字串JVM
- 在一個xxx.java檔案裡寫多個類(非內部類)Java
- 28. 找出字串中第一個匹配項的下標 Golang實現字串Golang
- Java演算法面試題(003) 如何檢查一個字串是另外一個字串的旋轉字串Java演算法面試題字串
- 使用python遍歷一個目錄下所有的檔案併合並內容Python
- 【JavaScript使用技巧】三個擷取字串中的子串,你用的哪個JavaScript字串
- 列舉範圍內的字串字串