序文
私はしばらく働いており、同僚と冗談を言うこともあります。「すぐに注文を書いてもらえると、書けないのではないかと思います。」
しばらくアルゴリズムに触れないと、忘れがちです。信じられない?自分でヒープソートを作成できるかどうかについて考えます。
学校の採用を経験したことがある人なら誰でも、アルゴリズムとデータ構造が不可避であることを知っています。
筆記テストで最も重要なのはテスト問題です。PinduoduoやToutiaoのような大企業の場合、アルゴリズムに関するいくつかの質問が出てきます。ACがない場合、面接の機会はありません。
アルゴリズムの質問は、インタビュー(オンサイトインタビューまたはビデオインタビュー)中にも行われますが、筆記試験ほど難しいことはありません。インタビューの半分が行われているシーンを想像できます。インタビュアーは、バイナリツリーを逆にして今自分自身に尋ねるように頼みますが、それでも行いますか?
大学にいる場合は、並べ替えやさまざまな基本的なデータ構造から始めることができます。8つの基本的なソートとリンクリスト/バイナリツリー/スタック/キューを美しいPDFにするのに1週間かかりました。
このPDFの読み取りエクスペリエンスは、主要なブログプラットフォームのパブリックアカウントや記事よりも明らかに優れています。PDFの内容は純粋に手作業のものであり、理解できない場合は私に尋ねることができます。
以下は、8つの基本的な並べ替えと基本的なデータ構造の簡単な紹介であり、それぞれの並べ替えの考え方、基本的な説明、およびソースコードは PDFにあります。
バブルソート
アイデア:2つが交換され、大きなものが後ろに配置され、最大値は最初のソート後の配列の最後にすでにあります。2つが交換されるため、n-1のソートが必要です(10の数値、9のソートなど)。
コード実装ポイント:2つのforループ、外側のループは並べ替えパスの数を制御し、内側のループは比較の数を制御します。各トリップの後、比較の数を1ずつ減らす必要があります。
並べ替えを選択
アイデア:配列内の最大の要素を見つけて、配列の最後の要素と交換します。数値が1つしかない場合は選択する必要がないため、n-1ソートが必要です。
コード実装ポイント:2つのforループ、外側のループはソートされたパスの数を制御し、内側のループは現在のパスの最大数を見つけて、現在のパス配列の最後の要素と交換します
ソートを挿入
アイデア:既存の順序付けされた配列に要素を挿入します。最初に順序付けられたデータがあるかどうかは不明であるため、要素の最初の要素は順序付けられていると見なされます。順序付けられた配列と比較すると、大きい場合は直接配置され、小さい場合は配列要素の位置が移動して、挿入するのに適した位置が検出されます。数値が1つしかない場合は挿入する必要がないため、n-1ソートが必要です。
コードの実装:forループはwhileループの実装に埋め込まれ、外側のforループはソートされたトリップの数を制御し、whileループは適切な挿入位置を見つけます(挿入位置は0未満にはできません)
クイックソート
クイックソートを学習するための前提条件:再帰を理解する必要がある
アイデア:配列内の要素(ノード)を見つけ、ノードの左側に小さく配置し、ノードの右側に大きく配置します。左のノードよりも小さく、右のノードよりも大きい下へのトリップ。この操作を続けてください...
コードの実装:ピボットは中央で取得され、LとRは配列の最小位置と最大位置を示すために使用されます。比較は、ピボットよりも小さい(大きい)数値が見つかるまで続行され、次に交換されて、連続的に範囲が縮小されます。ピボットの前の要素(j)への再帰L。再帰ピボットの後の1つの要素(i)からR要素
マージソート
マージソートの学習の前提:再帰を理解する必要がある
アイデア:2つの並べ替えられた配列を組み合わせて、順序付けられた配列にします。要素を順序付けられた配列として分離し、それらを比較してマージします。要素が1つだけになるまで分割とマージを続けます
コードの実装:最初の並べ替えプロセスでは、マージするのは基本的に2つの要素(2つの既存の順序付けされた配列と見なされます)です。このような操作を続けて実行すると、最後に配列が順序付けられ、左、右、分割...
ヒープソート
ヒープのソートの学習の前提:二分木を理解する必要がある
アイデア:ヒープの並べ替えは完全なバイナリツリーの機能を使用します。ルートノードは左右の子よりも大きくなります。ヒープ構築操作を完了すると、基本的にルートノードと左右の子のサイズが比較されます。大きなものはルートに切り替えられます。ノード上で、最大のノードがツリーの一番上になるまで。次に、配列の最後の要素と交換します
コードの実装:左側または右側のサブツリーが現在のルートノードよりも大きい限り、それを置き換えます。置換後、次のサブツリーが変更されるため、各ノードが親>子の条件を実現するまで比較することも必要です
ヒルソート
アイデア:ヒルソートは、本質的に挿入ソートの拡張バージョンです。ヒルソートは、配列をn個のグループに分割して挿入ソートし、配列が巨視的に順序付けられるまで挿入ソートを実行するときに何度も移動する必要がなくなります。 〜
コード思考:通常、丘の増分はギャップ=ギャップ/ 2ですが、通常のバージョンの挿入ソートよりもそのようなforループが多くあります。
カーディナリティの並べ替え(バケットの並べ替え)
アイデア:カーディナリティの並べ替え(バケットの並べ替え):数値を1、10、100、1000にカットし、それらを別のバケットに入れて、最大の桁の数が完了するまで、バケットの順序で1回戻します〜次に配列は注文されています
コードの実装:最初に配列の最大値を見つけてから、ループの条件として最大値/ 10を使用します(> 0である限り、まだ数字があります)。1桁、10桁、...をバケットに分配し、割り当てられるたびにリサイクルする
再帰的
再帰はアルゴリズムで非常によく使用されます。ソートアルゴリズムのクイックソートおよびマージソートは再帰を使用する必要があります(少なくとも再帰を実装するのが最も便利です)。
再帰を使用する場合は、再帰出口(再帰を終了するための条件)と再帰式(法則)の 2つの条件を知っている必要があります。
ヒント:再帰では、問題はしばしば2つの部分(1と全体のアイデア)に分割されます。これにより、再帰的な式(法則)をすばやく見つけることができます。
Hanrotaは以下を実現します。
基本的なデータ構造
リンクリスト、キュー、バイナリツリー、およびスタックはすべて、非常に基本的なデータ構造です。たとえば、各データ構造に対応するアルゴリズムの質問があります。
- LeetCode No206:リバースリンクリスト
- LeetCode No20:文字列[] {]} {] {}を確認します(そのような文字列が有効(整列されている)かどうか)
- LeetCode No104:木の最大深度
- LeetCode No102:シーケンストラバーサルツリー
- …
学校の新入社員は、ディクショナリツリー、赤黒木、グラフなどのデータ構造を要求しませんが、リンクリスト、キュー、バイナリツリー、およびスタックデータ構造(LeetCodeは単純です)の問題は引き続き作成できるはずです。
最後
最後に説明したいのは、並べ替えアルゴリズム/データ構造のコードが最適な解決策ではない可能性があることです。コードの実装は、理解しやすい方法で記述されています。ほとんどすべての文には対応するコメントがありますが、それは理解できるはずです。
しばらく動作していますが、なぜ最も基本的なアルゴリズムとデータ構造を記述したいのですか?その理由は次のとおりです。
- 私はタイポグラフィを探求している人ですが、早い段階でクラスメートをフォローすると、GitHubと記事のナビゲーションのread.meが頻繁に変更されることがあります。現在のGitHubナビゲーションは私が好きなものではありません(長すぎます)。以前の記事では、正直なところ、タイプセットでは不十分なので、もう一度waveを開始することにしました。
- 私の記事はいくつかのプラットフォームで配布されますが、記事が終了すると誰もそれを読むことができなくなり、プラットフォームの盗難防止チェーンのためにマップベッドがハングする可能性があります。多くの読者が私に尋ねたので:「あなたの記事をPDFに変換できますか?」
- 私は多くのシリーズの記事を書きましたが、これらの記事はほとんど変更されないため、「永続的」に非常に適しています。
上記の理由により、一連の記事をPDF / HTML / WORD文書に要約することにしました。正直なところ、そのようなドキュメントを作成するのに長い時間がかかりました。
資料入手方法:転送+注意、舞台裏専用レターエディター【資料】を無料で入手できます!
資料入手方法:転送+注意、舞台裏専用レターエディター【資料】を無料で入手できます!