一個大文件,裏面存儲了一批非法詞,每行一個詞。算法
需求是,我隨便給你一句話,能快速的判斷出這句話是否包含了非法詞,具體哪些非法詞? 大數據
第一個關注點->算法操作系統
//////////////////////////////////////////////////////////////////////////////////內存
這個問題,常規的作法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上面拿,由於數據被打散到多臺節點,我想讀取的時候速度應該會快些。