除算と征服と減算の違い。
分割統治法は、大きな問題をいくつかのサブ問題に分割し、各サブ問題を個別に解決してから、サブ問題のソリューションをマージして、元の問題のソリューションを取得します。
削減とガバナンスの方法では、大きな問題をいくつかのサブ問題に分割しますが、これらのサブ問題を個別に解決する必要はありません。解決する必要があるのはサブ問題の1つだけなので、サブ問題のソリューションをマージする必要はありません。
したがって、厳密に言えば、削減とガバナンスの方法は、低下した分割統治の方法である必要があり、時間の複雑さは一般にO(log2 n)です。
元の問題をいくつかのサブ問題に分解した後、縮約とガバナンスの方法では、スケールnの元の問題の解とより小さなスケール(通常はn / 2)の解の間の関係を使用します。この関係は通常、ために:
(1)元の問題の解決策は、小さな副問題の1つにのみ存在します。
(2)元の問題の解と小規模な解の1つとの間には一定の対応があります
問題の削減方法を見つける
半分で見つける
バイナリ検索は、レコードがキーコードに従って順序付けられるという特性を利用します。基本的な考え方は、順序付けされたリストでは、中央のレコードが比較オブジェクトとして使用されます。指定された値が中央のレコードのキーコードと等しい場合、検索は成功します。値が中央のレコードのキーコードよりも小さい場合は、中央のレコードの左半分で検索を続け、指定した値が中央のレコードのキーコードよりも大きい場合は、中央のレコードの右半分で検索を続けます。検索が成功するか、検索された領域にレコードがなく、検索が失敗するまで、上記のプロセスを繰り返します。
-
668.少数のKの九九 -難しいコード
二分探索木
バイナリサーチツリーは、バイナリソートツリーとも呼ばれ、次のプロパティを持つバイナリツリーです。
(1)左側のサブツリーが空でない場合、左側のサブツリーのすべてのノードの値はルートノードの値よりも小さい
(2)その右側のサブツリーが空でない場合、右側のサブツリー上のすべてのノードの値はルートノードの値よりも大きい
(3)その左と右のサブツリーもバイナリソートツリーです
バイナリソートツリーのルートで特定の値kを見つけるプロセスは次のとおりです。
(1)ルートが空のツリーの場合、検索は失敗します
(2)k =ルートノードの値の場合、検索は成功します。
(3)それ以外の場合、k <ルートノードの値の場合、ルートの左側のサブツリーを検索します。
(4)それ以外の場合は、ルートの正しいサブツリーを検索します
これについて話すのは無意味ですが、より面倒な二分探索木は、この木を構築する方法です。そして実際には、バイナリ検索は配列を使用してバイナリ検索ツリー構造を表すことです。私は問題を探すことなくこれを行いました、私はシーンを期待していませんでした。
ソート問題の削減とルール
ヒープソート
定義:ヒープは次のプロパティを持つ完全なバイナリツリーです:各ノードの値はその左と右の子ノードの値以下(小さいルートヒープ)、または各ノードの値はその左と右の子ノードの値以上値(ビッグルートパイル)。ノードのあるパイルに1から順に番号が付けられている場合、ノードは次の関係を満たします。
(1)ki <= k(2i)かつki <= k(2i + 1)
(2)ki> = k(2i)ki> = k(2i + 1)
1 <= i <= n / 2
この定義は、配列を使用してヒープを格納する場合のデータの特性を実際に説明しています。
ヒープの並べ替えは、ヒープの特性を使用して並べ替える方法です。基本的な考え方は、まず、並べ替えられるレコードのシーケンスがヒープに構築されます。このとき、ヒープ内のすべてのレコードの中で最大のレコード、つまり最上位のレコードが選択され、次にパイルから削除し、残りのレコードをパイルに調整して、次に大きいレコードが見つかるように、パイルにレコードが1つだけになるまで続けます。
ヒープ調整の問題は、主にスクリーニング調整方法と挿入方法調整を含む鍵です。
ヒープを調整するためのフィルタリング方法で解決すべき重要な問題は、次のとおりです。完全なバイナリツリーでは、ルートノードの左右のサブツリーはヒープです。ルートノードを調整して完全なバイナリツリー全体がヒープになるようにするにはどうすればよいですか。
方法は次のとおりです。ルートノードが左右のサブツリーのルートノードと比較され、すべてのサブツリーがヒープになるか、調整されたノードがリーフノードに到達するまで、ルートノードと最大値が交換されます。
ヒープを調整するための挿入メソッドによって解決される問題は、次のとおりです。ノードをヒープに挿入し、挿入されたノードを調整して、完全なバイナリツリー全体がヒープになるようにする方法を教えてください。
方法は次のとおりです。最後にノードを挿入し、ノードを親ノードと比較し、ヒープ条件が満たされない場合は、ノードをルートノードと交換し、ノードが親ノードより小さくなるか、ルートノードに達するまでこのプロセスを繰り返します。
ヒープの並べ替えは、次の2つの操作を完了する必要があります。
1)配列をヒープに調整します。
- 方法1:最後の非リーフノードから開始して、調整のためにこのノードとその子ノードの値を比較します。調整が完了したら、最後から2番目の非リーフノードを比較し、ルートノードまでこのプロセスを続けます。最初のリーフノードはシーケンスの長さ/ 2である必要があるため、最初の非リーフノードのインデックスはarr.length / 2 -1です。参照
- 方法2:挿入方法を使用して、配列の順序で1つずつ挿入します
2)ソート:ルートノードと最後のリーフノードを入れ替え、フィルタリングメソッドを使用して残りの要素を山に再構築します。
質問を選択してください
順序付けられていないシーケンスT =(r1、r2、……、rn)を想定すると、Tのk番目(1 <= k <= n)の小さな要素は、Tが昇順に配置された後のk番目の位置の要素として定義されます。シーケンスTと整数kが与えられた場合、Tのk番目に小さい要素を見つける問題は、選択問題と呼ばれます。特に、n / 2番目に小さい要素を見つける問題は、中央値問題と呼ばれます。
このタイプの質問は、クイックソートの分割プロセスから学ぶことができます。分割するたびに軸値が決定され、軸値の位置がkより大きいか小さいかが判断され、範囲が狭くなります。このスキームを使用する時間の複雑さはO(n)です。
このタイプの質問と上記の最小K数の違いは、値を選択し、特定の範囲を返す必要があることです。
組み合わせ問題における削減とガバナンス
ノックアウト選手権の質問
経済制圧競争にn = 2 ^ k人のプレーヤーがいて、最終的な勝者は関数bool Comp(string mem1、string mem2)によって決定されるとします。
2人のプレイヤー間のマッチをシミュレートします。mem1が勝った場合、関数CompはTRUEを返します。それ以外の場合、関数CompはFALSEを返します。関数Compの実行は一定時間内に完了すると想定されます。エリミネーションゲームプロセスのシミュレーション方法は?必要な時間の複雑さはO(n)です。
このアイデアは比較的単純です。すべてのユーザーを2つの等しい部分に分割します。2つのセグメントの開始インデックスは0とn / 2です。0とn / 2を比較すると、勝者が最初に配置されます。n / 2-1までトラバースし、最初のn / 2はすべてビクターです。再び半分に分けて、このサイクルを行い、最後に0番目の人が最終的な勝者になります。
この種の質問は、2つのデータのうち1つだけが生き残ることができるという特性を持っているため、この種の質問に対応する練習問題を見つけることは困難です。また、この質問を書くことはそれほど難しいことではないので、私はしませんが、適切な質問があれば、私に提供することができます。
偽造通貨問題
外観が同じn枚のコインのうち1枚は偽造で、偽造コインは軽いことが知られています。2組の硬貨の重量が同じであるか、どちらが軽いかを知るために、2組の硬貨を秤なしの天秤で自由に比較できますが、どれだけ軽いかわかりません。偽造通貨の問題では、面白いアルゴリズムの設計が必要です。この偽造コインが検出されました。
どの偽造通貨が光を教えているのか知っているので、計算のアイデアは比較的簡単です
スキーム1:2つの山に分割し、比較します。最も軽いコインが見つかるまで、より軽い山が2つの山に分割されます。時間の複雑さはO(log2 n)です。
オプション2:3つの山に分ける2つの山の重さが同じ場合、3つ目の山には偽造コインがあり、2つの山を比較すると、偽のコインの山があります。最も軽いコインが見つかるまでこのプロセスを繰り返します。時間の複雑さはO(log3 n)です。
さて、問題を複雑にしましょう。8枚のコイン(abcdefgh)がある場合、偽造通貨は軽いですか重いですか?それに対処する方法は?
この問題を解決するには、決定木を使用し、特定の詳細を誰もが考えられるようにしておく必要があります。
偽造通貨の問題については、対応する質問はありません。結局のところ、価値があるが許可されていない質問を見つけることはより難しく、誰もが受け入れることはより困難ですが、実際には、これは依然として非常に役立ちます。
総括する
削減とガバナンスの方法は、分割とルールの方法に似ていますが、削減とガバナンスの方法のスケールが毎回半分になる点が異なります。この記事では、
問題を見つける:半分に見つける
ソートの問題:ヒープのソート、選択の問題
バイナリ検索は見つけやすいかもしれませんが、実際は理解しやすいです。実際にコーディングする場合、境界条件が多く含まれます。バイナリ検索で多くの人にインタビューしたところ、完璧に書ける人はほとんどいません。
ヒープの並べ替えは習得する必要があります。ヒープには関連する演習が多すぎるため、自分で行う必要があります。
やっと
私の記事が気に入ったら、私のパブリックアカウント(プログラマーMala Tang)をフォローできます。
以前の記事のレビュー:
アルゴリズム
技術
- マイクロサービスについて話す
- TCPパフォーマンスの最適化
- 電流制限の実現1
- Redisは分散ロックを実装しています
- Golangソースコードのバグ追跡
- トランザクションの原子性、一貫性、耐久性の実現原理
- CDNリクエストプロセスの詳細な説明
- ブログサービスが崩壊した歴史
- 一般的なキャッシングテクニック
- サードパーティ決済と効率的に接続する方法
- ジンフレームワークの簡潔なバージョン
- InnoDBロックとトランザクションの簡単な分析
ノートを読む
考え