\ 上記で紹介したヒープ構造では、データを部分的にしかソートできません。つまり、一部の要素のソートしか知ることができません。たとえば、ルート ノードから開始して左の子または右の子に沿って移動すると、トラバースされた要素が増加 (小さなヒープ) または減少 (大きなヒープ) 関係にあることがわかりますが、左のサブツリーと右のサブツリーのノード間のソート関係を知ることはできません。 多くのアプリケーション シナリオでは、データの最大値や最小値をすばやく知るなどのヒープ特性だけでなく、要素のソート情報も知る必要があります。したがって、このセクションでは、両方の長所を実現する方法について説明します。要素が 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 による機械学習の高速化
これまで、私たちは人工知能が医療業界にどのように貢献するかについて議論してきました。新型コロナウイル...
最近、NPJ—Computational Materials誌に研究論文が掲載されました。この論文は...
「ここ数年、情報技術分野で私たちが学んだ最大の教訓の一つは、主要な中核技術は私たち自身の独立したイノ...
Google を含む多くの企業が、人間の寿命を延ばす方法を研究しています。たとえ何百年も長く生きられ...
ディープラーニングの大規模な応用の後、人々はさらなる技術的進歩をもたらすことができる真の汎用人工知能...
近年、「オープンソース」は開発者コミュニティにおける新たなトレンドとなっています。特にディープラーニ...
Microsoft と IDC は共同で、企業における AI の応用と商業的価値を詳細に調査した調査...
[[339138]]新しい医療用人工知能システムは、医師と同じように患者を診察することができます。画...
最近、第51回国際コンシューマー・エレクトロニクス・ショーが米国ラスベガスで開催され、世界中の人工知...
空を飛ぶ龍、数千マイル離れたところから救援に駆けつける!最近、「翼龍」無人機が飛び立ち、被災地に急行...
AI業界はクリエイティブなソフトウェア開発者を満足させることは決してできないでしょう。このテクノロジ...