科学としてのコンピューティングへの一歩

JSの単純なアルゴリズムとデータ構造

Un-splashのJ. Craigによる写真

アルゴリズムは、問題を解決するために実行される手順です。データ構造は、効率的なアクセスのために編成されたデータです。アルゴリズムを使用して、特定のデータ構造のすべての種類の問題(つまり、データの検索またはデータのコレクションの並べ替え)を解決できます。

したがって、コンピューターに関しては、アルゴリズムはあなたがしていることの方法(すなわち、線形検索、バイナリー検索、バブルソート、選択ソート、挿入ソートなど)であり、データ構造はあなたがそれをしていることです。 to(つまり、配列、キーと値のペアのオブジェクトなど)。そのため、組織化されたデータセットを体系的に検索、ソート、または作成できます。

シンプルなデータ構造

アレイ

配列は、最低(0)から最高(2)のラベルの順に番号付けされたボックス(インデックス)のようなものです。各ボックスは所定の位置に固定されており、ラベルの順番どおりになっています。

任意のラベル付きボックスにジャンプして、そのコンテンツを見る(arrayName [2])、コンテンツを追加する、またはコンテンツを置き換える(arrayName [2] =“ Sherlock Holmes”)ことができます。新たにボックス化されたコンテンツをコレクションの最後にプッシュできます(arrayName.push(“ The Memoirs of Sherlock Holmes”))。

これにより、受信ボックスにシーケンスの次のラベルが与えられます(3)。元のボックス化されたコレクションに戻るには、最後からポップすることができます(arrayName.pop())。

最初のボックス(arrayName.shift())からシフトすることもできますが、これには他のすべてのボックスのラベルを付け直す必要があります。

これで、Sherlock Holmesコレクションが1というラベルの付いたボックスに格納されます。ボックスコレクションのシフトを解除する場合、コンテンツの新しいボックス(arrayName.shift(“ Dr。Strange”))をコレクションの先頭に追加できます。

これにより、0と2のラベルが付いたボックスでDr. Strange&Sherlock Holmesコレクションが得られます。

データ構造の検索

線形検索

線形検索は、ボックスの配列(つまり、0〜16)に沿って歩いて、各カバーを開いてその内容が探しているもの(つまり37)であるかどうかを確認するようなものです。

ソース

そのため、コレクションの開始(0とします)から終了(長さ1未満)までのインデックスの場合、ボックスで目的のコンテンツを検索し、次のコンテンツに進むことができます。一致するものが見つかるまで、あるボックスから次のボックスに増分できます。

バイナリ検索

バイナリ検索は、中身のボックスに途中でジャンプして目的のアイテムの内容をチェックすることにより、コンテンツが順序付けられた(つまり、数値またはアルファベット順)ボックスの配列を検索するようなものです。踏み越えた場合は、現在の位置と開始点の中間で後方にジャンプします。それ以外の場合は、現在の位置とエンドポイントの中間に進みます。

ソース

したがって、できることは、低(最初は0)、中(8)、高(最初は16)のインデックス位置を追跡することです。中間の位置は、常に低指数と高指数の合計の半分です。中央のボックスで一致するもの(つまり、37)をチェックします。予想よりも小さい場合(<37)、次のステップに進みます。ローインデックスをリセットして、現在のミッドポジションに1を渡します(8 + 1 = 9)。次に、新しい中間位置を再計算します((9 + 16)/ 2≈12)。

つまり、低インデックスをリセットし、新しい中インデックスを再計算することで、検索を飛躍させることができます。逆に、踏み越えた場合は、高指数をリセットして新しい中指数を再計算することにより、後方にジャンプできます。

線形検索とは異なり、このタイプはバイナリです。あなたは常にあなたのアイテムがあなたの箱入りコレクションの前半か後半にあるかどうかを推測しています。

データ構造の並べ替え

バブルソート

バブルソートは、高い値を隣接する小さい値と連続的にスワップすることでコレクションをソートすることで、最高値が上にバブリングする効果をもたらします。

ソース

そのため、インデックス0から始まるコレクションの長さについて、現在のインデックス(i)の内容を後のインデックス(i + 1)の内容と交換します(前の方が値が大きい場合)。次に、次のインデックスセット(i + 1対i + 2)などに進みます。

ある時点で、コレクション内で最も価値のあるボックスに到着します。そして、それは前方にスワップされ続けるコンテンツになります。したがって、上に泡立ちます。コレクションが価値の低いものから高いものにソートされるまで、このプロセスを繰り返します。

各反復の最後のボックスは最高値で終了するため、最後のボックスを除外してプロセスを繰り返します。

選択ソート

選択ソートとは、最低値を連続的に選択してコレクションをソートし、一方の端にスワップすることです。

ソース

したがって、ここではコレクション全体をスキャンして、最も低い値を見つけます。見つかったら、そのコンテンツを最低のインデックス(最初はインデックス0)でラベル付けされたボックスと交換します。最小値が正しい位置にあるため、次に低いインデックス(インデックス1)からこのプロセスを繰り返します。すべての反復で、スキャンの長さの範囲は1ずつ減少し、コレクション全体が最低値から最高値にソートされます。

挿入ソート

挿入ソートとは、検出された各値を正しい位置に挿入することにより、コレクションをソートすることです。

ソース

したがって、ここでは、反復ごとにコレクション全体(つまり、バブルと選択の並べ替え)をスキャンするのではなく、インデックス0と1から開始して値を比較します。後者の値が低い場合、インデックス1のコンテンツの値がインデックス0よりも低い場合、それらのコンテンツを入れ替えます。インデックス2の次のボックスに移動し、以前にソートされたボックスと比較します(インデックス1、次にインデックス0)。

より高い値に遭遇するたびに、その内容を右に入れ替えます。正しい位置を見つけたら、コンテンツ(以前はインデックス2にあった)を正しいボックスに挿入します。したがって、後のボックスの内容を「引き出し」て、前のボックスに歩いていくかのようです。

前のボックスの値が保持している値よりも高い場合、その内容を後のボックスに移動します。保持しているものを挿入する正しい場所が見つかるまで、これを繰り返します。

別の単純なデータ構造

キー—値のペアのオブジェクト

キー—値のペアのオブジェクトは、ラベルのない預金ボックスのセットのようなものです。一意のキーはそれぞれ、特定のデータ部分に開きます。配列とは異なり、一意のキーでアクセスできるのは順序付けられていないデータです。

ソース

そのため、キー(objectName [‘s’])を使用して入金ボックスにアクセスしたり、コンテンツを変更したり、指定されたコンテンツ(objectName [’s'] =“ Sherlock Holmes”)を開くキーを作成します。すべての入金ボックス(Object.keys(objectName)またはObject.values(objectName))に作成されたすべてのキーまたはすべてのコンテンツにアクセスできます。

結論

基本的なアルゴリズム(線形検索とバイナリ検索、バブル、選択と挿入の並べ替え)とデータ構造(配列とキー値オブジェクト)は、データ管理に関する時間と空間の問題につながります。データの検索、並べ替え、またはアクセスにかかる時間と、これらのプロセスに必要なメモリ空間を考慮すると、ソフトウェア開発者はコンピュータープログラミングからコンピューターサイエンスに昇格できます。有効性のためのプログラミングを考えることから、効率のためのプログラミングへとあなたを連れて行きます。