BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #98495同步于 2019/10/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

【字符串匹配】大文件字符串匹配问题

ZzZ2251
2019/10/18镜像同步6 回复
求助各位大佬: 需求场景:文件A与文件B,如果文件B中的某个序列包含于A中的某一个序列中,则A中对应序列名称+1,求A中每一个序列的被匹配次数。 A形如:(共2.5W条数据,每条不定长) ``` >NameA1 ACTGTCG... >NameA2 GCTAC.... ... ``` B形如:(1700W条数据,每条不定长,但都比A中的短) ``` >NameB1 ACTGTCG... >NameB2 GCTAC.... ... ``` e.g. 若NameB1包含于NameA1中,则NameA1 += 1(包含多次算一次);若NameB2包含于NameA1中,则NameA1 += 1 等等。。。 求:遍历B后,NameAi=? 谢谢各位大佬!
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
Wizmann机器人#1 · 2019/10/18
把文件A搞个啥字符串自动机。 然后拿文件B的每一行去做匹配。 跑一个月就跑完了(
ZzZ2251机器人#2 · 2019/10/18
hhhh一个月也太久了! 【 在 Wizmann 的大作中提到: 】 : 把文件A搞个啥字符串自动机。 : 然后拿文件B的每一行去做匹配。 : 跑一个月就跑完了(
lengjireji机器人#3 · 2019/10/18
看问题描述,是序列匹配而不是字符串匹配,二者是不一样的。aabbccdd和abcd,后者是前者的子序列,但不是子字符串。 如果是匹配字符串,可以用KMP算法,每次匹配时间复杂度O(m+n)。 判断字符串a是否包含子序列字符串b,可以使用贪心策略,时间复杂度也是O(m+n)。 由于要计算匹配的次数,如若NameA和NameB都没有排序规律的话,O(2.5W * 1700W)的时间复杂度也是少不了的。 所以最无脑的时间复杂度是O(2.5W * 1700W * (m+n))。跑就完事了。
lengjireji机器人#4 · 2019/10/18
有什么可优化点的话,我只能想到把文件B建一个字典树,每次计算NameAi匹配到的路径的条数。对于NameAi的一次匹配次数计算, 如果匹配字典树的某个节点成功了,则其子树都可以减少需匹配的路径长度。 如果匹配字典树的某个节点失败了,则其子树都可以砍掉,减少需要匹配的路径数量。
ztinpn机器人#5 · 2019/10/19
mark 已加入面试题库
ZzZ2251机器人#6 · 2019/10/21
谢谢谢谢~ 跑就完事了哈哈哈哈 【 在 lengjireji 的大作中提到: 】 : 看问题描述,是序列匹配而不是字符串匹配,二者是不一样的。aabbccdd和abcd,后者是前者的子序列,但不是子字符串。 : 如果是匹配字符串,可以用KMP算法,每次匹配时间复杂度O(m+n)。 : 判断字符串a是否包含子序列字符串b,可以使用贪心策略,时间复杂度也是O(m+n)。 : ...................