配列リストとリンクリストの違い

Anonim

データはどのように格納されますか?

配列のリストとリンクされたリストは、データの格納と検索に関する一般的な用語です。多くの記憶装置がありますが、最終的には記憶装置に依存します。これらの2つのストレージメカニズムは、ストレージデバイスにデータを配置し、必要に応じてそれらを取得します。データをメモリに保存する方法を見てみましょう。配列リストはシーケンシャルストレージを使用し、データのピースは順番に格納されます。これはおそらくより単純なストレージの形態です。混乱を避けます。はい、配列リストの次のメモリ位置から次の項目またはデータを取り出すことができます。ただし、リンクされたリストにポインタの助けを借りて格納されます。ここでは、データ用とポインター用の2つの記憶場所が必要です。ポインタは、次のデータのメモリ位置を指定します。リンクされたリストはデータを連続して格納することは決して簡単に理解できます。むしろ、ランダムな記憶メカニズムを使用しています。ポインタは、メモリ内のデータ位置を特定するための重要な要素です。

<!

ダイナミックアレイとリンクリスト

すでに両方のストレージメカニズムがどのようにデータを格納しているかを議論し、Arrayリストの内部ストレージスキームの用語として「ダイナミックアレイ」を挙げることができます。データピースを名前の後に置くだけで、リンクされたリストはポインタの助けを借りて内部リストを使用して次のアイテムを追跡します。したがって、単一リンクまたは二重リンクリストのような内部リンクリストを使用して、次のデータを表示します。

<! - > - >

メモリ使用量

Arrayリストには実際のデータのみが格納されるため、格納するデータの領域だけが必要です。逆に、リンクリストでは、ポインタも使用します。したがって、2つのメモリロケーションが必要です。リンクリストは、Arrayリストより多くのメモリを消費していると言えるでしょう。 Linkedリストの有利な点は、Arrayリストではなく、連続したメモリ位置にデータを格納する必要がないことです。ポインタは次のデータ位置の位置を保持することができ、連続していない小さなメモリスロットを使用することもできます。メモリ使用量に関して言えば、ポインタはLinkedリストの主な役割を果たします。ポインタの有効性もそうです。

<! - >

初期配列リストとリンクリストのサイズ

配列リストでは、空のリストでも10のサイズが必要ですが、リンクリストではこのような大きなスペースは必要ありません。サイズが0の空のリンクリストを作成することができます。その後、必要に応じてサイズを増やすことができます。

データ検索

配列検索では、順番に格納されるため、データ検索が簡単です。最初のデータ位置を特定するだけです。そこから次の場所に順番にアクセスして残りの部分を取り出す。最初のデータ位置+ 'n'のように計算されます。ここで 'n'は配列リスト内のデータの順序です。リンクされたリストは、最初のデータ位置を見つけるための初期ポインタを参照し、そこから、各データに関連付けられたポインタを参照して、次のデータ位置を見つける。検索プロセスは主にポインタに依存しており、次のデータの場所を効果的に示しています。

End of Data

Arrayリストはnull値を使用してデータの終わりを示しますが、Linkedリストはこの目的のためにNULLポインタを使用します。システムがnullデータを認識するとすぐに、Arrayリストは次のデータ検索を停止します。同様に、ヌルポインタは、システムが次のデータ検索に進むのを止める。

Reverse Traversal

Linkedリストはdesciteriterator()の助けを借りて逆の方向にトラバースすることを可能にします。ただし、Arrayリストにはこのような機能はありません。逆方向のトラバーサルが問題になります。

構文

両方のストレージメカニズムのJava構文を見てみましょう。

配列リストの作成:

List arraylistsample = new ArrayList();

配列リストへのオブジェクトの追加:

Arraylistsample。 add( "name1"); Arylylample。 add( "name2");

これは結果の配列リストが - [name1、name2]のようになります。

リンクされたリストの作成:

List linkedlistsample = new linkedList(); リンクリストへのオブジェクトの追加:

Linkedlistsample。 add( "name3"); リンクされたサンプル。 add( "name4");

これは、結果のリンクされたリストが - [name3、name4]のようになる方法です。

取得操作または検索操作の方がよいでしょうか?

配列リストは任意のデータ検索を実行するのにO(1)時間かかるが、リンクされたリストはn

番目の データ検索のためにO(n)を要する。したがって、配列リストは常に任意のデータ検索に一定の時間を使用しますが、リンクされたリストでは、データの位置によって時間が異なります。したがって、配列のリストは常にGetまたはSearch操作のためのより良い選択です。 挿入操作または追加操作の方が適していますか?

配列リストとリンクリストの両方がデータ追加のためにO(1)時間かかる。しかし、配列がいっぱいになると、配列リストにはサイズを変更し、新しいものにアイテムをコピーするためにかなりの時間がかかります。そのような場合、リンクされたリストが良い選択です。

削除操作の方が良いでしょうか?

削除操作は、ArrayリストとLinkedリストの両方でほぼ同じ時間がかかります。配列リストで、この操作はデータを削除し、新しい配列を形成するためにデータの位置をシフトします.O(n)の時間がかかります。リンクされたリストでは、この操作は特定のデータに移動し、ポインタの位置を変更して新しいリストを形成します。トラバーサルと除去の時間はここでもO(n)です。

どちらが早い?

Arrayリストは内部配列を使用して実際のデータを格納することがわかっています。したがって、データが削除された場合、今後のすべてのデータにはメモリが必要です。明らかに、これにはかなりの時間がかかり、物事が遅くなる。リンクされたリストでは、ポインターの位置を変更するだけで、そのようなメモリー移動は必要ありません。したがって、リンクされたリストは、あらゆる種類のデータストレージの配列リストよりも高速です。しかしながら、これは純粋に動作のタイプに依存する。 e。 GetまたはSearch操作の場合、LinkedリストはArrayリストよりも多くの時間がかかります。全体的なパフォーマンスを見ると、リンクされたリストがより速いと言えるでしょう。

配列リストとリンクリストを使用する場合

配列リストは、連続したメモリが利用できるより小さなデータ要件に最適です。しかし、膨大な量のデータを処理する場合、連続メモリの可用性は、データ記憶メカニズムが小規模であるか巨大であるかにかかわらず実装されます。次に、どちらを選択するかを決定する - アレイリストまたはリンクリスト。あなたは、単にデータの保存と取り出しが必要なときに、アレイリストに進むことができます。しかし、リストはそれを超えてデータを操作するのに役立ちます。データ操作が必要な頻度を決めたら、通常どんなタイプのデータ検索を行うかを確認することが重要です。取得または検索するだけの場合は、配列リストを使用する方が適しています。 [挿入]や[削除]などの操作の場合は、[リンク済み]リストに進みます。

表形式の違いを見てみましょう。 S。 配列リスト

リンクリスト

1 データ記憶ファッション 順次データ記憶を使用する
非順次データ記憶を使用する 2 < 内部ストレージ・スキーム
内部ダイナミック・アレイを維持 リンク・リストを維持する 3 メモリ使用量
データだけのメモリ・スペースが必要 ポインタ 4 初期リストのサイズ
少なくとも10項目のスペースが必要です。 スペースは必要なく、サイズ0の空のリンクリストを作成することもできます。 5 データ検索
最初のデータ位置+ 'n'のように計算します.nは配列リストのデータの順序です。 最初または最後から必要なデータが必要になるまでの走査 6 < End of Data Null値は終了を示します。
Null Pointerは終了を示します。 7 Reverse Traversal 許可しません。
descendingiteratorの助けを借りて) 8 リストの作成構文 List arraylistsample = new Arrayリスト();
List linkedlistsample = new linkedList(); オブジェクトの追加 Arylylistsample。 add( "name1"); リンクされたサンプル。 add( "name3"); O(n)時間がかかり、パフォーマンスはデータの位置に依存します。 10
取得または検索 時間がかかり、パフォーマンスが向上します。挿入または追加 配列がいっぱいの場合を除いてO(1)時間を消費

すべての状況でO(1)時間を消費

12 削除または削除 O(n) O(n)時間かかる

13

いつ使用するか? GetまたはSearch操作が多数ある場合。開始時でさえメモリ可用性がより高くなければならない 多くの挿入操作または削除操作があり、メモリの可用性が連続的である必要がない場合