諺にこうあります: 雷鋒が雷鋒塔を倒し、Java が JavaScript を実装します。 Java に頼って普及しようとしていた JavaScript (当初は LiveScript と呼ばれていました) は、当時名前を変えて、今ではとても普及しています。 Node.js の登場により、JavaScript をフロントエンドとバックエンドの両方で使用できるようになりました。 Java は依然としてエンタープライズ ソフトウェア開発の分野で優位に立っていますが (C/C++ の達人の方々、私を攻撃しないでください...)、Web の世界では JavaScript が比類なくトップの座を占めています。 しかし、コンピュータ アルゴリズムとデータ構造の従来の分野では、ほとんどの専門的な教科書や書籍のデフォルト言語は Java または C/C++ です。最近、アルゴリズムとデータ構造に関する知識を深めようとしており、JavaScript をデフォルト言語として使用するアルゴリズムの本を探していたため、これが私にとっては少々問題となっていました。 O'REILLYのAnimalシリーズに「JavaScriptで記述するデータ構造とアルゴリズム」という本があることを知り、ワクワクしながら2日間かけて最初から最後まで読みました。これはフロントエンド開発者向けの非常に優れたアルゴリズム入門書です。しかし、大きな欠点があります。それは、明らかな小さな誤りが多数あり、転職した私のようなプログラマーでも一目でわかるほど明らかな誤りです。もう 1 つの問題は、この本では多くの重要なアルゴリズムとデータ構造の知識が説明されていないことです。重度の強迫性障害の患者である私にとって、これらの問題は耐え難いものです。そこで、意見の相違があったときに、私は情報を探して自分でアルゴリズムを要約することにしました。さて、アルゴリズムの分野で最も基本的な知識であるソートアルゴリズムから始めましょう。 以下のコードには、自分では見つけられないバグやエラー、文法上の不規則性があるはずだと考えています。そのため、専門家にエラーを指摘してもらいたいと思っています。継続的に修正することによってのみ、長期的な進歩を遂げることができるからです。 古典的なアルゴリズムのトップ10 図で要約すると次のようになります。 用語集: n: データサイズ k: 「バケット」の数 インプレース: 一定のメモリを占有し、追加のメモリを占有しない アウトプレース: 余分なメモリを消費する 安定性: ソート後の2つの等しいキー値の順序は、ソート前の順序と同じである バブルソート 最も単純なソートアルゴリズムの 1 つであるバブルソートは、辞書に載っている Abandon と同じような感覚です。常に最初のページにあり、一番最初なので、最も馴染みがあります。 。 。バブルソートには、フラグを設定する最適化アルゴリズムもあります。シーケンスのトラバーサル中に要素が交換されない場合、シーケンスがすでに順序付けられていることが証明されます。しかし、この改善はパフォーマンスの向上にはあまり役立ちません。 。 。 最速はいつですか 入力データがすでに正の順序になっている場合 (すでに正の順序になっているのに、なぜバブルソートが必要なのでしょうか...) 一番遅いのはいつですか? 入力データが逆順の場合 (for ループを記述してデータを逆順に出力できるのに、なぜバブル ソートを使用する必要があるのでしょうか。私は自由ですか...) バブルソートアニメーションのデモンストレーション JavaScriptコードの実装
選択ソート どのようなデータが入力されても時間の計算量は O(n²) であるため、最も安定したソート アルゴリズムの 1 つです。 。 。したがって、使用する場合、データサイズが小さいほど良いです。唯一の利点は、余分なメモリスペースを占有しないことです。 選択ソートアニメーションのデモンストレーション JavaScriptコードの実装
挿入ソート 挿入ソートのコード実装はバブルソートや選択ソートほど単純で粗雑ではありませんが、その原理は最も理解しやすいはずです。ポーカーをプレイしたことがある人なら誰でも数秒で理解できるはずです。もちろん、ポーカーをプレイしているときにカードをランク順に並べることはないと言うのであれば、おそらくこの人生で挿入ソート アルゴリズムに興味を持つことはないでしょう。 。 。 挿入ソートには、バブルソートと同様に、半挿入と呼ばれる最適化アルゴリズムもあります。このアルゴリズムに関しては、教科書からの古典的な引用を使うのは面倒なので、「興味のある学生は授業後に自分で勉強することができます。」 。 。 挿入ソートのアニメーションデモンストレーション JavaScriptコードの実装
シェルソート シェルソートは挿入ソートのより効率的な実装です。挿入ソートとは異なり、より遠い要素を優先します。シェルソートの核心は、間隔シーケンスの設定にあります。間隔シーケンスは事前に設定することも、動的に定義することもできます。間隔シーケンスを動的に定義するアルゴリズムは、アルゴリズム (第 4 版) の共著者である Robert Sedgewick によって提案されました。ここではこのアプローチを使用します。 JavaScriptコードの実装
マージソート 分割統治の考え方の典型的なアルゴリズムの応用として、マージソートは次の 2 つの方法で実装されます。
「データ構造とアルゴリズムの JavaScript 記述」では、著者はボトムアップの反復法を紹介しています。しかし、再帰的な方法については、著者は次のように考えています。 ただし、再帰が深すぎて言語が処理できないため、JavaScript ではこれを行うことはできません。 ただし、アルゴリズムの再帰の深さが深すぎるため、JavaScript ではこれは実現できません。 正直に言うと、この文章はよく分かりません。これは、JavaScript コンパイラのメモリが少なすぎて再帰が深すぎるため、メモリ オーバーフローが簡単に発生する可能性があることを意味しますか?偉大な神様が私にアドバイスを与えてくれることを願っています。 選択ソートと同様に、マージソートのパフォーマンスは入力データの影響を受けませんが、時間の計算量が常に O(n log n) であるため、選択ソートよりもはるかに優れたパフォーマンスを発揮します。コストは、必要な追加のメモリスペースです。 マージソートのアニメーションデモンストレーション マージソートの JavaScript コードの実装:
クイックソート クイックソートは、ソートアルゴリズムにおける分割統治の考え方のもう 1 つの典型的な応用です。本質的に、クイックソートはバブルソートに基づく再帰的な分割統治法とみなされるべきです。 クイック ソートという名前は単純で大雑把です。この名前を聞いた瞬間に、その存在の意味がわかります。つまり、高速で効率的です。これは、ビッグ データを処理するための最速のソート アルゴリズムの 1 つです。最悪ケースの時間計算量は O(n²) に達しますが、これは優れた結果です。ほとんどの場合、平均時間計算量が O(n log n) のソート アルゴリズムよりも優れたパフォーマンスを発揮します。しかし、その理由はわかりません。 。 。幸いなことに、私の強迫性障害は再発し、多くの情報を確認した後、ついに「アルゴリズム アートおよび情報科学コンテスト」で満足のいく答えを見つけました。 クイックソートの最悪ケースの実行時間は、例えばシーケンシャルシーケンスのクイックソートの場合、O(n²) です。しかし、償却予想時間は O(n log n) であり、O(n log n) 表記法で暗示される定数係数は非常に小さく、複雑性が安定して O(n log n) に等しいマージソートよりもはるかに小さくなります。したがって、弱い順序を持つほとんどの乱数シーケンスでは、クイック ソートがマージ ソートよりも常に優れています。 クイックソートアニメーションのデモンストレーション クイックソートの JavaScript コードの実装:
ヒープソート ヒープソートは、ヒープの概念を使用してソートする選択ソートであると言えます。方法は2つあります。
ヒープソートアニメーションのデモンストレーション ヒープソートの JavaScript コードの実装:
カウントソート カウンティングソートの中核は、入力データの値をキーに変換し、それを追加の配列スペースに格納することです。線形時間計算量を持つソート方法として、カウンティングソートでは、入力データが特定の範囲の整数である必要があります。 カウントソートアニメーションデモンストレーション カウントソートの JavaScript コードの実装:
バケットソート バケットソートは、カウントソートのアップグレード版です。これは関数のマッピング関係を利用しますが、その効率の鍵はこのマッピング関数の決定にあります。 バケットソートをより効率的にするには、次の 2 つのことを行う必要があります。
同時に、バケット内の要素のソートでは、比較ソート アルゴリズムの選択がパフォーマンスに大きく影響します。 最速はいつですか 入力データが各バケットに均等に分散できる場合 一番遅いのはいつですか? 入力データが同じバケットに割り当てられている場合 バケットソートの JavaScript コードの実装:
基数ソート 基数ソートには2つの方法がある
基数ソート vs カウンティングソート vs バケットソート これら 3 つのソート アルゴリズムはすべてバケットの概念を使用しますが、バケットの使用方法には明らかな違いがあります。
LSD 基数ソートのアニメーションデモンストレーション: 基数ソートの JavaScript コード実装:
最後に ソートアルゴリズムは本当に奥が深く、私がまだまとめていない、あるいは自分で解明していないアルゴリズムが数多くあります。これらの 10 個のソートアルゴリズムをまとめただけでも涙が出ました。 。 。 したがって、将来的にさらに多くの仕分け姿勢を習得したら、必ず戻ってきます |
<<: ディープラーニングの父ヒントン氏が、人工知能を一新するカプセルネットワークの最新動向を発表
低ランク適応 (LoRA) は、基本的な LLM が特定のタスクに効率的に適応できるようにする、一般...
顔認識パッケージこれは世界で最もシンプルな顔認識ライブラリです。 Python リファレンスまたはコ...
2020年末、我が国は第14次5カ年計画を発表し、2035年までの中国の長期目標を策定しました。 ...
翻訳者 |ブガッティレビュー | Chonglou何だと思う?クラウド コンピューティング カンファ...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
セキュリティ オペレーション センター (SOC) のアナリストは推論と意思決定に優れていますが、2...
人工知能 (AI) と機械学習 (ML) は、スタートアップを含む複数の業界に革命をもたらしました。...
幻覚だよ、古い友人よ。 LLM が私たちの視野に入って以来、錯覚の問題は常に無数の開発者を悩ませてき...
ソーシャルメディアFacebookの親会社Metaの主任人工知能研究者ヤン・ルカン氏は10月20日、...
ガベージ コレクション アルゴリズムは、さまざまな観点から分類できます。基本的なリサイクル戦略によれ...
プラスチック廃棄物が海洋生物にとって常に恐ろしい脅威となっていることは誰もが知っているはずです。しか...
[[407368]]今の世界は30年前とは大きく異なります。この変化の理由の一部は技術の発展です。今...
消費されるコンピューティング リソースは、従来の Stable Video Diffusion (S...