多模式匹配问题

Buttonfly_Huang 2009-02-06 04:49:37
加精
从一个文本文件中查找到是否有关键字列表中的关键字,关键字数量约为5万条左右,文本文件的大小不定。哪位大侠有没有更好的提议或方案?先谢过,重分悬赏!
...全文
2161 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
virtualxmars 2012-10-27
  • 打赏
  • 举报
回复
这肯定是ACKMP算法了,将对模式的搜索转换成状态机的命中问题。可以提供的好处有:
1.速度快
2.不需要对数据进行回退,也就是不需要所谓的数据分块,然后再分别对分块数据搜索、去重这些多余的操作
至于具体过程可参见《数据结构与算法》、《算法导论》等书籍,或谷歌、百度

当然了,难点也有,就是对算法的理解,以及对状态key数组的生成
jameslau6 2010-10-27
  • 打赏
  • 举报
回复
看到这么多人的回复,感觉自己才刚上路呢
cnhome 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 wtudnuemc 的回复:]
不错不错,俺就支持你了,,,顶你个肺呀
[/Quote]

正则表达式是万万不可的
remain5000 2009-05-11
  • 打赏
  • 举报
回复
不是有Blizzard mpq?
mLee79 2009-02-16
  • 打赏
  • 举报
回复
比较无聊的用 有穷自动机 写了一个, 在 16M 的随机的文本中搜索, 内存耗用大约 100字节/模式, 如果不保存原始模式字符串则为 50字节/模式左右, 稍微改下可以支持正则表达式形式的模式字符串

64K 模式的情况下 耗时3.1秒左右, 大约 300K 次匹配.
32K 模式的情况下 耗时1.6秒左右, 大约 155K 次匹配.
16K 模式的情况下 耗时1.3秒左右, 大约 76K 次匹配.
10K 模式的情况下 耗时1.1秒左右, 大约 48K 次匹配.

不想整理代码了, 就扔在 http://x4c.googlecode.com/svn/trunk/x4c/build/win32/mpm/mpm.c 了, 仅供参考

barech 2009-02-16
  • 打赏
  • 举报
回复
很高深,顶一下吧,继续关注这个帖子

不过,楼主确实应该先提出自己的方法
bbqqqbq 2009-02-16
  • 打赏
  • 举报
回复
类似于脏字处理啊,看看这些对你有没有帮助
http://www.cnblogs.com/xingd/archive/2008/02/01/1061800.html
http://www.cnblogs.com/bbqqqbq/archive/2008/12/10/1352142.html
ggeneral2 2009-02-16
  • 打赏
  • 举报
回复
50000个不算少。可以用HASH。甚至放在数据库里。用数据库查询。省事情。如果是在单片机上运行,那只能用稍微低级点及费脑点的办法了。
feng_0922 2009-02-15
  • 打赏
  • 举报
回复
看不太懂,来学习学习。
bingzhu 2009-02-15
  • 打赏
  • 举报
回复
lz可以变相的找入侵检测模式匹配方面的算法 以前见过一个算法性能过的去也不怎么吃内存 算法名忘了叫啥-_-!
PepperYoung 2009-02-15
  • 打赏
  • 举报
回复
多模匹配,
pattern数量如果很少,
通常情况下(文本),多模bm系的算法性能很好。如果为了防攻击,追求最差情况下的性能,如楼上同学所说,建议用ac系的算法。

对于这种模式,(pattern数量较多、文本长度也可能很大)。
bm系(mwm),性能下降得很厉害;ac系的算法,内存基本吃不消。

通常采用,压缩trie树的办法进行,
例如,中文切词(几十万词),就是用的这个算法。
具体来说,建议用double array压缩trie tree。性能、内存使用综合素质比较高。
个人觉得实现得比较好的double array是下面这个日本人写的:http://chasen.org/~taku/software/darts/

希望有所帮助
glkyer 2009-02-14
  • 打赏
  • 举报
回复
学习了!
:)
cnhome 2009-02-13
  • 打赏
  • 举报
回复
:)hash比较费空间,看你的数据量了
DalyQiao 2009-02-13
  • 打赏
  • 举报
回复
用正则表达式
haowen_hero 2009-02-13
  • 打赏
  • 举报
回复
!
独行侠客2 2009-02-13
  • 打赏
  • 举报
回复
你这个问题规模可能较大,要构造有实用价值的算法,还得找另外的约束,因此,必须要描述你的应用场景。
梦无痕123 2009-02-13
  • 打赏
  • 举报
回复
关键字组合哈希索引,文本分词查找
smq123 2009-02-13
  • 打赏
  • 举报
回复
你这个问题规模可能较大
wtudnuemc 2009-02-13
  • 打赏
  • 举报
回复
不错不错,俺就支持你了,,,顶你个肺呀
qq709394a 2009-02-12
  • 打赏
  • 举报
回复
ewwewe
加载更多回复(32)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧