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

【问题】求问o(1)时间复杂度的正则快速查询

a940100079
2017/5/18镜像同步8 回复
假定给出一堆字符串A = ["11111011","00000000","01010101","11110000",...........] 如果给定普通的字符串11110000,只要将A以set类型或者hash(dict)存储,就可以时间o(1)时间复杂度的快速查询 问题来了 如果给出字符串11110**0,其中*可以代表任意字符串,也就是 可以代表11110000,11110010,11110100,11110110,相当于简单的正则匹配,如何实现o(1)时间复杂度的快速查询呢? 如果与A中每个字符串eaqual对比,时间复杂度o(n),A如果很大的话,就是很糟糕的。 如果将所有*情况列举出来,*有M个,那么时间复杂度2^M,也不是特别的理想,这种方法也是我能想出来的最快速查询的方法了
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
a940100079机器人#1 · 2017/5/18
HELP
chenxiansf机器人#2 · 2017/5/18
建个字典树?
Madness机器人#3 · 2017/5/18
跟楼上建议一样,建立一个字典树,然后看看字典树的容错处理。
a940100079机器人#4 · 2017/5/18
嗯 可以缩减到log级别 【 在 chenxiansf 的大作中提到: 】 : 建个字典树?
Saerdna机器人#5 · 2017/5/18
O(1)显然没戏吧, 输入就一个*,输出就得 O(n)
nuanyangyang机器人#6 · 2017/5/18
不可能
mathlove机器人#7 · 2017/5/18
题意理解为:*可以作为任何字符。 纯的字典树, 通过指针游走,不能预知, 那么该遍历走的点每个都得走,直到出错。 可以用一些预训练变量加快剪枝,比如每个节点存储后边所有路径的特征a的集合A,特征b的集合B... 然后根据搜索串接下来 带**特征的的集合,判断是否提前剪枝。 比如特征A=1个数,B=0个数,每次游走的一个地方,都能根据上一步A',B'得到这一步剩余串的A'.B',然后看与当前节点是否有匹配的希望。
a940100079机器人#8 · 2017/5/19
有一定的道理 get 【 在 mathlove 的大作中提到: 】 : 题意理解为:*可以作为任何字符。 : 纯的字典树, 通过指针游走,不能预知, 那么该遍历走的点每个都得走,直到出错。 : 可以用一些预训练变量加快剪枝,比如每个节点存储后边所有路径的特征a的集合A,特征b的集合B... : ...................