\ 上記で紹介したヒープ構造では、データを部分的にしかソートできません。つまり、一部の要素のソートしか知ることができません。たとえば、ルート ノードから開始して左の子または右の子に沿って移動すると、トラバースされた要素が増加 (小さなヒープ) または減少 (大きなヒープ) 関係にあることがわかりますが、左のサブツリーと右のサブツリーのノード間のソート関係を知ることはできません。 多くのアプリケーション シナリオでは、データの最大値や最小値をすばやく知るなどのヒープ特性だけでなく、要素のソート情報も知る必要があります。したがって、このセクションでは、両方の長所を実現する方法について説明します。要素が 2 つの部分から構成される一連のデータがあるとします。1 つの部分は製品名に対応し、その型は文字列です。もう 1 つの部分は製品の在庫数に対応し、その型は整数です。製品を名前で並べ替える必要があり、同時に、現在の在庫が最も少ない製品をすばやく照会する必要があります。このような特性を満たすために、対応するアルゴリズムとデータ構造をどのように設計すればよいでしょうか。 たとえば、次のようになります。 上図から、対応する要素の文字列がソートされたバイナリツリーであることがわかります。したがって、ルートノードの左側のサブツリーの要素に対応する文字列はルート文字列よりも小さく、右側のサブツリーに対応する文字列はルートノードの文字列よりも大きくなります。同時に、各要素は対応する製品の在庫数にも対応しています。在庫が最も少ない製品を追跡して、在庫切れになる前に迅速に補充できるようにする必要があります。しかし、上図からわかるように、文字列の順序性を保証するためには、商品の数量の小ヒープ特性を犠牲にしなければなりません。例えば、上図の水に対応する在庫とワインに対応する在庫は、小ヒープ特性に違反しています。ここで問題となるのは、文字列の順序性を確保しながら、数量が小ヒープ特性を満たすようにするにはどうすればよいかということです。 まず、データ構造を定義しましょう。
現在の問題は、上図のような矛盾が発生した場合に、文字列がソート特性を維持し、インベントリ値が小さなヒープ特性を満たすようにどのように調整するかということです。いくつかの状況に応じて異なるアクションを取る必要があります。以下に示すように、最初のものを見てみましょう。 上の図から、親ノードと左の子ノードが数値的にヒープの性質に違反している状況が 1 つあることがわかります。このとき、右回転操作を実行します。手順は次のとおりです。1. Beer ノードが反時計回りに回転して、親ノードを置き換えます。2. 親ノード Cabbage が時計回りに回転して、Beer の右の子ノードになります。3. Beer の元の右の子ノードが Cabbage の左の子ノードに変換されます。完了後の結果は、次の図のようになります。 このとき文字列はソートされた二分木の性質を維持しており、数値に対応する小さなヒープの性質も満たされていることがわかります。コードの実装を見てみましょう:
次に、上記の実装が正しいかどうかをテストするためにいくつかのデータを構築します。
上記のコードを実行した後の出力は次のようになります。
右回転の前後のバイナリ ツリーの出力を比較すると、回転したバイナリ ツリーによって印刷される情報は、上記の回転後の対応する画像と確かに一致しています。次に、左回転を実装します。まず、上図のキャベツノードに対応する値を 75 に変更して、そのノードと親ノードが小さいヒープ プロパティに違反するようにします。 必要な作業は次のとおりです。1. キャベツ ノードをビールの位置に「左」に回転します。2. ビールの親ノードをキャベツに設定します。3. ビールの右の子をキャベツの左の子に設定します。4. キャベツの左の子がビールになります。左回転後、バイナリ ツリーは次のようになります。 上の図から、左回転後も文字列はバイナリツリーソートを維持し、数値出力もスモールヒープ原則に準拠していることがわかります。対応するコード実装を見てみましょう。
上記のコード実装をテストするには、まず cabbage の値を変更してから、上記のコードを呼び出します。
コードを実行した後の出力は次のようになります。
出力結果の説明は、上図の左回転後の結果と一致しています。 Treap は要素のキーを基準にソートされたバイナリ ツリーであるため、文字列を指定すると、その文字列が Treap 内にあるかどうかを簡単に照会できます。その本質はソートされたバイナリ ツリーの検索であり、ここではその実装については無視します。 クエリはシンプルですが、挿入後に新しいノードとその親ノードが小さいヒープのプロパティに違反する可能性があるため、ノードの挿入は少し面倒です。したがって、挿入が完了した後も、上記で実装した左回転または右回転を使用して調整する必要があります。 |
>>: Microsoft TensorFlow-DirectML 正式版リリース: WSL での GPU による機械学習の高速化
太い眉毛と大きな目を持つ「強化学習の専門家」も、大規模言語モデルに取り組み始めているのでしょうか? ...
Microsoft は最近、Android システム上で独自の AI ポータル Copilot を正...
[[419123]] [51CTO.com クイック翻訳]人間は物理的な世界をよりよく理解するために...
[[354643]]開発の際、アルゴリズムの品質をどのように評価し、アルゴリズムの効率をどのように説...
人工知能と機械学習の台頭により、企業はこれまでにない方法でプロセスを自動化し、生産性を向上させる機会...
2022年秋、OpenAIがChatGPTをリリースした後、わずか数か月で数千万人のユーザーを獲得し...
2023年のコンピュータービジョンの分野では、「 Segment Anything Model」が大...
v\:* {behavior:url(#default#VML);} o\:* {behavior...
[[219257]]人工知能は本質的には人間のシミュレーションです。人間の思考をシミュレートする方法...
シスコが実施した調査によると、データプライバシーの面で生成AIに欠点があることを理解しているにもかか...
物体検出とその他のコンピュータビジョンの問題分類問題これはおそらくコンピュータービジョンにおける最大...
この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...
従来の産業および製造現場では、作業者の安全の監視、オペレーターの効率性の向上、品質検査の改善はすべて...