2011-06-18 9 views
6

Redisを使用して重み付きグラフを実装する最も良い方法は何ですか?Redis:Weighted Directed Graphの実装

私たちは、ほとんどが現在、我々は、各ノードについてのRedis

にエッジを追加すると考え

、我々はキーとしてのnodeIdがあります(おそらく、ダイクストラアルゴリズムを使用して)グラフ上の最短経路を検索します参照されるノードのソートされたセット sortedSet内の各nodeIdのスコアは、エッジの重みです。

あなたはどう思いますか?私は間違っているが、ここで唯一残念なのにSortedSet内の次のノードのためのクエリごとに、我々はO(LOGN)の代わりに、Oを支払うことを次の取得(1)...

http://redis.io/commands/zrange

答えて

3

であるなら、私を修正ソートされたセット内のアイテムは、一度に1つずつ取り出している場合にのみO(log(n))になります。この場合、レディスへの接続の待ち時間は操作の複雑さよりも大きな問題になります。

グラフのほとんどの操作では、ノードからすべてのエッジを見る必要があるため、ノードを処理するときに、セット全体(または適切なスコアを持つもの)をローカルメモリにロードするのが理にかなっています。これはもちろん、適切なパスを見つけたために追跡されないエッジをロードすることを意味しますが、セットがかなり小さいため、このコストは、実行するエッジごとに新しい呼び出しを行うよりもはるかに少なくなります必要。

1

私は最近、同じ問題を抱えていました。私はハッシュを使ってモデル化しました。私は(ほぼ)すべてがローカルメモリにロードされなければならないと私はスペースの面で効率的な方法は、ハッシュを使用することであると言って強化し、このようなあなたのグラフ情報を保存することをトム・クラークソンに同意:

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

場合より多くのスペースと効率が必要で、すべての値(JSON文字列...)を圧縮し、クライアントコードで解凍/インポート/逆シリアル化します。