[データ構造] 一般的なデータ構造の分析


序文

情報化時代の波の中で、フロントエンド開発業界は急速に発展しており、新しい技術、新しいツール、新しいフレームワークが次々と登場しています。フロントエンド開発者として、熾烈な市場競争で無敵であり続けるためには、常に新しい知識を学び、新しいスキルを習得する必要があります。データ構造はコンピュータサイエンスの中核となる知識分野であり、それを学ぶことで当社の中核的な競争力を向上させることができます。

1. データ構造とは

フォークの定義を 2 つの側面から分析できます

データ構造は、データ オブジェクト、およびそのオブジェクトのインスタンスとインスタンスを構成するデータ要素の間に存在するさまざまな関係です。これらの結合は、関連する関数を定義することで提供できます。"
— "データ構造、アルゴリズム、およびアプリケーション"

自分なりの観点から理解してください。
データ構造とは、一連のデータをより効率的に操作および取得できるように編成する方法です。

2. 共通のデータ構造

1. 配列 (配列)

配列 (Array) は、同じ型のデータ要素を格納するために使用される線形データ構造であり、ほとんどすべてのプログラミング言語が配列型をネイティブにサポートしています。配列は通常、同じデータ型の一連の値を格納するために使用されます。しかし、JavaScript では、さまざまな種類の値を配列に格納できます。

2. 積み重ねる

スタック (スタック) は、後入れ先出しのデータ構造であり、通常、関数呼び出し、式の評価、および後入れ先出しの原則に従うその他の操作を実装するために使用されます。スタックは多くの実際的な問題の解決に役立つため、コンピューター サイエンスで広く使用されています。

スタックの特徴:

  1. 挿入と削除はスタックの最上位でのみ許可されます。
  2. データ構造の最後の要素はスタックの最上位 (top) であり、スタックに入る最初の要素はスタックの最下位 (bottom) になります。
  3. 挿入または削除する場合、スタックの先頭の要素は最後に挿入または削除された位置に残ります。
  4. スタックには、先入れ後出し (FILO) の特性があります。つまり、最後にスタックに入った要素が最初にアクセスされ、削除されます。
    ここに画像の説明を挿入

スタックは、配列、リンク リスト、静的配列、動的配列などのさまざまなデータ構造で実装できます。どの実装を選択するかは、アプリケーションのシナリオとパフォーマンス要件によって異なります。

スタックに対する一般的な操作には次のようなものがあります。

  1. プッシュ: 要素をスタックの先頭に追加します。
  2. ポップスタック (pop): スタックの先頭から要素を削除します。
  3. スタックの最上位要素を取得する (ピーク): スタックの最上位要素を削除せずに返します。
  4. スタックが空かどうかを確認する (isEmpty): スタックが空かどうかを確認します。
  5. スタックのサイズを取得する (size): スタック内の要素の数を返します。

3. キュー

キュー (Queue) は、先入れ先出しのデータ構造であり、通常、タスクのスケジューリング、作業キュー、および先入れ先出しの原則に従うその他の操作を実装するために使用されます。

キューのいくつかの機能:

  1. キューの一方の端で挿入 (エンキュー、エンキュー) を許可し、もう一方の端で削除 (デキュー、デキュー) を許可します。
  2. キュー内の最初の要素はキューの先頭にあり、キューに入る最初の要素はキューの最後にあります。
  3. 挿入または削除する場合、キューの先頭の要素は常に最初に挿入または削除された位置に保持されます。
  4. キューには先入れ先出し (FIFO) の特性があります。つまり、最初にキューに入った要素が最初にアクセスされ、削除されます。
    ここに画像の説明を挿入

キューに対する一般的な操作には次のようなものがあります。

  1. エンキュー: 要素をキューの最後に追加します。
  2. デキュー: キューの先頭から要素を削除します。
  3. 先頭要素を取得 (前): キューの先頭にある要素を返しますが、削除はしません。
  4. キューが空かどうかを確認する (isEmpty): キューが空かどうかを確認します。
  5. キューのサイズを取得する (size): キュー内の要素の数を返します。

4. プライオリティキュー(ヒープ)

ヒープとも呼ばれる優先キュー (PriorityQueue) は、要素が特定の優先順位に従って並べ替えられ、アクセスされる特別なキューです。優先キューには先入れ先出し (FIFO) の特性がありますが、要素がアクセスされるたびに、最も高い優先度を持つ要素が最初にアクセスされます。このため、優先キューは、優先要件に関するタスクのスケジュールの問題を解決するのに非常に適しています。

日常生活における優先キューに似たシナリオ:
● 最初にキューに並んだ人が最初に処理されます。(チケットの購入、チェックアウト)。
● 待機列では、緊急事態(特別な事情)のある方から優先的に対応させていただきます。

プライオリティ キューには次のプロパティがあります。

  1. 先入れ先出し (FIFO): 要素はキューに入った順序でアクセスされ、削除されます。
  2. 優先度: 各要素には優先度があり、要素は優先度に従って並べ替えられます。最も優先度の高い要素が最初にアクセスされます。
  3. 挿入操作: 要素を挿入するときは、要素の優先度に従ってキュー内の要素の位置を決定する必要があります。
  4. 削除操作: 要素を削除する場合、要素の優先度に従って最も優先度の高い要素を見つけて削除する必要があります。

プログラミングでは、優先キューは、タスクのスケジューリング、ネットワーク フロー制御、優先データ構造などを実装するためによく使用されます。優先キューの基本操作と応用シナリオを理解して習得することは、効率的なプログラムを作成するために非常に重要です。

5. リンクリスト

リンク リスト (Linked List) はノード (Node) で構成される動的データ構造であり、各ノードにはデータ (値) と次のノード (next) へのポインターが含まれます。リンク リストは、有向または無向、完全、部分、または双方向にすることができます。リンク リストは、必要に応じて要素を動的に追加または削除できるため、実際のプログラミングに非常に役立ちます。

リンクリストは一方向リンクリストと双方向リンクリストに分かれます

5.1 単一リンクリスト

単一リンク リスト (Singly LinkedList) は、各ノードにデータ (値) と次のノード (next) へのポインターが含まれる単純な形式のリンク リストです。単一リンク リストは一方向にのみトラバースできます。つまり、リンク リストの先頭からリンク リストの末尾までのみアクセスできます。

単一リンクリストのいくつかの特徴を次に示します。

  1. リンクされたリスト内のノードはポインターによって接続されており、各ノードにはデータと次のノードへのポインターが含まれています。
  2. リンク リストの最後のノードのポインタは空 (null) であり、リンク リストの終わりを示します。
  3. リンク リストの最初のノードには、リンク リストの始まりを示す直接の先行ポインタ (prev) がありません。

ここに画像の説明を挿入

単一リンクリストで挿入および削除操作を実行する場合、対応するノードの先行ポインタおよび後続ポインタを変更する必要があります。たとえば、リンクされたリストの途中に要素を挿入する場合、挿入する位置の前のノードを見つけて、その後続ポインタを変更する必要があります。

5.2 二重リンクリスト

二重リンク リスト (Doubly LinkedList) はリンク リストの一種で、各ノードにはデータ (値)、先行ノードへのポインタ (prev)、および後続ノードへのポインタ (next) が含まれます。単一リンク リストとは異なり、二重リンク リストは、リンク リストの先頭や末尾だけでなく、どこからでもアクセスして操作できます。

ここに画像の説明を挿入

二重リンクリストのいくつかの特徴:

  1. リンクされたリスト内のノードはポインタによって接続されており、各ノードにはデータ、先行ノード (prev) へのポインタと後続ノード (next) へのポインタが含まれています。
  2. リンク リストの最後のノードのポインタは空 (null) であり、リンク リストの終わりを示します。
  3. リンク リストの最初のノードには、リンク リストの始まりを示す直接の先行ポインタ (prev) がありません。
  4. 2 つのポインタがあるため、二重リンク リストは単一リンク リストよりも挿入および削除の効率が高くなります。

二重リンクリストで挿入および削除操作を実行する場合、単一リンクリストのようにリンクリスト全体で対応する先行ノードを検索するのではなく、対応するノードの先行ポインタと後続ポインタのみを変更する必要があります。

6. ハッシュテーブル(Hash)

ハッシュテーブル (HashTable) は、キーと値のストレージに基づいたデータ構造であり、迅速に追加、削除、確認、変更できます。ハッシュ テーブルの中心的な考え方は、ハッシュ関数を通じてキー (key) を固定のハッシュ アドレス (ハッシュ アドレス) にマッピングし、ハッシュ アドレスに従ってデータ アクセスを実行することです。ハッシュ テーブルは、辞書、連想配列、マップなどのデータ構造を実装するときによく使用されます。

ハッシュ テーブルは通常、配列に基づいて実装されますが、配列と比較すると次のような利点があります。
● ハッシュ テーブルは、非常に高速な挿入、削除、検索操作を提供できます。
● 値の挿入と削除には、データの量に関係なく、ほぼ一定の時間 (O(1)) がかかります。実際、それを行うには、いくつかの機械命令のみが必要です。
● ハッシュテーブルの速度はツリーよりも速く、目的の要素をほぼ瞬時に見つけることができます。
• ハッシュ テーブルは、ツリーよりもエンコードがはるかに簡単です。

ハッシュ テーブルには次のような欠点もあります。
● ハッシュ テーブル内のデータは順序が乱れているため、その中の要素を固定された方法 (小さいものから大きいものへなど) で走査することができません。
● 通常、ハッシュ テーブル内のキーは繰り返すことができず、異なる要素を格納するために同じキーを配置することはできません。

6.1 ハッシュテーブルのいくつかの概念

  1. ハッシュ 配列範囲内の大きな数値を添え字に変換するプロセスは、ハッシュと呼ばれます。

  2. ハッシュ関数 通常、私たちは単語を大きな数値に変換し、大きな数値をハッシュするコード実装を関数に入れます。これはハッシュ関数と呼ばれます。

  3. ハッシュ テーブルは、最終データが挿入される配列の構造全体をカプセル化し、その結果がハッシュ テーブルになります。

6.2 アドレスの競合

セパレート チェーンとオープン アドレッシングは、ハッシュ テーブルのキーと値のマッピングの競合を解決するためによく使用される 2 つの競合解決戦略です。ハッシュ テーブルでは、複数のキーが同じハッシュ アドレスにマップされると衝突が発生します。競合解決戦略の目標は、競合するキーと値のペアを整理して、必要なときにすぐにアクセスして更新できるようにすることです。
競合に対する一般的な解決策には、チェーン アドレス方式 (ジッパー方式) とオープン アドレス方式の 2 つがあります。

1. チェーンアドレス方式(ジッパー方式)

チェーン アドレス方式は、リンク リストに基づく競合解決戦略です。ハッシュ テーブルでは、各ハッシュ アドレスがバケットとみなされ、各バケットにはリンク リストが含まれます。複数のキーが同じハッシュ アドレスにマップされる場合、これらのキーと値のペアは対応するリンク リストに追加されます。チェーン アドレス方式の利点は、ハッシュ テーブルのスペースを最大限に活用でき、衝突確率が高いシナリオに適していることです。ただし、チェーンアドレス方式の欠点は、挿入と削除の計算量が O(n) であり、ハッシュ テーブルの要素数が多い場合にはパフォーマンスが低下することです。

2. オープンアドレス方式

オープン アドレス指定は、線形プローブ、二次プローブ、ダブル ハッシュなどの手法に基づく衝突解決戦略です。ハッシュ テーブルでは、複数のキーが同じハッシュ アドレスにマップされている場合、次の空のハッシュ アドレスを探すことで衝突を回避できます。オープン アドレス法の利点は、挿入および削除操作の時間計算量が O(1) であることです。これは、競合の可能性が高いシナリオに適しています。ただし、オープンアドレス方式のデメリットは、ハッシュテーブルの空間利用率が低く、一部の空間が無駄になる可能性があることです。

7. 木

ツリーは、ノードとエッジで構成される非線形データ構造です。ツリー データ構造は、組織構造の表現、ファイル システムの表現、二分探索ツリーの表現など、コンピュータ サイエンスで広く使用されています。

ここに画像の説明を挿入
ツリーの主な特徴は次のとおりです。

  1. 各ノードは 0 個以上の子ノードを持つことができ、子ノードのないノードはルート ノード (ルート) と呼ばれます。
  2. ツリー構造は階層関係を持ち、ルート ノードから各リーフ ノードまでのパスは特定の関係を表します。
  3. ツリー データ構造のエッジには方向がなく、隣接するノードを接続するためにのみ使用されます。

子ノードの数に応じて、ツリーは次の基本タイプに分類できます。

  1. 子のないノードはリーフ ノードと呼ばれます。
  2. 子ノードが 1 つだけあるノードは、次数 1 ノードと呼ばれます。
  3. 2 つの子を持つノードは次数 2 ノードと呼ばれます。
  4. ツリーの次数は、すべてのノードの次数の合計です。
  5. ツリーの深さは、ルート ノードからリーフ ノードに渡されるエッジの数を指します。

8. グラフ

グラフは頂点と辺で構成される非線形データ構造であり、現実世界のさまざまな関係を表すために使用されます。

図の特徴:

  1. 頂点のセット: V (頂点) は通常、頂点の集合を表すために使用されます。
  2. エッジのセット: 通常、E (エッジ) はエッジのセットを表すために使用されます。
  3. エッジは頂点と頂点の間の接続です
  4. エッジは有向または無向にすることができます。(たとえば、A — B、通常は無向を意味します。A --> B、通常は有向を意味します)
    ここに画像の説明を挿入
    グラフは、ネットワーク分析、交通計画、ソーシャル ネットワーク、物流ネットワークなどを含めて広く使用されています。プログラミングでは、実際的な問題を解決するために、さまざまな複雑な関係や構造を表現および処理するためにグラフが通常使用されます。グラフの一般的な実装には、隣接リスト、隣接行列、およびヒープが含まれます。

要約する

この記事では、さまざまなデータ構造を紹介しましたが、簡単に説明しただけで、後ほど、それぞれのデータ構造を個別に説明し、javaSript を使用して実装していきます。私に注意を払って!

データ構造はコンピューター サイエンスの基礎であり、データを整理して操作する効率的な方法を提供します。さまざまなタイプのデータ構造を学習することで、実際的な問題をより効率的に解決し、コンピューター システムのパフォーマンスを向上させることができます。この記事がデータ構造への興味を刺激し、学習と実践のプロセスを継続的に探索して進歩させるためのガイドになれば幸いです。

おすすめ

転載: blog.csdn.net/m0_63831957/article/details/130767686