使用SQL实现近似不相交集的最佳方法是什么?
- 详情**
我有一个边表,存储为[vertex_a, vertex_b]
的两列表。
我需要一个不同集合的表,存储为[vertex, set_id]
,每个顶点一行,用不相交的set_id标记每个顶点。
- 约束条件**
- 必须是纯SQL实现。它可以利用特定于PostgreSQL的函数,但最好是纯ANSI SQL。
- 结果可以是近似的-当它们实际上是连接的时,将一些集合标记为不相交是可以接受的。如果可以调整近似边界就更好了-例如通过增加迭代次数。
- 库已退出(没有Boost,Numpy,Scipy)。必须是SQL。
- 大多数集将包含1到3个顶点。非常少的大集合,预期最大为10个顶点。
- 相关**
- 标签:Implementing Disjoint Sets (Union Find) in C++
- 这是Disjoint-set (Union Find) - Wikipedia的近似实现
3条答案
按热度按时间6ss1mwsb1#
其实我也在研究同样的问题。不幸的是,我不认为可以找到一个非常有效的解决方案-至少不容易使用SQL。只需删除“distinct”和自消除查询,以观察工作集变得有多大。也就是说,下面的解决方案将起作用。
但同样,这在更大的数据集上是完全不切实际的;任何其它解决方案都需要迭代。
koaltpgm2#
这段纯sql代码在5分钟内将大约35000条记录分组(8个内核/32 gb内存)。好好享受
pod7payv3#
如果你需要增量地维护它,我会在你的顶点表中添加第三个int列height,将set_id作为父指针而不是连接组件,并在关系表中添加外键约束和触发器来执行父指针插入。
然后,要查看连接的组件,可以使用递归视图。
如果你已经有一个大表,你需要一个高效的批处理过程,那么主要的问题是,标准的方法不是缓存遗忘的,并且具有非常差的缓存行为,而SQL基本上是为了阻止这种情况而设计的。