我正在(大约)大型图形(具有约380K边)上进行操作.我编写了一个程序来计算图中的3个小数.一个简单的例子:
List of edges:
A - B
B - C
C - A
C - D
List of cliques:
A - B - C
MySQL表结构:
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| v1 | bigint(20) | YES | MUL | NULL | |
| v2 | bigint(20) | YES | MUL | NULL | |
+-------+------------+------+-----+---------+-------+
3-clique只是图中的三角形.目前,我正在使用PHP MySQL执行此操作.不出所料,它不够快.有没有办法在纯MySQL中做到这一点? (也许是一种将所有3-clique插入到表中的方法?)
最佳答案
SELECT T1.v1,T2.v1,T3.v1 FROM TableName T1,TableName T2,TableName T3
WHERE T1.v1 < T1.v2 AND T2.v1 < T2.v2 AND T3.v1 < T3.v2
AND T1.v1 = T3.v1 AND T1.v2 = T2.v1 AND T2.v2 = T3.v2
应该做到的.我在这里所做的工作是确保所有考虑的边缘的v1都小于v2,只是为了删除重复项.然后,通过边缘的起点/终点将边缘连接起来很简单.返回每个对中的第一个点.
如果边缘从一个节点回到同一节点,则可能需要适当添加其他检查.
编辑:感谢Legend.进行了更改.提醒我,我们需要确保T3中找到的边缘与T1中的边缘匹配,因此我们必须将每个中的第一个链接在一起!最初我有T3.v1> T3.v2在where子句的第一行中,但是为了减少混乱而对其进行了更改,但是却忘记了更改第二部分!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。