[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】如何用 递归哈希算法 或 匹配表算法 搜索字符串

本帖最后由 思想之翼 于 2023-4-9 05:37 编辑

https://zhuanlan.zhihu.com/p/389419957
该文阐述字符串搜索算法有  朴素算法   Rabin-karp算法(递归哈希)   Kruth-Morris-Pratt算法(匹配表),这三种算法,时空复杂度犹如云泥之别。
文章结论:由于在文本字符串中遍历时,不管模式字符串多长,每次计算量只涉及一次旧值的去除和一次新值的添加,Rabin Karp算法最适合用于模式字符串非常长的情况,比如长句子在论文中的查重。
我曾用VBS代码解决类似字符串匹配问题,运行速度之慢,难于言表。
限于网络难以搜寻到类似参考代码,故特举例,恳请各位老师指点(不拘泥于上述列举算法)。

例:文本A.txt 记录字符串
W
A
D
C
B
A
D
C
B
A


1.首先,读取A.txt文本字符串,并反转文本字符串为:ABCDABCDAW
2.其次,始终以A为起点,选择模式字符串。本例中,ABCDA 在文本字符串中存在2个及以上,且为最长相同字符串,故确定 ABCDA 为模式字符串。
3.然后,在文本字符串中,提取模式字符串的前缀。
4.结果:本例提取的前缀为D,写入文本B.txt  ;如有多个模式字符串的前缀,则不去重,依次竖排(另起一行)写入文本B.txt。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 4# WHY
感谢!有一点疑惑:计算1列2000行的数据,该代码耗时22秒,VBS代码却只耗时0.07125秒,老刘一号不是说:“随便换个编译型语言效率就可以薄纱vbs”吗?

TOP

本帖最后由 思想之翼 于 2023-4-8 21:34 编辑

回复 6# terse
您好!是的。

递增:A(有重复)  AB(有重复)  ABC(有重复)  ABCD(有重复) ABCDA(有重复)  ABCDAB(无重复)...  找到ABCDA有重复,且最长字符串。

从总字符串的一半(奇数则+1)开始递减,是否更快?
ABCDAB(无重复)   ABCDA(有重复)... 找到ABCDA有重复,且最长字符串。

实际运用中,没有极端情况,比如:AAAAAAAAAAAAAA 或者 ABABABABABABAB 或者 ABCABCABCABC ...

TOP

本帖最后由 思想之翼 于 2023-4-8 22:57 编辑

回复 9# WHY

链接:https://pan.baidu.com/s/1Jw90mkqCSH1AzBsqvM_wfg?pwd=v5ak
提取码:v5ak

感谢帮助!您的代码这次测试是6.23秒,VBS代码测试是0.14秒

TOP

回复 11# WHY
虚心请教:下述表示路径出错,如何正确表述?
type a.txt | cscript //nologo //e:jscript "%~f0" > b.txt
type d:\测试1\a.txt | cscript //nologo //e:jscript "%~f0" > e:\测试2\b.txt

TOP

本帖最后由 思想之翼 于 2023-4-23 03:53 编辑

回复 13# WHY
感谢帮助!求教:VBS代码搜索出全部符合条件的字符后,在写入文本前,如何增添一个筛选判断,只输出搜索所得字符中重复次数最多的字符,或重复次数最少的字符,或重复次数指定N次的字符(如无,文本为空)。真诚希望通过这个实例,深入学习VBS判断语句的写法。

TOP

本帖最后由 思想之翼 于 2023-4-26 10:16 编辑

回复 17# WHY
感谢帮助!代码运行正确。
有个问题求教:如下述方法添加 for...next 循环后,Function SaveToDictionary(pattern) 显示语法错误 800A03EA,问题出在哪?
For f = 1 to 1624
For g = 1 to 7
Dim srcFile, dstFile1, dstFile2
srcFile = "e:\ZA\" & Right("00000" & f, 6) & "\"& Right("00000" & f, 6) & "_" & g & ".txt"
dstFile1 = "e:\ZD\" & Right("00000" & f, 6) & "\"& Right("00000" & f, 6) & "_" & g & ".txt"
dstFile2 = "e:\ZS\" & Right("00000" & f, 6) & "\"& Right("00000" & f, 6) & "_" & g & ".txt"
...
...
fso.OpenTextFile(dstFile1, 2, True).Write(s1)
fso.OpenTextFile(dstFile2, 2, True).Write(s2)
next
next

TOP

返回列表