web-dev-qa-db-ja.com

ノードとエッジのネットワークのモデリングに使用できるデータ構造は何ですか?

私のアプリケーションでは、40〜50ノード、通常ノードあたり6未満のエッジで構成されるネットワークをモデル化して操作を実行する必要があります。ノードとエッジはどちらも、それぞれ約1Kのデータを持つオブジェクトです。実行中、ネットワークのマッピングは頻繁に変更されます-調整される個々のノードとエッジのプロパティに加えて、ノードの追加と削除、エッジの追加と削除。ノードオブジェクトとEdgeオブジェクトは、「new」を使用して割り当てられ、結果のポインタは各オブジェクトタイプのstd::listに格納されます。

私はマッピングのために2つの異なるアプローチを試しました:

  1. 各ノードにコンテナを配置してエッジのIDを保持し、各エッジに2つの変数を配置して終了ノードのIDを格納します。

  2. エッジのコンテナおよびノー​​ドのコンテナとは別に、新しい最上位のコンテナを追加して、マッピング情報を保存します。

ノードおよびメンバークラスの関数は、マッピング情報がこれらのクラスに格納されている場合、実装が容易になります。すべてのマッピングデータが個別に保存されている場合は、ネットワークマッピングを変更する方がはるかに簡単です。ただし、マッピングがノードとエッジに格納されていない場合、ノードとエッジのメンバー関数には、親オブジェクトからマッピング情報を取得する方法が必要です。

データを複製したり、カプセル化を壊したりすることなく、両方のアプローチのベストを提供するデータ構造または概念的なテクニックはありますか?非常にコストのかかる計算は含まれないため、パフォーマンスは大きな問題ではありません。より重要な問題は、安全で理解しやすく、保守可能なコードです。

7
Mark Taylor

Graphs はさまざまな方法で実装でき、概要を説明したものは間違いなく間違いありません。

C++の場合は、 Boost C++ libraries (BGL)にも目を通す必要があります。これには グラフを実装するためのライブラリ もあります。これを使用する場合、BGLで実装されたアルゴリズム(検索とトラバーサル)を使用することも、_Edgeおよび_vertex直接訪問者。

5
Spoike

Pythonでネットワーク操作を実装しました。これが私の解決策です。

  • Nodesのリストを所有するクラスPort
  • Portオブジェクトには属性destinationproper_directionおよびback_portがあります
  • Nodeはリンク機能を提供し、リスト内の各Portオブジェクトに別のバックポートがあることを保証しますPortオブジェクトは、負のproper_directionを使用して宛先ノードに作成されますまた、このバックポートはback_portによって参照されます

このようにして、ノードはポートのペアによって双方向でリンクされ、proper_directionが逆になります。必要に応じてCポインタを作成します-Pythonではポインタは関係ありません;-)

各Nodeにデータを格納するには、マッピングを追加するサブクラスを派生させます。各リンクにもデータを格納する場合は、Nodeオブジェクトによってリンクをエミュレートし、基本的にポートによるオブジェクトとリンク(両方のノード)のリンク。

このデータ構造は、ネットワークの検索と操作に非常に便利であることがわかりました。

1
Gerenuk