序文 これは「JavaScript のデータ構造とアルゴリズムを学ぶ」の最後のブログです。これは、面接でよく聞かれる内容の一部であるソートと検索でもあります。このブログ投稿の前は、ソートの問題を見ると、バブル ソート、2 層トラバーサル、それだけだと思い込んでいて、ソート関連の問題を詳しく調べようとは思っていませんでした。同じような経験をお持ちの方は、以下の内容が参考になれば幸いです。 1. 準備 本題に入る前に、いくつかの基本的な機能を準備しましょう (1)配列の2つの要素を入れ替える
(2)0~Nの配列を素早く生成します。その他の生成方法については、こちらをクリックしてください。
(3)シャッフル機能 シャッフル機能を使用すると、配列をすばやくシャッフルできます。一般的な用途としては、音楽の再生順序を切り替えることが挙げられます。
2. ソート 一般的なソートアルゴリズムは、次の 2 つのカテゴリに分けられます。
このブログでは、比較ソートのいくつかのソート方法のみを紹介します。 2.1 バブルソート バブルソートはすべてのソートアルゴリズムの中で最も単純なもので、通常はソートを学習するための入門書となります。しかし、実行時間の観点から見ると、バブルソートは最悪のソート方法です。 コア: 隣接する 2 つの項目を比較し、最初の項目が 2 番目の項目より大きい場合はそれらを交換します。泡が表面に上がってくるように、アイテムは正しい順序で上方に移動するので、バブルソートと呼ばれます。 注: 最初のレイヤーを走査して残りの要素の最後の値を見つけ、最後の値を指定された位置まで順番にバブルアップします。 コード:
2.2 選択ソート 選択ソートは、インプレース比較ソート アルゴリズムです。 コア: まず、ソートされていないシーケンス内の最小要素を見つけて、ソートされたシーケンスの開始位置に格納します。次に、残りのソートされていない要素から最小要素を探し続け、ソートされたシーケンスの最後に配置します。すべての要素がソートされるまでこれを繰り返します。 注: 最初のレイヤーは、残りの要素の最小値のインデックスを見つけるためにトラバースし、現在の位置と最小インデックス値を交換します[順番に最小値を見つけます] コード:
2.3 挿入ソート 挿入ソートの比較順序は、バブルソートや選択ソートと異なります。挿入ソートの比較順序は、現在の項目を前方に比較することです。 コア:順序付けられたシーケンスを構築することで、ソートされていないデータの場合は、ソートされたシーケンスの後ろから前に向かってスキャンし、対応する位置を見つけて挿入します。 注: 2番目の項目から始めて、現在の項目の前のシーケンスが順番に配置されていることを確認するために、順方向に比較します。 コード:
2.4 マージソート マージソートとクイックソートは、上記の3つのソートアルゴリズムよりも実際にはより実現可能です(第4セクションでは、これらのソートアルゴリズムを実際の複雑さに基づいて比較します)。 JavaScript Array クラスは、JavaScript 配列をソートするためのソート関数 (Array.prototype.sort) を定義します。 ECMAScript ではどのソートアルゴリズムを使用するかは定義されていないため、ブラウザメーカーが独自にアルゴリズムを実装できます。たとえば、Mozilla Firefox は Array.prototype.sort の実装としてマージソートを使用しますが、Chrome はクイックソートのバリアントを使用します。 マージソートは分割統治アルゴリズムです。アイデアは、元の配列を、各小さな配列に位置が 1 つだけになるまで小さな配列に分割し、その後、小さな配列を大きな配列にマージして、ソートされた大きな配列が 1 つだけになるまで続けることです。したがって再帰が必要である コア: マージソート、2つの配列に分割し、別々にソートしてからマージする 注: 再帰内の最小の左と右の配列は、単一要素の配列と比較されるため、上位レベルで複数の要素を比較する場合は、左と右の配列が順序どおりになっている必要があります。 コード:
2.5 クイックソート クイックソートはおそらく最も一般的に使用されるソートアルゴリズムです。その複雑度は O(nlogn) であり、そのパフォーマンスは通常、複雑度が O(nlogn) の他のソート アルゴリズムよりも優れています。マージソートと同様に、クイックソートも分割統治法を使用して元の配列を小さな配列に分割します。 コア:分割統治アルゴリズム、基準値を境界としてそれより小さい値と大きい値を分離する 注: 各トラバーサルはベンチマークポイントより小さい値を除外します コード:
3. 検索アルゴリズム 3.1 シーケンシャルサーチ 順次検索または線形検索は、最も基本的な検索アルゴリズムです。そのメカニズムは、データ構造内の各要素と探している要素を比較することです。順次検索は最も効率的な検索アルゴリズムです。
3.2 二分探索 バイナリ検索では、検索対象のデータ構造がすでにソートされている必要があります。アルゴリズムが実行する手順は次のとおりです。
4. アルゴリズムの複雑さ 4.1 Big O 表記法の理解 Big O 表記法は、アルゴリズムのパフォーマンスと複雑さを記述するために使用されます。アルゴリズムを分析するときに、次のタイプの関数に遭遇することがよくあります。 (1) O(1)
実行時間とパラメータは無関係です。したがって、上記の関数の計算量はO(1)(定数)である。 (2)O(n) 順次検索機能を例にとると、要素を見つけるには、要素が見つかって停止するまで配列全体を走査する必要があります。関数を実行するための総コストは、配列要素の数 (配列のサイズ) と検索対象の値によって異なります。ただし、関数の複雑さは最悪のケースによって異なります。配列のサイズが 10 の場合、オーバーヘッドは 10 です。配列のサイズが 1000 の場合、オーバーヘッドは 1000 です。この関数の時間計算量は O(n) です。ここで、n は (入力) 配列のサイズです。 (3)O(n2) バブルソートを例にとると、最適化されていない場合、各ソートは n*n 回実行する必要があります。時間計算量はO(n2)である。 時間計算量が O(n) のコードにはループの層が 1 つしかありませんが、時間計算量が O(n2) のコードにはネストされたループの層が 2 つあります。アルゴリズムに配列を走査する 3 つのネストされたループがある場合、その時間計算量は O(n3) になる可能性があります。 4.2 時間計算量の比較 (1)一般的なデータ構造の時間計算量 (2)ソートアルゴリズムの時間計算量 |
<<: 携帯電話の AI 技術を使って撮影した写真は、本当に一眼レフカメラで撮影した写真に匹敵するのでしょうか?
>>: 百度副社長の尹世明氏:人工知能のプライバシー問題は技術で解決できる
CCTV スクリーンショット街面の李婷が報告顔認識の応用シナリオはますます多様化しており、その背後...
[51CTO.com クイック翻訳] Facebookの機械学習フレームワークPyTorchは、20...
今日は古い知識を学んだのですが、普段私たちが使っている携帯電話の顔認識は顔の部分だけを認識するもので...
画像処理のためのディープラーニング入門:耳のバイオメトリクスは注目の研究トピックとなっている[1]。...
賢明なビル管理者は、AI がビルの自動化だけでなく、より適応性の高いものにするのにも役立つことを知っ...
これは単純なプッシュです。今日はディープラーニングという名前についてのみお話します。ディープラーニン...
英国ラフバラー大学とチェルシー・フットボール・クラブの研究者らが共同で、最近のシーズンの選手のデータ...
「サービスとしての」配信モデルの誕生以来、SaaS と PaaS は日常的な技術用語の一部となり、企...
1. はじめにこの論文では、新しい MAGIC (iMAge-guided text Generat...
未来のスマートワールドでは、あらゆるものがモノのインターネットでつながり、あらゆるものがインテリジェ...
Microsoft は、仮想会議用に Mesh for Teams と呼ばれる没入型 3D プラット...
AIOps (IT 運用のための人工知能)、つまりインテリジェントな運用と保守は、人工知能の機能を運...