リンクリストの定義は理解していますが、どのように表現して共通の概念またはアイテムに関連付けることができますか?
たとえば、OOPは自動車に関連する可能性があります。実生活のすべての(ほとんどの)自動車は本質的に同じものです。自動車にはエンジンがあり、自動車は通常、最大乗客数を持ちますが、バスとスポーツカーは両方とも自動車であるため、異なる場合があります。
私たちが継承で持っているような、単純なoleの単独のリンクリストの実際の生活、直感的な例はありますか?典型的な教科書のリンクリストの例は、整数と次へのポインタを持つノードを示していますが、あまり有用ではないようです。
あなたの入力は大歓迎です。
リンクリストは conga line のようなものです。誰もが自分の前で人の腰を保持し、人の腰は順番に後ろ向きに保持されます。ただし、前と後ろの人だけは例外です。回線に人を追加する唯一の方法は、適切な場所を見つけてその接続を切り離し、新しい人を挿入することです。
リンクリストの使用方法の例ではなく、本の定義よりも比meta的な説明が必要だと思います。
リンクリストは、スカベンジャーハントのようなものです。手がかりがあり、その手がかりには次の手がかりを見つけるための場所へのポインタがあります。そのため、次の場所に移動して、別のデータと別のポインターを取得します。途中で、または最後に何かを取得するには、それを取得する唯一の方法は、最初からこのリストに従うことです(またはチートします;))
リンクリストの実用的で現実的な例は何ですか?
最も単純で最も簡単なのは電車です。
鉄道車両は特定の順序でリンクされているため、可能な限り最も効率的な方法で積み込み、積み降ろし、移動、降車、ピックアップが可能です。
たとえば、Jiffy Mixプラントには砂糖、小麦粉、コーンミールなどが必要です。屈曲部のすぐ近くには、塩素、硫酸、水素を必要とする製紙工場があります。
これで、列車を停止し、それぞれの車の内容物を降ろしてから列車を乗せることができますが、ケーソンから小麦粉が吸い出され、次に砂糖などが吸い出される間、列車の他のすべてが座らなければなりません.
代わりに、車両の全体が切り離され、列車の残りの部分が移動できるように、車両が順番に列車に積み込まれます。
列車の終点は、中央の部分よりも簡単に取り外すことができ、ある場所で数台の車を、別の場所で数台の車を取り外すよりもはるかに簡単です。
ただし、必要に応じて、トレインの任意のポイントでアイテムを挿入および削除できます。
リンクリストによく似ています。
-アダム
最初に理解すべきことは、リンクリストは概念的には配列と同じであることです。
唯一の違いは、さまざまな操作の効率です。最も重要なこと:
したがって、配列(飛行機のすべてのエンジン、買い物リストのすべてのアイテム...)に使用できる類推はリンクリストにも適用されますが、効率を考慮すると、別の類推が適切になります。
配列は本棚の中の箱になります。 n行目からボックスを削除するとき、n + 1から上のすべてのボックスを1シェルフ下に移動する必要があります(したがって、面倒な空のシェルフがありません)。
逆に、リンクリストはネックレスになります。その青い宝石が気に入らなくなったら、それをシーケンスから外し、結果の2つの端を結びます。 各真珠をループする必要はなく、ネックレスを固定できるようにそれを移動させるだけです。
Blameは、プロジェクト内のさまざまなモジュールで作業する多くのソフトウェアエンジニアを移動します。
まず、GUI担当者は製品が機能していないことを非難されます。彼は自分のコードをチェックし、それが彼のせいではないことを確認します。APIが台無しになっています。 APIの人は自分のコードをチェックします。彼のせいではなく、ロガーモジュールの問題です。 Loggerモジュールの男は、データベースの男を非難し、インストーラーの男を非難し、誰が非難します...
私は何年も前に、最初の大学の授業の1つで、どこにリンクリストを使用するのだろうと思いました。今日、私は、私がプロジェクトを使用したことがなく、多くの場所で作業している単一のプロジェクトがあるとは思わない。それは信じられないほど基本的なデータ構造であり、私を信じて、実世界で大いに使用されています。
例えば:
今では少し役に立たないように思えるかもしれませんが、数年後、同じ質問を自問してみてください。それがどこで使われるのか疑問に思ったことに驚くでしょう。
編集:ポインタが重要な理由について尋ねたコメントの1つに気付きました。誰かが、ポインターがリンクリストのユーザーにとって実際に重要ではないと答えました。ユーザーは、物事のリストを含むリストが欲しいだけです。そのリストがその物事のリストをどのように「含む」かは、ユーザーにとって本当に重要ではありません。ポインターはその「方法」の一部です。床に描かれた、窓口係につながる線を想像してください。窓口に着くには、その列に立っている必要があります。その行は、リンクされたリストが使用するポインターの例えです(そして、これは少しストレッチです)。行の最初の窓口係の人がリストの先頭です。行のすぐ後ろにいる人がリストの次の人です。そして最後に、行の最後の人は、行の最後の人です。
実例:
** 1)単一リンクリスト**
2)二重リンクリスト
)循環リンクリスト
DNA分子は二重リンクリストです。
考えてみると、「リンク」は、データ間の「次」、「前」、「子」、または「親」の関係を識別するための単なる方法ですインスタンスさまざまなアプリケーションがあります。基本的なリンクリストの単純なリスト(食料品リストなど)を考えてください。ただし、グラフ(地図上の都市間の距離のプロット、生物学における種間の相互作用)またはツリー(2つの非常に多様な例の組織の階層またはデータベースのインデックスのデータ)を配置できる用途も考慮してください。
一般的なケースでは、リンクリストはあなたが遭遇する最も悪魔的に有用なものの一つです。
実世界の例:
何か他のもののために並んで待っている人々の束-「キュー」と呼ばれる特別な種類のLL。
食器棚の食器棚-「スタック」と呼ばれる特別な種類のLL。
「数字を取る」行(数字はある時点で「1」からやり直さなければならない)-「循環キュー」と呼ばれる特別な種類のLL。
一般的に、リンクされたほとんどすべてのデータ構造に使用するのが好きなメタファーは、デッキのカードです。リンクリストでできることはほぼすべて、カードのデッキを使用して視覚化できます。これは、いくつかのより難解なソートアルゴリズムで何が行われているのかを示すのに特に便利です。
私の個人的なお気に入り: Bogosort =デッキがソートされるまで52枚のカードピックアップをプレイします。 :-)
人間の脳は単独リンクリストの良い例です。何かを学ぶ初期段階ではby by heart、自然なプロセスは1つのアイテムを次のアイテムにリンクすることです。それは潜在意識の行為です。 mugging Wordsworthの8行Solitary Reaperの例を見てみましょう:
Behold her, single in the field,
Yon solitary Highland Lass!
Reaping and singing by herself;
Stop here, or gently pass!
Alone she cuts and binds the grain,
And sings a melancholy strain;
O listen! for the Vale profound
Is overflowing with the sound.
私たちの心は、ランダムアクセスを容易にする配列のようにうまく機能しません。あなたが男に尋ねた場合最後の行は何ですか、彼に伝えるのは難しくなります。彼はそこに到達するために1行目から行かなければなりません。あなたが彼に尋ねるとさらに難しいです5行目は何ですか.
同時に彼にポインターを与えると、彼は前進します。 Ok start from Reaping and singing by herself;
?今では簡単になります。彼に2行、Alone she cuts and binds the grain, And sings a melancholy strain;
流れが良くなったからです。 同様に、何も与えない場合、彼は最初から始めて行を取得する必要があります。これは、古典的なリンクリストです。
アナロジーには、うまく適合しない可能性のある異常はほとんどありませんが、これはリンクリストの仕組みを多少説明しています。ある程度上手くなったか、詩を裏返しに知ったら、リンクされたリストはハッシュテーブルまたは配列に転がり(頭脳)、O(1)どこからでも行。
この質問に対する私の最初の反応は、「見て回る!このものはどこにでもある!しかし、それについて少し考えた後、不自然な例は考えられませんでした。
リンクリストの概念は、複合概念である2ファーです。リストの概念がありますが、これは問題ありません。たとえば、食料品リスト。次に、リンク部分に移動します。ある食料品は次の食料品について知らないため、モデルは故障します。
実世界のサンプルを見つけるのに苦労しているのは、リンク部分がプログラミングの成果物であり、実装の詳細だからだと思います。リストをプログラムで実装するには多くの方法がありますが、1つの良い方法は、各リストアイテムにその近隣を知らせることです。もう1つの方法は、アイテムとその順序を追跡するListオブジェクトを持つことです。これは、ほとんどのリストが実際に機能する方法です。上記の例では、食料品リストのListオブジェクトは、書かれている紙(または何でも)です。
リストを一般的に考え、リンクされたリストをリストの特定の実装として表示する方が便利かもしれません。
教師が生徒を漫画映画に連れて行っても席を確保できなかった場合、次の生徒の住所(座席番号)を覚えておくように生徒に求めます...戻りながらトラブルに直面する!!!
リンクされたリストを見てください:
[A] => [B] => [C] => [D] =>
それは...列車です!各鉄道車両には何かが含まれており、別の鉄道車両に取り付けられています(最後の車両には何も取り付けられていません)。鉄道車両は最後にしか追加できません。1台をなくしたい場合は、前の車両を次の車両に接続する必要があります。
電話チェーンは、リンクリストとして直接実装されます。仕組みは次のとおりです。
グループ主催者は、すべてのメンバーの電話番号を収集します。
オーガナイザーは、各メンバーに他の1人のメンバーの番号を割り当てます。 (時々、彼らはメッセージが通過したことを知るために彼ら自身の番号を割り当てるでしょうが、これはオプションです。)
メッセージを送信する必要がある場合、オーガナイザーはリストの先頭を呼び出してメッセージを配信します。
ヘッドは割り当てられた番号を呼び出し、メッセージを配信します。
全員がメッセージを聞くまで、手順4を繰り返します。
明らかに、ステップ2でリストを設定して、全員がリンクされるように注意する必要があります。また、リストは通常公開されているため、誰かが留守番電話やビジートーンを受け取った場合、次の番号を呼び出してチェーンを動かし続けることができます。
二重リンクリストの最もわかりやすい例はTrain!です。
ここで、各コーチは前と次のコーチに接続されます(最初と最後を除く)
プログラミングの観点から、コーチ本体をデータ(値)ノードとして、コネクターを参照ノードとして検討してください。
単一のリンクリストの例。
二重リンクリストの例。
移動方向の指定:方向の各ステップがノードになり、各ノード間の移動指示がリンクになります。
例:
ノード1:自宅で開始
リンク:ボブの家まで南に3ブロック歩く
ノード2:ボブの家
リンク:アリスの家まで北に2ブロック歩きます。
ノード3:アリスの家
ある場所から別の場所に移動したい場合は、各中間の場所(ノード)からリンク(指示)をたどる必要があります。自宅からアリスにスキップすることはできません。
彼は実際的な例を求めました。だから私はそれにショットを与えます:
ファイアウォールを書いているとしましょう。このファイアウォールには、IPホワイトリストとIPブラックリストがあります。
IP、ジョブIP、およびテストIPの一部をホワイトリストに登録する必要があることを知っています。そのため、すべてのIPをホワイトリストに追加します。
これで、ブロックする必要がある既知のIPのリストもあります。そのため、それらのIPをブラックリストに追加します。
なぜこれにLinkedListを使用するのでしょうか?
リンクされたリストは、それぞれが1つのアイテムを含む論文のスタックに非常に似ています。 (ペグボードのような配列とは対照的に。)これらは一般的に、これらの特性の問題を解決するために使用されます。
単純な配列を再配置するのは苦痛であり、配列に十分なメモリなどがあることを確認しながら要素を中央のどこかに追加するのは苦痛です。リンクリストを使用すると、これらの操作は簡単です。アイテム#10をアイテム#2とアイテム#3の間に移動したいとします。書類を使えば、手に取って移動するだけで済みます。配列では、アイテム3〜9をスロット上に移動してから挿入する必要があります。リンクリストを使用すると、次のようになります。それが3である後、10を教えてください。
アイテムを追加するのが非常に簡単で、プログラムで「リスト内のすべてのアイテムにこのアクションを実行する」と言うのが簡単なため、今いくつかを使用しています。それらの1つは、スプレッドシートのようなエントリのリストです。もう1つは、最初のリストを調べて特定の値を持つすべてのアイテムへの参照を追加することで作成し、それらのアイテムに対してバッチ操作を実行できるようにします。アイテムを真ん中から引き抜いたり、真ん中に追加したりできるので、配列の長さを気にする必要がありません。これらは私の経験の主な利点です。
オペレーティングシステムでは...リンクリストを使用して、実行中のプロセスとスリープ中のプロセスを追跡できます...実行中のスリープ中のプロセス...処理し、スリープ時間が過ぎると、アクティブプロセスLinkedListに追加します。
たぶん、新しいOSはいくつかのファンキーなデータ構造を使用しています...リンクリストはそこで使用できます
配列とは対照的に、2つの重要な特徴を強調できる良い類似性はないと思います。1。現在のアイテムの後に挿入するのが効率的である、2。インデックスで特定のアイテムを見つけるのが非効率的です。
通常は、特定のアイテムを挿入または検索する必要がある非常に多数のアイテムを処理しないため、そのようなことはありません。たとえば、砂の袋がある場合、それは何億もの穀物になりますが、特定の穀物を見つける必要はなく、穀物の順序は重要ではありません。
小さいコレクションを扱う場合、必要なアイテムを視覚的に見つけることができます。または、図書館の本の場合は、ディクショナリーのような組織になります。
最も近い例えは、チェーンのリンク、ネックレスのビーズ、電車などのリンクされたアイテムを通過する盲人を持っていることです。彼は特定のアイテムを探しているか、現在のアイテムの後にアイテムを挿入する必要があるかもしれません。盲人は非常に迅速にそれらを通過できることを付け加えると良いかもしれません。毎秒100万個のビーズがありますが、一度に1つのリンクしか感じられず、チェーン全体またはその一部を見ることができません。
この類推は二重リンクリストに似ていることに注意してください。物理的な接続を持つことはバックトラックする能力を意味するため、単一リンクリストと同様の類推は考えられません。
私は、真珠のネックレスのような円形のリンクリストを考えるのが好きです。各真珠には少しのデータが含まれています。文字列をたどって次のデータの真珠にたどり着くと、最終的には再び最初に戻ります。
.NET BCLでは、クラスSystem.Exception
にはInnerException
というプロパティがあり、これは別の例外を指すか、null
です。これにより、リンクリストが形成されます。
System.Type
、BaseType
プロパティは同じ方法で別の型を指します。
make
プログラム内では、ビルドする必要のある特定のファイルの依存関係リストが、ビルドする必要がある他のファイルへのポインターのリンクリストとして定義されていることがよくあります。リスト。
データ構造としてリンクリストを見てください。 OODで自己凝集を表すメカニズムです。そして、あなたはそれを現実世界のオブジェクトと考えるかもしれません(一部の人々にとっては現実です)
彼らはいつも就学前の子供たちにこれをします。道路などで屋外にいる場合、各子供は他の子供の手を握るように求められます。各子供は、彼または彼女が誰の手を握るべきかを知っています。それが彼らが道を横断する方法です。これは二重リンクリストの典型的な例だと思います。
2つ以上のコンパートメントを持つ2つ以上のボックスを検討してください。 (この例では、各ボックスには2つのコンパートメントがあります)最初のコンパートメントにはいくつかの情報が含まれます。数字または単語。 2番目のコンパートメントは、次のボックスを指す矢印を保持します。
各ボックスには、矢印(ポインター)と情報(データ)を含む複数の区画が含まれることがあります。
リンクリストの良い例は、テキストメッセージです。特定のパケットは、メッセージをいくつかのパケットに分割できます。各パケットは、次のキーとn番目のキーに接続するキーを保持し、キーとデータを含むテキストメッセージ全体を作成します。