非法词判断

一个大文件,里面存储了一批非法词,每行一个词。算法

需求是,我随便给你一句话,能快速的判断出这句话是否包含了非法词,具体哪些非法词? 大数据

第一个关注点->算法操作系统

//////////////////////////////////////////////////////////////////////////////////内存

这个问题,常规的作法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上面拿,由于数据被打散到多台节点,我想读取的时候速度应该会快些。

相关文章
相关标签/搜索