2016-06-24 3 views
0

最近、私は、このようなポインタによる配列によるツリーの実装のメリット?

struct Node{ 
    Node *parent; 
    vector<Node*> child; 
    Node(void):parent(nullptr){} 
} 

として構造体でツリーを実装学んだ私は 、これは木を実装するためにはかなりまっすぐ進むべき道であると思ったし、また、構造体の中のプロセスのためのより多くのものを含めることが容易です。

しかし、多くの人のコードでは、 はポインタの代わりに配列を使用する方が好きです。 バイナリツリーではこれを理解することができました。配列でもそれを行うのはかなり簡単ですが、 でも、他の複雑なグラフではなぜですか?

+3

あなたはおそらく[ポインタすべて](http://en.cppreference.com/w/cpp/memory)を使用したくないでしょう。 –

+1

私がクラスで学んだやり方は、この種の構造体を使って接続グラフを表現しようとすると、配列の配列が密集グラフ(配列がかなりいっぱいになるので)には適していますが、グラフ代わりにポインタ(リストの配列)を使用してスパース(少ない接続)です。データ構造の選択は、常にアプリケーションによって異なります。 – Daniel

+0

@πάνταῥεῖどうしてですか?私はそれの後ろに推論が表示されない場合、ツリーが完全に満たされていない場合は、配列は多くのメモリを浪費しないだろうか? – haleyk

答えて

1

Skienaから:(x, y)場合

  • 隣接行列は、テストのために速くつのノードです:2008:ADM:1410219とCormen:2001:IA:グラフ利回りについて580470の比較隣接行列と隣接リスト接続エッジがある
  • 隣接リストは、特定のノードの次数(隣接ノードの数)を見つけるためにより速くなります。
  • mノードとnのエッジを持つグラフは、隣接リストを使用して実装された場合はm + nスペースを消費しますが、隣接行列の場合はn^2です。
  • 隣接行列は、をわずかに使用します。大きなグラフではメモリが少なくなります。
  • 隣接行列を使用する場合、エッジ挿入/削除はO(1)で実行されます。
  • 隣接リストを使用して実装グラフをトラバースグラフは、多くの頂点が、いくつかのエッジの隣接行列は、過度のメモリを消費している場合Θ(m + n)とマトリックスΘ(n^2)

で行います。

一般に、隣接関係リストの方が優れています。

関連する問題