すべてのプログラマーが知っておくべき8つの一般的なデータ構造

Yunqi情報:[ クリックして他の業界情報を表示 ]
ここでは、さまざまな業界の直接のShangyun 情報を見つけることができます。

データ構造は、データを整理して保存する特別な方法であり、これにより、保存されたデータに対する操作をより効率的に実行できます。データ構造は、コンピュータサイエンスおよびソフトウェアエンジニアリングでさまざまな用途に使用されます。

1826B3D4_0FA5_4049_B4C2_CC8725898B5C

ほとんどすべての開発されたプログラムまたはソフトウェアシステムはデータ構造を使用します。さらに、データ構造はコンピュータサイエンスとソフトウェアエンジニアリングの基盤に属します。これは、ソフトウェアエンジニアリングのインタビューの質問に関しては重要なトピックです。したがって、開発者はデータ構造を完全に理解している必要があります。

この記事では、すべてのプログラマーが知っておく必要がある8つの一般的なデータ構造について簡単に説明します。

1.アレイ

配列は、同じデータ型の項目を保持できる固定サイズの構造です。整数の配列、浮動小数点数の配列、文字列の配列、または配列の配列(2次元配列など)でもかまいません。配列にはインデックスが付けられているため、ランダムアクセスが可能です。

E1A184FD_A4D0_415d_B2C1_0682D67CD81D

配列演算

  • トラバーサル:すべての要素をトラバースして印刷します。
  • 挿入:1つ以上の要素を配列に挿入します。
  • 削除:配列から要素を削除します
  • 検索:配列内の要素を検索します。値またはインデックスで要素を検索できます
  • 更新:特定のインデックスにある既存の要素の値を更新します

アレイアプリケーション

  • 配列リスト、ヒープ、ハッシュテーブル、ベクトル、行列など、他のデータ構造を構築するための基礎として使用されます。
  • 挿入ソート、クイックソート、バブルソート、マージソートなどのさまざまなソートアルゴリズムに使用されます。

2.リンクされたリスト

リンクリストは、互いにリンクされた一連の線形順次アイテムで構成される順次構造です。したがって、データに順次アクセスする必要があり、ランダムアクセスはできません。リンクリストは、動的セットのシンプルで柔軟な表現を提供します。

リンクリストに関連する次の用語について考えてみましょう。図2を参照すると、明確なアイデアを得ることができます。

  • リンクされたリストの要素はノードと呼ばれます。
  • 各ノードには、キーとその後続ノード(次と呼ばれる)へのポインターが含まれています。
  • headという名前の属性は、リンクリストの最初の要素を指します。
  • リンクされたリストの最後の要素はテールと呼ばれます。

60167FAC_B2FF_4ab9_B8BB_0D329E6FB225

以下は、使用可能なさまざまな種類のリンクリストです。

  • シングルチェーンリストは、順方向にのみ項目をトラバースできます。
  • 二重リンクリストは、アイテムを順方向および逆方向にトラバースできます。ノードは、前のノードを指す前のものと呼ばれる追加のポインターで構成されます。
  • 循環リンクリスト-頭への前のポインターが尾を指し、頭への次のポインターが頭を指すリンクリスト。

リンクリスト操作

  • 検索:単純な線形検索によって、指定されたリンクリストでキーkを持つ最初の要素を検索し、その要素へのポインターを返します
  • 挿入:リンクリストにキーを挿入します。挿入は、リストの最初に挿入する、リストの最後に挿入する、リストの中央に挿入するという3つの方法で実行できます。
  • 削除:指定されたリンクリストから要素xを削除します。1つのステップでノードを削除することはできません。削除は、リストの最初から削除する、リストの最後から削除する、リストの中央から削除するという3つの方法で実行できます。

リンクリストの適用

  • コンパイラ設計でのシンボルテーブル管理に使用されます。
  • Altを使用するプログラムを切り替えるために使用されます(循環リンクリストを使用して実装)。

3.スタック

スタックはLIFO(後入れ先出し-最後に配置された要素に最初にアクセスできる)構造であり、通常多くのプログラミング言語で見られます。この構造は、実際のスタックボードスタックに似ているため、「スタック」と呼ばれます。

スタック操作

スタックで実行できる2つの基本操作を次に示します。スタック操作をよりよく理解するには、図3を参照してください。

  • プッシュ:スタックの一番上にある要素をプッシュします。
  • ポップポップ:一番上の要素を削除して戻ります。

3055A28C_072A_4abe_A939_6CB7CFBFCBE8

さらに、スタックがそのステータスをチェックするために、次の追加機能が提供されます。

  • ピープ:スタックを削除せずに一番上の要素に戻ります。
  • isEmpty:スタックが空かどうかを確認します。
  • isFull:スタックがいっぱいかどうかを確認します。

スタックアプリケーション

  • 式の評価に使用されます(例:数式を解析および評価するためのヤードアルゴリズム)。
  • 再帰的プログラミングで関数呼び出しを実装するために使用されます。

4.キュー

キューはFIFO(先入れ先出し-最初に配置された要素に最初にアクセスできる)構造であり、通常、多くのプログラミング言語で見られます。この構造は、実際の人がキューで待機するキューに似ているため、「キュー」と呼ばれます。

キュー操作

キューで実行できる2つの基本操作を以下に示します。スタック操作をよりよく理解するには、図4を参照してください。

  • エンキュー:要素をキューの最後に挿入します。
  • デキュー:キューの先頭から要素を削除します。

0E133E1E_26B5_40e8_9430_9E777F80183D

キューアプリケーション

  • 複数のスレッドでスレッドを管理するために使用されます。
  • キューイングシステム(優先キューなど)の実装に使用されます。

5.ハッシュテーブル

ハッシュテーブルは、各キーに関連付けられたキーの値を格納するために使用されるデータ構造です。さらに、値に関連付けられたキーがわかっている場合は、検索を効果的にサポートします。したがって、データのサイズに関係なく、挿入と検索は非常に効果的です。

テーブルに格納する場合、ダイレクトアドレッシングは値とキーの間の1対1のマッピングを使用します。ただし、キーと値のペアが多数ある場合、この方法には問題があります。テーブルには多くのレコードがあり、非常に大きいため、通常のコンピュータで使用可能なメモリを考慮すると、テーブルを保存することは実際的でないか、不可能でさえあります。この問題を回避するために、ハッシュテーブルを使用します。

ハッシュ関数

ハッシュ関数(h)と呼ばれる特別な関数は、直接アドレッシングにおける上記の問題を克服するために使用されます。

直接アクセスでは、キーkの値はスロットkに格納されます。ハッシュ関数を使用して、各値が指すテーブル(スロット)のインデックスを計算できます。指定されたキーのハッシュ関数を使用して計算された値はハッシュ値と呼ばれ、値がマップされるテーブルのインデックスを表します。

  • h:ハッシュ関数
  • k:ハッシュ値を決定する必要があるキー
  • m:ハッシュテーブルのサイズ(使用可能なスロットの数)。正確な2の累乗に近くない素数は、mに適した選択です。

E9047EBD_6D35_4cb6_A216_687141B326A5

上記の最後の2つの例から、ハッシュ関数が複数のキーに対して同じインデックスを生成すると、競合が発生することがわかります。適切なハッシュ関数hを選択し、リンクやオープンアドレス指定などの手法を使用することで、競合を解決できます。

ハッシュテーブルアプリケーション

  • データベースインデックスの実装に使用されます。
  • 連想配列の実装に使用されます。
  • 「セット」データ構造を実装するために使用されます。

6.ツリー

ツリーは、データがレイヤーに編成され、互いにリンクされている階層構造です。この構造は、アイテムが線形順序でリンクされているリンクリストとは異なります。

過去数十年にわたって、特定の用途に適合し、特定の制限を満たすために、さまざまな種類の木が開発されてきました。いくつかの例は、二分探索木、B木、赤黒木、拡張木、AVL木、およびn分木です。

二分探索木

名前が示すように、バイナリサーチツリー(BST)は、データが階層構造で編成されているバイナリツリーです。このデータ構造はソートされた順序で値を格納します。このコースでは、これらの値について詳しく学習します。

バイナリサーチツリーの各ノードには、次の属性が含まれています。

  • key:ノードに保存されている値。
  • left:左の子へのポインター。
  • 右:正しい子へのポインター。
  • p:親ノードへのポインター。
    バイナリ検索ツリーには、他のツリーと区別するための固有の属性があります。この属性は、バイナリ検索ツリー属性と呼ばれます。

xをバイナリ検索ツリーのノードとします。

  • yがxの左側のサブツリーのノードである場合、y.key≤x.key
  • yがxの右側のサブツリーのノードである場合、y.key≥x.key

BA848ABC_4916_4f8e_A120_F1EFFDEB0CFA

木の応用

  • バイナリツリー:式パーサーと式ソルバーの実装に使用されます。
  • バイナリ検索ツリー:継続的にデータを入力および出力する多くの検索アプリケーションで使用されます。
  • ヒープ:Javaオブジェクトを格納するためにJVM(Java仮想マシン)によって使用されます。
  • トラップ:ワイヤレスネットワークに使用されます。

7.ヒープ

ヒープはバイナリツリーの特殊なケースで、親ノードとその子ノードの値が比較され、それに応じて配置されます。
ヒープの表現方法を見てみましょう。ヒープは、ツリーと配列を使用して表すことができます。図7および8は、バイナリヒープを表すためにバイナリツリーと配列を使用する方法を示しています。

01D40240_D0D3_4f49_885A_5E6C6647E225

ヒープには2つのタイプがあります。

  • 最小ヒープ-親のキーが子のキー以下です。これはmin-heap属性と呼ばれます。ルートには、ヒープの最小値が含まれます。
  • ヒープの最大数-親のキーが子のキー以上です。これはmax-heap属性と呼ばれます。ルートには、ヒープの最大値が含まれます。

ヒープアプリケーション

  • 優先度値はヒープ属性に従ってソートできるため、優先度キューを実装するために使用されます。
  • ヒープをO(log n)時間で使用して、キュー機能を実装できます。
  • 指定された配列でk個の最小(または最大)値を見つけるために使用されます。
  • ヒープソートアルゴリズムに使用されます。

8.写真

グラフは、頂点またはノードの限定されたセットと、これらの頂点を接続するエッジのセットで構成されます。
グラフの順序は、グラフ内の頂点の数です。グラフのサイズは、グラフのエッジの数です。
2つのノードが同じエッジを介して相互に接続されている場合、それらは隣接ノードと呼ばれます。

有向グラフ

グラフGのすべてのエッジに、開始頂点と終了頂点を示す方向がある場合、そのグラフは有向グラフと呼ばれます。
(u、v)が頂点uから頂点uに出入りした後、頂点vに出入りするとします。
自己ループ:頂点からそれ自体のエッジまで。

無向グラフ

グラフGのすべてのエッジに方向がない場合、無向グラフと呼ばれます。2つの方法で2つの頂点間を拡散できます。
頂点がグラフの他のノードに接続されていない場合、その頂点は孤立しているといいます。

47701E44_A860_436c_9A3F_2B6662BDFBF0

グラフの応用

  • ソーシャルメディアネットワークを表すために使用されます。各ユーザーは頂点であり、ユーザーが接続するとエッジが作成されます。
  • Webページと検索エンジンのリンクを表すために使用されます。インターネット上のWebページは、ハイパーリンクを介して相互にリンクされています。各ページは頂点であり、2つのページ間のハイパーリンクはエッジです。Googleでページをランク付けするために使用されます。
  • GPSで位置とルートを表すために使用されます。場所は頂点であり、場所を結ぶルートはエッジです。2つの場所間の最短経路を計算するために使用されます。

[雲旗オンライン教室]毎日、製品技術の専門家が共有しています!
コースアドレス:https : //yqh.aliyun.com/zhibo

今すぐコミュニティーに参加し、専門家と顔を合わせて、コースの最新の動向に遅れないようにしてください!
【Yunqiオンライン教室コミュニティ】https://c.tb.cn/F3.Z8gvnK

このコミュニティに盗用の疑いがあることが判明した場合は、yqgroup @ service.aliyun.comに電子メールを送信して、関連する証拠を報告および提供してください。確認後、コミュニティは侵害の疑いのあるコンテンツを直ちに削除します。

元のリンク
この記事はYunqiコミュニティの元のコンテンツであり、許可なしに複製することはできません。

元の記事2315件を公開 2062件のいいね 158万回

おすすめ

転載: blog.csdn.net/yunqiinsight/article/details/105398378