確率で、左右どちらかの子において同様のプロセスを繰り返す。これにより、新しい頂点は根から本来挿入されるべき点のどの場所にも入る確率があります。全体で見るとどの頂点も根に選ばれる確率が等しいことがわかります。具体的な実装は以下の通りです。いうインスタンス変数を導入してます。これは各頂点での部分木のサイズを表しています。行う度に更新が必要です。1end早速、データを入れて実験してみましょう。1end100頂点を昇順に挿入した時の高さを調べてみます。高さ7にしたいけど・・・)していることが確認できます。ちなみに、ここで使っているランダム性の選択は非常に重要です。ランダムだからといって適当でよいわけではありません。変えてみるとどうでしょうか。以下はフル実装のgistへのリンクです。Treapはより実装がシンプルです。各頂点に値とは別の優先度を割り当て、根への挿入時に(親の優先度)<(自分の優先度)を満たす限り回転操作を繰り返します。優先度が高い頂点ほど上に来るイメージです。これでも、部分木を含め根がランダムに選ばれることが保証されます。追加と探索だけなら、部分木のサイズを保つ必要がなくなるので、若干実装が楽になります。詳しい実装の説明は省略しますが、以下にコメントを付けた実装例を示します。興味のある人は考えてみましょう。おしまいみなさまも、普段お使いの言語でデータ構造の実装にチャレンジしてみてはいかがでしょうか。普段の開発とは一味違ったプログラミングが楽しめるはず!※今回は「k番目の値を探す」「木を分割/併合する」といった操作は時間の都合上端折りました。第2回早稲田大学プログラミングコンテストを開催します。月別アーカイブはてなブログをはじめよう!hama_DUさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。