比较复杂的别名字典去重优化

2021-09-03 01:20:42 +08:00
 alex321

有几万个别名字典,存在如下情形: {A:A1} {A1:A2} {A3:A4} {A2:A3} {B4:B3} {B1:B4} {B4:B} {B3:B2} {B2:B5}

想构造出如下结果: {A:(A1,A2,A3,A4)} {B:(B1,B2,B3,B4,B5)}

目前我想到的办法很傻瓜,多重遍历。想请教下有什么高效的法子呢?

1200 次点击
所在节点    算法
5 条回复
RecursiveG
2021-09-03 03:09:16 +08:00
并查集
geelaw
2021-09-03 04:30:38 +08:00
离线问题计算无向图的连通分量即可(比如 BFS ),在线问题用并查集。
whusnoopy
2021-09-03 08:37:46 +08:00
有一个问题细节待明确,别名集合好理解,在同一个联通子图里就好,别名的 key 怎么定?最短?首次出现?看样例里 B 并不是在 Bx 里第一次出现的

这个不管离线在线应该都是并查集更快,离线构建图的过程也是有时间空间开销的
alex321
2021-09-03 09:56:12 +08:00
@whusnoopy #3 key 可以不定。给集合元组也可以的。
(A,A1,A2,A3,A4)
(B,B1,B2,B3,B4,B5)
whusnoopy
2021-09-03 11:09:58 +08:00
@alex321

那这就是一个标准并查集的问题了,先便利一遍构建并查集,再便利一遍按并查集结果输出。针对你的样例写了段 Python 代码

https://gist.github.com/whusnoopy/c9b43dde396aa57f61318c09870d5517

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/799577

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX