2012-05-07 4 views
7

配列を使ってリンクリストを実装する方法を知っています。たとえば のために、我々は次のように構造体の定義:配列を使ってリンクリストを実装する - 利点と欠点

struct Node{ 
    int data; 
    int link; 
} 

「データ」ストアを見ると「リンク」は、次のノードの配列のインデックスを格納します。

「普通の」リンクリストと比較して、配列を使ってリンクリストを実装する利点と欠点は誰に教えてください。どんな提案も感謝します。

答えて

9

リンクされたリストを配列に戻すと、両方ともの短所になります。したがって、これはおそらくそれを実装するための非常に良い方法ではありません。

いくつかの即時短所:あなたはメモリ

  • を取っ配列(現在のアイテムのために使用されていないエントリ)でデッドスペースを持っています

    1. あなたは自由を追跡する必要がありますエントリ - いくつかの挿入と削除の後で、これらの空きエントリはどこにでもある可能性があります。
    2. 配列を使用すると、リンクされたリストのサイズに上限が課されます。

      1. あなたは64ビットシステムにしている場合は、あなたの「ポインタ」は、おそらく、この利点を上回る空きエントリで必要とされる余分なスペースかかわらず(少ないスペースを取るだろう:私はいくつかの利点があるとし

    3. アレイをディスクにシリアル化して、mmap()コールで簡単に読み込むことができます。ただし、移植性のために何らかのプロトコルバッファを使用する方が良いでしょう。
    4. メモリ内で互いに近接している配列の要素について、ある程度の保証をすることができます。
  • 2

    誰もが「普通」のリンクリストに比べ配列をリンクリストの実装の利点と欠点使用しているものを教えてもらえますか?

    リンクされたリストは、以下の複雑さを持っている:

    • 短所は、xs×:O(1)
    • アペンドNM:O(N)
    • インデックスiのxs:Oを(n)

    あなたのreprese ntationは厳格な、連続した配列を使用して、あなたは別の複雑さを持っています:

    • 短所が古い配列をコピーする必要があります:O(n)の
    • APPENDは、新たな連続した空間に両方の配列をコピーする必要がありますO(M + N)
    • インデックスは、配列アクセスとして実装することができる :O(1)、用語に実装されたリンクリストのAPIである

    配列のように振る舞います。

    厳密な配列のリンクリストまたはツリーを使用することで、これを緩和して、ロープや指の木や遅延配列につなげることができます。

    +1

    挿入はO(1)であり、O(n)ではないので、配列とまったく同じではないようです。 – jcb

    0

    スタックは2つの方法で実装します。 最初に配列を使用し、2番目にリンクリストを使用しています。

    配列を使用する際にいくつかの欠点があり、プログラマのほとんどはスタック実装でリンクリストを使用します。

    最初にリンクされたリストを使用するスタックは、スタックサイズを宣言しておらず、スタックにデータストアを限定していません。 2番目は、ポインタエッセイで宣言して使用するリンクリストです。

    リンクリストでは1つのポインタのみを使用します。その呼び出されたトップポインタ。

    スタックは、ライフメソッドの使用です。リンクリストプログラムの実装にはいくつかの欠点があります。

    プログラマのほとんどは、好きなリストを使ってスタック実装を使用しています。

    0

    配列の実装を使用すると、&のリストのノードへのアクセスが速くなります。 ポインタを使用してリンクリストを実装すると、ノードにランダムアクセスできます。 配列の実装は、固定番号を扱うときに役立ちます。配列のサイズを変更すると、パフォーマンスの面ではコストがかかります。なぜなら、リストの途中からノードを挿入/削除する必要がある場合は、後ですべてのノードを移動する必要があるからです。 これとは逆に、ポインタがわからないときは、ポインタの実装を使用する必要があります。そのようなリストは効率的に拡大/縮小することができます。&ノードをシフトする必要はありません。参照先ポインタを逆参照するだけで実行できます。

    関連する問題