リンクされたリストは実際に使用されますか?多くのコンピュータサイエンスの本では、それらを配列と比較しており、主な利点はそれらが可変であることです。ただし、ほとんどの言語は可変バージョンの配列を提供します。リンクされたリストは実際に実際に使用されていますか、それともコンピュータサイエンス理論の一部にすぎませんか?
リンクされたリストには多くの用途があります。たとえば、エンドユーザーには可変配列のように見えるデータ構造を実装します。
さまざまなコレクションの実装を提供するプログラミング言語を使用している場合、それらのコレクションの多くはリンクリストを使用して実装されます。これらの言語でプログラミングする場合、リンクリストを自分で実装することはあまりありませんが、使用するライブラリがどのようなトレードオフを行っているかを理解できるように、それらを理解するのが賢明かもしれません。つまり、「コンピュータサイエンス理論のほんの一部」というセットには、機能するプログラムを作成する場合に知っておく必要のある要素が含まれています。
それらは絶対に貴重です(両方の人気のある二重にリンクされたバージョンandはあまり人気がありませんが、該当する場合はよりシンプルで高速です!、シングルリンクバージョン)。たとえば、「配列の可変バージョン」(たとえば、C++では_std::vector
_)の指定された「ランダム」スポットに新しいアイテムを挿入(または削除)すると、O(N)
where N
は、配列内の項目の数です。これは、後に続くすべて(平均してそれらの半分)をシフトオーバーする必要があるためです。これはO(N)
操作です。リストでは、それはO(1)
、つまり定数時間です。 「前の」アイテムへのポインタ。このようなBig-Oの違いは、絶対にhuge-現実の使用可能でスケーラブルなプログラムと、おもちゃの「宿題」レベルのプログラムとの違いです!-)
リンクリストの主な用途は次のとおりです。
参照:- http://www.cs.ucf.edu/courses/cop3502h.02/linklist3.pdf
はい、もちろんそれは多くの理由で役に立ちます。
たとえば、リストへの効率的な挿入と削除が必要なときはいつでも。挿入の場所を見つけるにはO(N)を検索しますが、すでに正しい位置にある場合はO(1)で挿入を行います。
また、リンクリストの操作から学んだ概念は、ツリーベースのデータ構造や他の多くのデータ構造を作成する方法を学ぶのに役立ちます。
それで、リンクされたリストは現実の世界で実際に使用されますか?
リンクリストの使用/例(二重)は、建物のリフトです。
-人は、最上部に到達するためにすべてのフロアを通過する必要があります(リンクされたリストに関してはテール)。
-人は、ランダムなフロアに直接行くことはできません(中間のフロア/ノードを通過する必要があります)。
-人は最上階を超えることはできません(テールノードの横にはnullが割り当てられます)。
-人は1階/最後のフロアを超えることはできません(ヘッドリストの前にはリンクリストでnullが割り当てられています)。 リフト画像
ベクトルとは対照的に、リンクリストの主な利点は、ランダム挿入時間が、ポインターのペアを分離して新しいオブジェクトに再結合するのと同じくらい簡単であることです(これは、もちろん、二重リンクリストの場合は少し作業が増えます)。 。一方、ベクトルは通常、挿入時にメモリ空間を再編成するため、速度が大幅に低下します。ただし、リストを最後まで処理する必要があるため、リストはコンテナの最後に追加するなどの作業では効率的ではありません。
不変リンクリストは、永続データ構造の最も重要な例です。そのため、多くの関数型言語では、標準(場合によってはonly)のデータ構造となっています。 LISP、Scheme、ML、Haskell、Scala、あなたはそれに名前を付けます。
リンクリストは、動的なメモリ割り当てに非常に役立ちます。これらのリストは、オペレーティングシステムで使用されます。リンクリストの挿入と削除は非常に便利です。ツリーやグラフなどの複雑なデータ構造は、リンクリストを使用して実装されます。
リンクされたリストは、他の人が指摘したように、要素を効率的にスプライスして中央で削除できるので便利です。ただし、リンクリストの欠点は、参照の局所性が低いことです。機能を明示的に必要としない限り、この理由でリストを使用しないことを好みます。
必要に応じて成長する配列は、コンピューターのメモリの動作方法により、常に単なる幻想です。内部的には、十分な数の新しい要素が追加されたときに再割り当てする必要があるのは、連続したメモリブロックです。同様に、配列から要素を削除する場合は、メモリの新しいブロックを割り当て、配列をコピーし、前のブロックを解放して未使用のメモリを解放する必要があります。リンクされたリストを使用すると、残りのリストを再割り当てすることなく、要素のリストを拡大および縮小できます。