\ 上記で紹介したヒープ構造では、データを部分的にしかソートできません。つまり、一部の要素のソートしか知ることができません。たとえば、ルート ノードから開始して左の子または右の子に沿って移動すると、トラバースされた要素が増加 (小さなヒープ) または減少 (大きなヒープ) 関係にあることがわかりますが、左のサブツリーと右のサブツリーのノード間のソート関係を知ることはできません。 多くのアプリケーション シナリオでは、データの最大値や最小値をすばやく知るなどのヒープ特性だけでなく、要素のソート情報も知る必要があります。したがって、このセクションでは、両方の長所を実現する方法について説明します。要素が 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 による機械学習の高速化
[原文は51CTO.comより] 教育業界と人工知能が出会うと、どんな火花が散るでしょうか?国内外の...
スマートホームデバイスへの自然言語生成 (NLG) の統合により、テクノロジーとのやり取りの方法に革...
エッジ AI は、今日のデジタル変革の時代に台頭している 2 つのテクノロジー、エッジ コンピューテ...
[51CTO.comよりオリジナル記事] 6月21日、51CTO主催のWOT2019グローバル人工知...
2019年5月18日、YC Chinaが開催したYC China起業家会議において、YC China...
3月21日、北京でiCityスマートシティカンファレンスが開催され、JD CityがJDグループの第...
編集者 | ヤン・ジェン現地時間1月25日、OpenAIは新モデルをリリースし、GPT-3.5 Tu...
ビッグデータダイジェスト制作最近、カーネギーメロン大学、カリフォルニア大学バークレー校、Meta、N...
中国はなぜ米国と同じくらい多くの人工知能研究者を育成しているにもかかわらず、機械学習などの主要分野で...
まず、人工知能の現在の開発状況を理解しましょう。人工知能技術は現在、急速な発展期にあります。雨後の筍...
フォーブスは10月2日、寄稿者ティム・バジャリン氏による記事を掲載し、中国ロボットの利点と、中国と米...
[[435319]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitA...
参考: 20 世紀のベスト: 編集者が選ぶトップ 10 アルゴリズム。著者:バリー・A・シプラ。アド...