Redis:实现加权有向图

时间:2011-06-18 20:09:38

标签: graph redis graph-theory sortedset

使用Redis实施加权图表的最佳方法是什么?

我们将主要搜索图表上的最短路径(可能使用Dijkstra算法)

目前我们考虑将边缘添加到Redis

对于每个节点,我们将nodeId作为键,并将引用节点的键的一组排序 sortedSet中每个nodeId的得分是边缘的权重。

你怎么看?如果我错了,请纠正我,但这里唯一令人沮丧的是,对于排序集中下一个节点的每个查询,我们支付O(logn)而不是O(1)...

http://redis.io/commands/zrange

2 个答案:

答案 0 :(得分:3)

获取有序集合中的下一个项目只有O(log(n)),如果你一次取出一个,在这种情况下,连接到redis的延迟将比复杂性更具问题手术。

对于图形上的大多数操作,您需要查看节点的所有边缘,因此在处理节点时将整个集合(或至少具有合适分数的集合)加载到本地内存中是有意义的。这当然意味着加载一些不会被跟踪的边缘,因为你已经找到了合适的路径,但由于这些集合相当小,所以这个成本远远低于你为每个边缘调用redis的成本。需要。

答案 1 :(得分:1)

抱歉迟到了:),但我最近遇到了同样的问题,并且我使用哈希模拟了它。我同意Tom Clarkson(几乎)应该将所有内容都加载到本地内存中,并且我通过说空间方面的有效方法是使用哈希,并存储您的图形信息来增强:

Graph = { node1 : { nodeX : edge_weight, nodeY : edge_weight, other_info: bla..},
          node2 : { nodeZ : edge_weight, nodeE : edge_weight, other_info: bla..},
          bla bla...
        }

如果您需要更多空间和效率,请压缩每个值(可以是JSON字符串...)并在客户端代码中解压缩/导入/反序列化。