这是一个示例布局:
A
B C
D
G F
E
H
K I
J
每个字母代表一个物理设备。在此示例中,您可以看到A
和B
附近有C
。 B
,A
和D
附近都有C
。
我正在考虑将每个设备放入数据库并将所有可能的关系配对。例如:
device | siblings
-------+---------
A | B,C
-------+---------
B | A,D,C
-------+---------
D | B,G,E
这样,当我需要找到D
附近的设备时,我可以这样做:
SELECT siblings FROM devices WHERE device = 'D';
siblings = siblings.split(',')
for sibling in siblings:
# do something with each sibling device
我想知道是否有更好的方法。鉴于可能存在大量设备,我觉得这种方法可能会变得混乱,并且很可能是错误的(人为错误跟踪命令分离的兄弟姐妹列表)。
有什么建议吗?
答案 0 :(得分:0)
您应该查看维基百科有关Nearest-Neighbour Search的文章以获取更多想法,但最佳答案可能取决于您将要使用的设备数量。
KD-Trees和R-Trees即使在大量设备上也能提供良好的性能,但是它们需要一些编程/调试(如果你必须自己做,至少 - 它们是相当知名的数据结构,因此您可以在某处找到一个库。)
如果你只有少量的设备(“小”取决于各种各样的东西,真的),跳过特殊数据结构的复杂性并且只是通过所有你的线性搜索可能会更快设备。如果你只是偶尔执行这样的查询,那么慢速线性搜索可能仍然值得拥有干净,直接的代码。
最后:以上所有选项均假设所有设备彼此“连接”。如果只有一些设备相互连接,请尝试使用Adjacency List来存储这些连接,并按距离对其进行排序 - 这应该比上述任何设备快。
希望这有帮助!