返回信息流求助各位大佬:
需求场景:文件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=?
谢谢各位大佬!
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #98495同步于 2019/10/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
【字符串匹配】大文件字符串匹配问题
ZzZ2251
2019/10/18镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
hhhh一个月也太久了!
【 在 Wizmann 的大作中提到: 】
: 把文件A搞个啥字符串自动机。
: 然后拿文件B的每一行去做匹配。
: 跑一个月就跑完了(
看问题描述,是序列匹配而不是字符串匹配,二者是不一样的。aabbccdd和abcd,后者是前者的子序列,但不是子字符串。
如果是匹配字符串,可以用KMP算法,每次匹配时间复杂度O(m+n)。
判断字符串a是否包含子序列字符串b,可以使用贪心策略,时间复杂度也是O(m+n)。
由于要计算匹配的次数,如若NameA和NameB都没有排序规律的话,O(2.5W * 1700W)的时间复杂度也是少不了的。
所以最无脑的时间复杂度是O(2.5W * 1700W * (m+n))。跑就完事了。
有什么可优化点的话,我只能想到把文件B建一个字典树,每次计算NameAi匹配到的路径的条数。对于NameAi的一次匹配次数计算,
如果匹配字典树的某个节点成功了,则其子树都可以减少需匹配的路径长度。
如果匹配字典树的某个节点失败了,则其子树都可以砍掉,减少需要匹配的路径数量。
谢谢谢谢~ 跑就完事了哈哈哈哈
【 在 lengjireji 的大作中提到: 】
: 看问题描述,是序列匹配而不是字符串匹配,二者是不一样的。aabbccdd和abcd,后者是前者的子序列,但不是子字符串。
: 如果是匹配字符串,可以用KMP算法,每次匹配时间复杂度O(m+n)。
: 判断字符串a是否包含子序列字符串b,可以使用贪心策略,时间复杂度也是O(m+n)。
: ...................