关于正则表达式文件匹配问题

2013-03-07 11:59:08
找出一个最优正则表达式,使其能匹配的待操作文件最多,但不能匹配任何不进行操作的文件,所找出的正则表达式的长度还应是最短的。
由文件input.txt 提供输入数据。文件由n(1≤n≤250)行组成。每行给出一个文件名。文件名由英文字母 和数字组成。英文字符要区分大小写,文件名长度不超过8个字符。文件名后是一个空格符和一个字符“+”或“-”。“+”表示要对该行给出的文件进行操作,“-”表示不进行操作。

实在不懂,请各位指教!

分析如下:
由于在目录下的文件制定,因此很难确定一种能直接寻找最优正则表达式的解析方法,在这种情况下,势必采取回溯法:从空串出发出发,从可选字符集中挑选字符式填入当前正则式,并计算所能匹配的待操作文件数。在搜索了正则表达式左右可能形式后,辨得出匹配的待操作文件数最多且长度最短的一个表达式。设:
bestm---最优正则表达式所能匹配的到操作文件数,初始值巍0;
best1---最优表达式的长度,初始值为9(最优表达式的长度最大为8);
len---当前正则表达式的长度,初始值为0;
match---可能被匹配的最多文件数,初始值设为带操最文件数;
del---第i个文件可能被当前正则表达式的扩展形式(正则表达式*)所匹配的标志。
del[i]= 0,第i个文件可能被匹配;
≠0,第i个文件不可能被匹配。
初始时,所有文件设置为可能匹配标志。在搜索过程中,某个文件j(1≤j≤n)不能匹配当前正则表达式*,则说明当前正则表达式无论怎样延伸,文件j都不可能与其匹配,因此取消文件的可能匹配标志(使del[j] ≠0)。如果文件j为一个待操作,则match-1。设置match这个变量为了设置搜索槛值和递归边界的需要,每增加正则表达式一个字符时,如果发现match<bestm,或者match=bestm,但是当前正则表达式的长度len≥best1,则放弃,因为它不可能构成最优。递归搜索的前提条件是Match<>0。否则,当前正则表达式无一可匹配的待操作文件,自然也就失去了递归搜索的下一个字符的必要。
同样,在搜索的过程中,如果发现一个可能被匹配的不进行操作文件i(del[i]=0)能与当前正则表达式匹配,则断定当前正则表达式非法,因为要找的正则表达式不能匹配任何不能够操作的文件。
3、回溯搜索的过程有一个称谓Run的递归算法描述:
Produce Run(Len);
begin
if Len>0 then
begin
搜索所有可能匹配(del值为0)且匹配当前正则表达式的文件
if 所有文件为待操作文件
then begin
计算匹配的文件数j;
if(j>bestm) or (j=bestm) and (len<best1)
then begin
当前正则表达式作为最优方案记录如下;
bestm ← J;best1 ← len;exit
end;{then}
end;{then}
end;{then}
len ← len-1;
if(Match<bestm)or(len>8)or(Match=bestm)and(len≥best1)then exit;
for i:=1 to 可选字符集的字符个数 do
if(len=1)or(可选字符集第i个的字符<>'*')or
(当前正则表达式的第len-1个字符非'*'或'?')
then begin
可选字符集的第i个字符集进入当前正则表达式;
搜索所有文件,取消不能够匹配当前正则表达式*的文件的可能的匹配标志,
Match减去它们中间带操作文件的数量;
if match<>0 then Run(len);
恢复递归前所有文件的del值、match值和正则表达式长度;
end;{then}
end;{Run}
...全文
417 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
2013-03-08
  • 打赏
  • 举报
回复
引用 2 楼 FancyMouse 的回复:
这是很古老的一道noi题了。看不懂说明还没到火候,先看别的题熟悉搜索算法以后再看这个。
引用 8 楼 zhao4zhong1 的回复:
提问的智慧
谢谢两位大哥不吝赐教,我还是不懂,看来我在理解上应该是出现了很大的偏差,真的是火候未到,我自己再去琢磨一下,谢谢两位!
FancyMouse 2013-03-08
  • 打赏
  • 举报
回复
这是很古老的一道noi题了。看不懂说明还没到火候,先看别的题熟悉搜索算法以后再看这个。
赵4老师 2013-03-08
  • 打赏
  • 举报
回复
提问的智慧
FancyMouse 2013-03-08
  • 打赏
  • 举报
回复
引用 3 楼 xiang_pao 的回复:
引用 2 楼 FancyMouse 的回复:这是很古老的一道noi题了。看不懂说明还没到火候,先看别的题熟悉搜索算法以后再看这个。 谢谢你。 我就是不明白为什么要用 空串 填空 的方法,我觉得这样子匹配效率不高;直接写一个正则表达式,用以匹配8个以内的数字和字母字符和判断“+”,“-”号以确定符合格式的文件是否可以操作,我觉得这个更精准。 而上面的分析方法:……
其实……在回答如何解决最短这个问题之前,你还需要解决一个问题。“直接写一个正则表达式”怎么写。
FancyMouse 2013-03-08
  • 打赏
  • 举报
回复
引用 3 楼 xiang_pao 的回复:
引用 2 楼 FancyMouse 的回复:这是很古老的一道noi题了。看不懂说明还没到火候,先看别的题熟悉搜索算法以后再看这个。 谢谢你。 我就是不明白为什么要用 空串 填空 的方法,我觉得这样子匹配效率不高;直接写一个正则表达式,用以匹配8个以内的数字和字母字符和判断“+”,“-”号以确定符合格式的文件是否可以操作,我觉得这个更精准。 而上面的分析方法:……
你怎么保证你的解最短?
赵4老师 2013-03-08
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
将所有+结束的文件名等效变换为正则表达式: [第1个字母或数字][第2个字母或数字]...[第8个字母或数字] 然后再对这个正则表达式化简?
忘了化简后还得排除匹配-结束的文件名。
赵4老师 2013-03-08
  • 打赏
  • 举报
回复
将所有+结束的文件名等效变换为正则表达式: [第1个字母或数字][第2个字母或数字]...[第8个字母或数字] 然后再对这个正则表达式化简?
2013-03-08
  • 打赏
  • 举报
回复
引用 2 楼 FancyMouse 的回复:
这是很古老的一道noi题了。看不懂说明还没到火候,先看别的题熟悉搜索算法以后再看这个。
谢谢你。 我就是不明白为什么要用 空串 填空 的方法,我觉得这样子匹配效率不高;直接写一个正则表达式,用以匹配8个以内的数字和字母字符和判断“+”,“-”号以确定符合格式的文件是否可以操作,我觉得这个更精准。 而上面的分析方法: 正则表达式中的每个字符来自待操作文件的字符合集。要找出能匹配最多的带操作文件的正则表达式,在选择它的每一个字符时,就得考虑字符对增加匹配的带操作文件数的作用。显然,‘*’的作用是最大的,‘?’的作用次之。对于其他任一字符,它在待操作文件中出现的频率越高,则它对增加匹配文件数的作用愈大,覆盖的功能越显著。因此,可选字符集的排列顺序先为‘*’,‘?’,待操作文件名序列中出现的所有字符按其频率递减的次序随后。 我觉得由此递归调用RUN(0),得出最优解的表达式,还是不够高效。 还是我的理解有重大偏差? 望点拨,谢谢你!
2013-03-07
  • 打赏
  • 举报
回复
请给我解析这段伪码,真心看不懂,不理解:


谢谢大家,

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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