データ構造101:配列—初心者向けの視覚的な紹介

毎日使用するデータ構造を理解してください。

👋ようこそ!重要なコンテキストから始めましょう。これを聞いてみましょう:

✅スマートフォンで音楽を聴いていますか?

✅電話に連絡先のリストを保持していますか?

✅競技中にリーダーボードを見たことがありますか?

これらの質問のいずれかに対する答えが「はい」の場合は、配列を使用したことがあり、それを知らなかったことはほぼ確実です。😃配列は、要素のリストを格納する非常に強力なデータ構造です彼らは無限のアプリケーションを持っています。それらはコンピュータサイエンスの世界で非常に重要です。

この記事では、配列の長所と短所、それらの構造、操作、およびユースケースについて学習します。

さぁ、始めよう!👍

🔎配列の基本構造を深く掘り下げる

それらがどのように機能するかを理解するには、以下のように、コンピューターのメモリをグリッドとして視覚化すると非常に役立ちます。各情報は、グリッドを構成する小さな要素(正方形)の1つに格納されます。

配列は、この「グリッド」構造を利用する店舗で、関連情報の一覧隣接するメモリ位置、それらの値を見つけるための極端な効率を保証します。🔳🔳🔳🔳

次のような配列を考えることができます。

それらの要素は、メモリ内で互いに隣り合っています。それらの複数にアクセスする必要がある場合、コンピュータは値がどこにあるかをすでに知っているため、プロセスは非常に最適化されています。

すごいですよね?これが舞台裏でどのように機能するかを学びましょう!😃

📚分類

配列は以下のように分類されている均質なデータ構造彼らので、同じタイプの要素を格納します

数値、文字列、ブール値(trueおよびfalse)、文字、オブジェクトなどを格納できます。ただし、配列に格納する値のタイプを定義したら、そのすべての要素は同じタイプである必要があります。異なるタイプのデータを「混合」することはできません。

👀価値観を読む—魔法が始まります!

配列の驚くべき力は、値にアクセスする効率にあります。これは、グリッドのような構造のおかげで達成されます。これをもっと詳しく見てみましょう。🔍

配列を作成するときは、次のことを行います。

-それを変数に割り当てます。👈

-格納する要素のタイプを定義します。🎈

-サイズ(要素の最大数)を定義します。📚

💡注:この変数に割り当てる名前は、コードの後半で値にアクセスしたり配列を変更したりするために使用するため、非常に重要です。

しかし、どの特定の値にアクセスしたいかをコンピューターにどのように伝えることができますか?ここでインデックスが重要な役割を果たします。

1️⃣インデックス

配列内の値にアクセスするには、「インデックス」(複数形の「インデックス」)と呼ばれるものを使用します。これは、値が格納されている場所を参照する数値です。

次の図に示すように、配列の最初の要素はインデックス0を使用して参照されます。さらに右に移動すると、メモリ内のスペースごとにインデックスが1つずつ増加します。

💡注:最初は1ではなく0から数え始めるのは奇妙に思えますが、これはゼロベースの番号付けと呼ばれます。これは、コンピュータサイエンスでは非常に一般的です。

要素にアクセスするための一般的な構文は次のとおりです。[]

例えば:

配列が変数に格納されていてmyArray、最初の要素(インデックス0)にアクセスする場合は、次を使用します。myArray[0]

2️⃣メモリ

値にアクセスする方法がわかったので、配列がコンピュータのメモリにどのように格納されるかを見てみましょう。配列のサイズを定義すると、メモリ内のそのスペースはすべて、その時点から、挿入する可能性のある将来の値のために「予約」されます。

💡注:配列に値を入力しない場合、そのスペースは予約されたままになり、入力するまで空になります。

例えば:

サイズ5の配列を定義しているが、挿入する値は1つだけであるとします。残りのスペースはすべて空になり、メモリに「予約」され、将来の割り当てを待ちます。

すべての要素がメモリ内の連続したスペースに格納されるため、配列は値へのアクセスに非常に効率的であるため、これは重要です。このようにして、コンピュータはあなたが要求した情報を見つけるためにどこを探すべきかを正確に知っています。

しかし…これにはメモリ効率が良くないため、欠点があります😞。発生しない可能性のある将来の操作のためにメモリを予約しています。これが、格納する要素の数が事前にわかっている状況で配列が推奨される理由です。

🔧操作—舞台裏!

配列が使用されるときの配列と、それらが要素を格納する方法がわかったので、挿入や削除などの操作について詳しく説明します。

1️⃣挿入—ようこそ!

サイズ6の配列があり、まだ空のスペースがあるとしましょう。配列の先頭(インデックス0)に要素「e」を挿入したいのですが、この場所はすでに要素「a」によって占められています。私たちは何をすべき?

配列挿入するには、挿入サイトの右側にあるすべての要素を、1つのインデックスを右側に移動します。要素「a」はインデックス1になり、要素「b」はインデックス2になります。

💡注:要素を含む最後のインデックスを追跡するには、変数を作成する必要があります。上の図では、挿入前に配列がインデックス4まで埋められています。このようにして、配列がいっぱいかどうか、および最後に要素を挿入するために使用するインデックスを決定できます。

これを行った後、要素は正常に挿入されます。👏

⚠️ちょっと待って!アレイがいっぱいの場合はどうなりますか?

配列がいっぱいで要素を挿入しようとするとどうなると思いますか?😱

この場合、新しいより大きな配列を作成し、すべての要素をこの新しい配列に手動でコピーする必要があります。この操作は、時間的に非常に費用がかかります。何百万もの要素を持つ配列があるとしたらどうなるか想像してみてください。それが完了するまでに非常に長い時間がかかる可能性があります。⏳

💡注:この規則の唯一の例外、挿入が非常に速い場合、あなたはの要素を挿入したときである最後(最後の要素の右側に配置されたインデックスの)配列のと、利用可能なスペースがまだあります。これは一定時間O(1)で行われます。

2️⃣削除—さようなら、さようなら!

ここで、配列から要素を削除するとします。

ランダムアクセスの効率を維持するには(インデックスを介して配列に非常に高速にアクセスできる)、要素をメモリの連続したスペースに格納する必要があります。要素を削除してそのスペースを空のままにすることはできません。

削除する要素の後に続く要素を、1つのインデックスを左に移動する必要があります。

そして最後に、この結果の配列ができました👇。ご覧のとおり、「b」は正常に削除されています。

💡注:最後の要素を削除すると、削除は非常に効率的です。要素を含む最後のインデックス(上の図のインデックス3)を追跡するために変数を作成する必要があるため、インデックスを使用してその要素を直接削除できます。

3️⃣要素を見つける

配列内の要素を見つけるには、次の3つのオプションがあります。

  • どこにあるかわかっている場合は、インデックスを使用してください。
  • データがどこにあり、データが並べ替えられているかわからない場合は、バイナリ検索などのアルゴリズムを使用して検索を最適化できます。
  • それがどこにあるかわからず、データがソートされていない場合は、配列内のすべての要素を検索し、現在の要素が探している要素であるかどうかを確認する必要があります(以下の図のシーケンスを参照してください)。

👋まとめ…

  • 配列は、同じタイプの要素を格納する非常に強力なデータ構造です。要素のタイプと配列のサイズは固定されており、作成時に定義されます。
  • メモリは配列が作成された直後割り当てられ、値を割り当てるまで空になります。
  • それらの要素はメモリ内の連続した場所に配置されているため、インデックスを使用して非常に効率的にアクセスできます(ランダムアクセス、O(1)=一定時間)。
  • インデックスは、以前のように1ではなく、0から始まります。
  • 配列の最初または中央に要素挿入するには、要素を右に移動する必要があります。配列がいっぱいの場合は、新しい、より大きな配列を作成します(これはあまり効率的ではありません)。配列の最後に挿入することは非常に効率的で、一定時間O(1)です。
  • 配列の最初または中央から要素削除するには、メモリに空のスペースが残らないように、すべての要素を左に移動する必要があります。これにより、要素がメモリ内の連続したスペースに格納されることが保証されます。最後の要素のみを削除するため、配列の最後で削除すると非常に効率的です。
  • 要素を見つけるには、それが見つかるまで配列全体をチェックする必要があります。データがソートされている場合は、バイナリ検索などのアルゴリズムを使用してプロセスを最適化できます。
「昨日から学び、今日のために生き、明日への希望を。重要なのは、質問をやめないことです。」

- アルバート・アインシュタイン

👋ありがとうございます!

あなたが私の記事を気に入ってくれたことを心から願っています。❤️

このような記事をもっと見つけるには Twitterで私をフォローしてください。😃