首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

*匹配有关问题

2012-03-29 
*匹配问题有大量的已知的串, 有些串是带通配符的, 如affc*或abc*.txt 或 *.txt假设有类似这样的串几千条,

*匹配问题
有大量的已知的串, 有些串是带通配符的, 如 affc* 或 abc*.txt 或 *.txt  
假设有类似这样的串几千条, 有什么快速的算法知道某一个字符串是否匹配已知串, 如 abccccccc.txt 可以匹配到  
abc*.txt, 匹配到即返回了。

[解决办法]
把abc*.txt做成DFS(有限状态确定自动机),看abccccc.txt是否在DFS中能到达终点
[解决办法]
DFS 是深度优先搜索
DFA 是有限状态确定自动机, 你写错了。

如果用 DFA, 能不能把DFA生成过程及匹配过程大概描述下?
[解决办法]

探讨

DFS 是深度优先搜索
DFA 是有限状态确定自动机, 你写错了。

如果用 DFA, 能不能把DFA生成过程及匹配过程大概描述下?

[解决办法]
用脚本用正则库。

状态机太底层了,而且不容易理解,c/C++也有正则库的。
[解决办法]
探讨

有没有认真一点的回复?
4 楼为什么确定要顺序遍历, 这应该是最差的做法。
5 楼的也看不明白。
6 楼的用脚本明显不行, 性能太差。

DFA 应该能搞定这个问题的, 请问有没有熟悉DFA的, 大概讲下流程就行, 我只需要支持 *, 不用?之类的。
谢谢。

[解决办法]
如果模式串里只有一个‘*’,转DFA还是不算太难
如果‘*’很多的话就比较麻烦
[解决办法]
如果只有几千条可以把这几千条做成一个大的状态机,比如"abc*.txt" | "def*.txt" | "ghi*.txt" ... ,要注意的是状态机的'*'号和通配符'*'是有不同意义的。但是采用这么大的状态机,效率不会好到哪去,但是如果有一些已知条件,可以大大简化状态机。

如果已知字符串有共同同缀什么的,可以采用TST。如果有共同后缀,可以采用后缀树什么的,都是一种状态机的化简。建立状态机时,把'*'号去掉,并在前一个字串对应的节点把loop标志位设为true。搜索时可以按图的算法搜索,搜索的复杂度与状态机的大小成正比。

热点排行