关系数据库中bfs的java实现

js81xvg6  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(328)

我需要使用三元树的结构,它必须存储在某个地方(我选择了关系数据库,但我仍然可以更改它)。
我的数据库树看起来像:

例如,我的关系包含列- Id , child1Id , child2Id , child3Id 以及 is_active 问题是我必须通过布尔参数提供bfs的能力。例如,应在图片节点#35上找到。当然,我知道如何在java中用ready data实现bfs,但要做到这一点,我需要从db接收整个树。是否可以通过sql查询来完成?或者任何人都可以提出比将其存储在关系数据库上更好的解决方案?

zqdjd7g9

zqdjd7g91#

一种可能的解决方案是使用图形数据库而不是关系数据库,正如在注解中所建议的那样。但如果可以只使用关系数据库,其中一种方法是向带有节点的表中添加其他字段- depth 以及 position_in_layer .. depth = parent.depth+1 , positionInLayer = (parent.positionInLayer - 1) * 3 + childNum ,其中3表示三叉树(对于二进制树,它将是2),childnum-childs当前节点是哪个。例如,当我们将第二个子节点添加到第五层的节点5时,它的深度为6,位置为4*3+2=14。它将是第6层的第14个元素。有了这些字段,二进制搜索可以通过如下查询逐层实现 select * from node where depth=i and is_active=0 order by position_in_layer asc limit 1 其中i-层号(从1到 SELECT MAX(depth) FROM node ). 结果还不错-用bfs在树中搜索最后一个元素,大约9800个节点,只需22毫秒(添加索引)

相关问题