运用aho corasick算法的 trie树实现的快速关键词查找
将所有的关键词组织成 trie 树。在查找关键词时,只要对原文扫描一次就可以找出所有的关键字。假设有一遍文章要发表。在发表之前要检查文章内是不是有不文明用语。通常的做法是拿每一个不文明用语到原文里做子串的查找。算法的复杂度为 O(m*n) , m为关键语数量,n 为文章长度。
采用 trie 树后,算法复杂度为 O(n), n 为文章长度。
参见 test_keyword_finder 工程内的示例代码
- 假设存在这一组关键词(气枪瞄准镜,瞄准),用“气枪瞄准不了”这句话来匹配的话,无法匹配到“瞄准”这个词。因为在trie树中查找时走到前一个词的分支,当发现匹配失败时“不“所在的节点的返回边指向了根节点。这个问题在当前的数据结构下暂时没有很好的解决办法。
- 上面的问题想到办法了。在遍历树的每一个节点的时候,检查到节点不是关键节点就检查它的返回边指向的节点是不是关键节点。如果是则把这个节点对应的关键词加入匹配成功列表中。
现在要从关键节点中取出关键词要从节点向根回溯一次再做反转。可以在每个关键节点存储关键词。这样就不用回溯了。这是一个空间换时间的办法
同时支持 linux 和 windows 平台