非法詞判斷

一個大文件,裏面存儲了一批非法詞,每行一個詞。算法

需求是,我隨便給你一句話,能快速的判斷出這句話是否包含了非法詞,具體哪些非法詞? 大數據

第一個關注點->算法操作系統

//////////////////////////////////////////////////////////////////////////////////內存

這個問題,常規的作法hash

1:逐行讀文件,寫到HashSet原理

2:forHashSet,對於每一個word進行sentence.indexOf(word)>-1判斷循環

經過循環Set的方式提取出句子中的非法詞。遍歷

時間複雜度很容易獲得:O(n),得留意下這裏說的是大文件,這個n很大。能不能快一點呢?技術

//////////////////////////////////////////////////////////////////////////////////文件讀取

使用Trie樹

1:把文件中全部的非法詞遍歷出來,構建一顆Trie樹

2:利用Trie樹對sentence作分詞處理("正向/反向最大匹配", "長詞優先" 等策略),分得出來的詞,則說明該sentence含有對應的非法詞

Trie樹查詢時間複雜度O(1),這裏忽略分詞算法時間複雜度

這裏真的就完美了嗎?注意大文件Trie樹利用HashMap作節點,巨耗空間,等因而在用空間換時間,能夠考慮改進爲DoubleArrayTrie樹。有沒有更好的方案?

//////////////////////////////////////////////////////////////////////////////////

使用BloomFilter

把字典壓入BloomFilter

跟Trie樹作分詞差很少,只不過BloomFilter能更高效的利用空間。可是有小几率出現誤判,在大數據面前無所謂了

檢查時間複雜度依然是O(1),但空間的話能夠省不少,即使是怕hash衝突,作多個BloomFilter

第二個關注點->如何加速文件讀取速度,若是10GB怎麼辦?

這個方向我確實沒有什麼特別好的策略

惟一我知道的,能用文件內存映射技術實現IO加速

原理是,JVM要把文件讀取到堆,通常狀況下會通過文件->內核內存->JVM工做內存,中間存在一個數據拷貝的過程。

現代操做系統都使用虛擬內存,能夠把多個虛擬地址能夠映射到相同的物理地址,省去內核和用戶空間之間的拷貝。

另一種思路就是,把這個文件的信息,寫入到HDFS上面去。加載的時候從HDFS上面拿,由於數據被打散到多臺節點,我想讀取的時候速度應該會快些。

相關文章
相關標籤/搜索