放假了,放个算法问题讨论

zhjie374 2005-04-29 10:26:05
要求:

扫描文件(文本文件),去看里面是否含有我定义的字符串集。

注意,要匹配的不是一个串,而是多个串。

为了简单,先扫英文的好了。

如果你的方法是一个串一个串的利用KMP BM比较,似乎没有什么意思。

谢谢参与
...全文
348 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhjie374 2005-05-13
  • 打赏
  • 举报
回复
google 的desktop可以下载安装的。
专门用来搜索本地机器上文件内的信息的。

比如你有很多WORD文件,想搜索内容“深入浅出”,直接就搜索出来了。
rancpine 2005-05-13
  • 打赏
  • 举报
回复
找个google的desktop装了试试
我下的这个软件是Beta版的
安装成功以后,软件提示要建立一个一次性建立的索引.
当然在这里不是讨论它怎么去建立索引,而是它为什么要建立索引?
很显然,要改善搜索的速度.
我试着查询了几个关键字,搜索的速度十分快,基本是瞬间就出结果.
然后我试图找它建立的索引文件,没找到.

在网上找到的一篇文章中提到"Google桌面搜索应用需要500 MB硬盘空间、最小128 MB RAM,推荐采用400 MHz(或更快)的Pentium处理器。"(http://tech.sina.com.cn/i/2005-03-07/1734543877.shtml)
但是我看了一下google桌面搜索的安装目录,才2MB

根据上述情况,我认为,这个软件基本上是通过海量的索引提供速度的 (速度好快~ -.-!)
就是说,是用了一个巨大的hash的表

但是是不是完全的hash我就不好说了
猜测应该不是,因为有个500MB的空间限制,可能是个改进版的hash法
rightyeah 2005-05-11
  • 打赏
  • 举报
回复
我还是觉得一个一个模式去匹配比较快,尤其是当各个模式相互没有什么关联的时候
rancpine 2005-05-11
  • 打赏
  • 举报
回复
没用过...即使用过也不知道哪个是google的desktop搜索,汗~
简介一下?
rancpine 2005-05-11
  • 打赏
  • 举报
回复
用unicode是个好主意呀
如果用unicode的话,建树时就应该用一个16位的二进制数来表示一个单位字.

扩展到汉字的匹配上的确会出现如楼上说述的问题:汉字串大部分都是无关的,那么建出来的树的大小就不好估计了,但是树的节点数一定等于字符串集里不同的字符数.所以,我的意思是,即使把一堆没有联系的串形成一棵用于搜索的树,也只好忍受这个复杂度的树-.-!

不知道有没有优化的方法... 感觉我的思路比较常规,基本上是无可奈何的办法
Zephyrzzz 2005-05-11
  • 打赏
  • 举报
回复
用后缀树吧.
zhjie374 2005-05-11
  • 打赏
  • 举报
回复
你们有没有用过google的desktop搜索。
非常的快,不知道它怎么做的?

树肯定在目前是一个最好的办法。但是想到UNICODE我就觉得不好实现。
zhjie374 2005-05-10
  • 打赏
  • 举报
回复
恩,想法不错。没有时间实现。

但是理论上没有问题。

但是如果要改进成中文呢?UNICODE?
树的节点怎么弄?
GetTheWorld 2005-05-10
  • 打赏
  • 举报
回复
似乎要把一堆没有联系的串形成一棵用于搜索的树 ?? 呵呵 我不知道
GetTheWorld 2005-05-09
  • 打赏
  • 举报
回复
楼上的想法不错
rancpine 2005-05-09
  • 打赏
  • 举报
回复
没看出门道……单纯支持下讨论
ps:字符串集不是一个大号的字符串么?-.-!

or,题目的意思是把所有能匹配的,又在字符串集中有定义的串,都找出来?
rancpine 2005-05-09
  • 打赏
  • 举报
回复
我的想法:
首先要建一颗树,每一层上最多有26个节点,每一条从根到叶子的路径都对应字符串集里的一个词。
然后对这个树用改进版的KMP,就是每次比较的时候对每一层的节点都枚举一遍,如果节点A匹配当前字符,则从节点A的子孙节点里枚举匹配下一个字符。所以,如果在节点A的子孙节点中找不到可匹配当前字符的节点,就象KMP算法一样重新开始匹配……
zhjie374 2005-05-09
  • 打赏
  • 举报
回复
字符串集就是说一个集合{study,some,ok,nba,jordan}
在你的目标文本中查看是否含有其中的一个,并记录。
qrlvls 2005-05-09
  • 打赏
  • 举报
回复
学习
zhjie374 2005-05-08
  • 打赏
  • 举报
回复
放假回来了,说了半天都是停留在表面。
向下深入的没有。
继续讨论。
yelling 2005-05-08
  • 打赏
  • 举报
回复
好像是编译里的用到的算法阿
lobatt 2005-05-03
  • 打赏
  • 举报
回复
我想应该可以先把自己的pattern集按字母顺序生成一颗树,共同前缀作为树枝节点,完整的一个pattern作为叶子节点,然后用这棵树来匹配文件,这之后用什么匹配算法都无所谓了,哪个快用那个
,只是算法可能要改写一下,会稍微复杂一点
trackant 2005-05-03
  • 打赏
  • 举报
回复
用有限状态自动机即可,不需要一个一个匹配,而且允许使用正则表达式的串形式。理论上可以化简到最少状态数来识别给定的模式集。
考虑一下lex的工作原理就明白了
hj5182001 2005-04-30
  • 打赏
  • 举报
回复
什么叫多模式匹配?
ywqzxj 2005-04-30
  • 打赏
  • 举报
回复
我的理解:程序总得一个个去比较,或许按不同的顺序效率不一样,要不再研究“定义的字符串集”里字符串之间有什么内在联系吧(高层次KMP、BM?)。
加载更多回复(2)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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