算法的力量--过滤关键字的快速算法(一)

(请尊重作者知识产权,在引用转载时请注明出处)

 

在很多情况下都需要过滤关键字的程序,比如短信网关检查下行的信息是不是合法信息,论坛的贴子包不包含非法关键字等等,通过这篇文章我给大家介绍一种比较简单高效的解决方案

 

首先要解决的是关键字库问题,我们这里指的不是如何去收集这些关键字,而是假设关键字库已经存在,我们如何存放这些关键字的问题,给我们的选择不多,要么是hash表,要么是二叉树,其他数据结构要么不便于维护要么搜索复杂度太高,这里我们用C++语言来实现,首先来定义一个管理关键字库的类

class CKeyWordManager

{

public:

     // load 关键字到内存

     bool load ();

 

     // 查找data中有没有包含指定的关键字

     bool find (const string & data);

 

private:

     set <string>  m_keyWordList;

     int           m_keyWordMaxLength; //最长关键字的长度

};

 

我们用一个set来存放所有的关键字列表,set是一种红黑树,是一种高效的搜索二叉树,当然这里也可以使用hash_set来实现

 

这程序的关键是在于find方法,data内容可能很大,而且可能调用频率很高,我们有必要采用一种高效的方法来实现这一功能,基本思路是这样的:首先从data0字符查找,检查第0个字符有没有在m_keyWordList中出现,如果有,返回真,如果没有,继续检查第0个和第1个字符有没有在m_keyWordList中出现过,……一直检查到0~n(n=m_keyWordMaxLength)数据,请看源码:

bool CKeyWordManager::find(const std::string &key)

{

     for (int n = 0; n < key.length (); ++n)

     {

         for (int i = 1; i < m_keyWordMaxLength && i + n < key.length (); ++i)

         {

              set <string>::iterator it = m_keWordList.find (key.substr (n, i));

 

              if (it != m_keyWordList.end ())

                   return true;

         }

     }

 

     return false;

}

 

在这个解决方案中,如果m_keyWordList中的key大小分布比较小的话效率会很好,但是如果m_keyWordMaxLength非常大,那这种算法的效率也非常低,关于m_keyWordMaxLength特别大的情况(一般超过了20)的解决方式,我会在下一片文章中介绍

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值