問1-2: 上記のヒープに関して,最大値を取り出し,残りに関してヒープ条件を満足



2017年7月18日. 第10章 {\displaystyle \mathrm {C} _{n}} 二分木(二進木、バイナリツリー、英: binary tree )は、データ構造の1つである。 根付き木構造の中で、あるノード(節点 node)が持つ子の数が高々2であるものをいう。 典型的には2つの子はそれぞれ「左」「右」と呼ばれる。 たとえば、二分探索や二分ヒープを実装するために使われる。 まとめ 4. 今回は「平衡木 (balanced tree) 」の一つである「AVL 木 (AVL tree) 」を取り上げます。二分木とヒープ で説明したように、二分木は左右の部分木のバランスが崩れると性能が劣化します。 二分木の場合、最下層にあるデータを探す場合が最悪で、木の高さ分だけ比較が行われます。 ヒープは最小値(または最大値)を求めるのに適した木構造の一種であり、「子要素は親要素より常に大きいか等しい(または常に小さいか等しい)」と言う制約を持つ。子要素が複数ある場合、子要素間の大小関係に制約はない。 »å­—の大きい方向) に向かってチェックしていきます。, まず、2 つの子の中で小さい方の子を選び、それと挿入したデータを比較します。もしも、ヒープの条件を満たしていなければ、親と子を交換し、その次の子供と比較します。これを、条件を満たすか、子供がなくなるまで繰り返します。, このアルゴリズムを Haskell でプログラムすると次のようになります。, 関数 downheap はヒープを満たすように n 番目の要素を葉の方向へ移動させます。n + 1 番目から最後までの要素はヒープを満たしているとします。引数 h は最後の要素の位置を表します。実際の処理は局所関数 iter で行います。, 最初に、n の子 c1 を求めます。これが h よりも大きければ処理を終了します。そして、もう一つの子 (c + 1) がある場合は、小さい子を選択します。この処理を局所関数 selectChild で行っています。もう一つの子を c2 とすると、c2 が h より大きければ c1 を返します。そうでなければ、compItem で c1 と c2 を比較して小さな子を選びます。, 次に、selectChild で選んだ子 c と親 n を比較し、親が大きい場合は swapItem で親と子を交換します。それから、iter を再帰呼び出しして次の親子関係をチェックします。親が子以下の場合はヒープの条件を満たしているので処理を終了します。, 最小値を取り出したあと新しいデータを挿入しない場合は、新しいデータの代わりに配列 buff の最後尾のデータを buff の 0 番目にセットしてヒープを再構築します。上図の例でいえば、100 を buff[0] にセットして、ヒープを再構築すればいいわけです。この場合、ヒープに格納されているデータの個数は一つ減ることになります。, ところで、n 個のデータをヒープに構築する場合、n - 1 回 upheap を呼び出さなければいけません。ところが、すべてのデータを配列に格納したあと、ヒープを構築するうまい方法があります。次の図を見てください。, 配列を前半と後半の 2 つに分けると、後半部分はこれより下にはデータが繋がっていない葉の部分になります。つまり、後半部分の要素は互いに関係がなく、前半部分の枝にあたる要素と関係しているだけでなのです。したがって、後半部分だけを見れば、それはヒープを満たしていると考えることができます。, あとは、前半部分の要素に対して、葉の方向に向かってヒープの関係を満たすよう修正していけば、配列全体がヒープを満たすことになります。この処理は関数 downheap を使うと次のように簡単にプログラムできます。, 後ろからヒープを再構築していくと考えるとわかりやすいでしょう。この方法の場合、要素 n の配列に対して、n / 2 個の要素の修正を行えばよいので、最初に説明したヒープの構築方法よりも速くなります。, それでは、ヒープを使って「優先度つき待ち行列 (priority queue) 」を作ってみましょう。一般に、キューは先入れ先出し (FIFO : first-in, first-out) のデータ構造です。キューからデータを取り出すときは、先に挿入されたデータから取り出されます。これに対し、優先度つき待ち行列は、データに優先度をつけておいて、優先度の高いデータから取り出していきます。, 優先度つき待ち行列は、優先度を基準にヒープを構築することで実現できます。最初に作成する関数を示します。, データ型は Heap a とし、データ構築子を Heap としました。第 1 引数が配列 (ヒープ) の大きさ (Int)、第 2 引数が要素の個数 (IORef Int)、第 3 引数が配列を表します。関数 makeHeap n は大きさが n の空のヒープを生成します。配列と IORef を生成して Heap に格納して返すだけです。, 関数 fromList はリストからヒープを生成します。リスト xs の要素数を length で求めて変数 n にセットし、n / 2 - 1 の値を変数 m にセットします。配列本体は newListArray で生成し、mapM_ で m 番目から 0 番目の要素に downheap を適用してヒープを構築します。, 次はデータを追加する関数 insert を作ります。, 最初にヒープに格納されているデータ数を求めて変数 c にセットします。c がヒープの大きさ size 以上の場合、ヒープは満杯なのでエラーを送出します。そうでなければ、配列の c 番目に x を挿入し、upheap でヒープを再構築します。データの個数 cnt を +1 することをお忘れなく。, 次は最小値を取り出す関数 deleteMin を作ります。, 最初にデータの個数を求めて変数 c にセットします。c が 0 以下の場合、ヒープは空なのでエラーを送出します。そうでなければ、配列 buff の 0 番目の要素を取り出して変数 x にセットします。次に、データの個数を -1 します。データが残ってる場合じはヒープを再構築します。最後尾の要素と 0 番目の要素を swapItem で交換し、downheap でヒープを再構築します。最後に x を return で IO に格納して返します。, あとのプログラムは簡単なので説明は割愛いたします。詳細は プログラムリスト1 をお読みください。, それでは実際に実行してみましょう。.

ダークソウル3 Dlc2 行き方 35, 現在 データベースのバックアップが存在 しない ので Backup Log �%9 7, アルビオン 乳液 グリセリンフリー 42, ラーメン王 閉店 理由 18, Youtube サポート終了 2020 15, キャラ 絵 お題 8, コンバイン 採点 在宅 32, アルパカ ストーブ 2020 4, ジョーマローン アトマイザー 移し方 33, フランケンシュタインの恋 1話 Dailymotion 4, コンパス 公式レイヤー 中国 23, コンフィデンスマンjp ロマンス編 Fod 4, Sakura 藤原 さくら 歌詞 4, 三菱ufj 電話 繋がらない 4, 鬼滅の刃 胡蝶カナエ 年齢 6, 乃木坂ってどこ 動画 #177 9, オーバードライブ 漫画 ネタバレ 5, 特定整備 認証 申請 12, ポケモン Bw 交換 いつから 8, 医学部 再受験 闇 8, パラダイスロスト 受け方 風 14, 有吉 フォートナイト スイッチ 17, Dhl 個人利用 コロナ 12, Ldh オーディション2020 応募 5, テアトルアカデミー 二次審査 コロナ 5, Rg Zガンダム 破損 40, 全米 人気 ラッパー 20, 溝端淳平 父 死亡 10, Wwe アスカ ブログ 7, なりきり 行為 やり方 53, Pint 電気 朝得プラン 5, ヒルナンデス 衣装 今日 滝沢カレン 5, ハムスター ふん 掃除 7, Moe 序盤 金策 47, 鈴木福 母親 写真 21, Dqmj3p 魔剣士ピサロ 育成 5, 税理士報酬 源泉 逆算 5, プレミアムウォーター Amadana うるさい 5, ツイステ エース 夢小説 6, あいつの好きそな ブルース コード 5, 奏 向 意味 6, Nhk 松尾 女子アナ 42, アレクサ 音楽 止まる 24, 迅悠一 熱 Pixiv 24, 工藤浩平 弟 事故 9, 磯村 勇 斗 あだ名 14, Radiko For Au データの取得に失敗しました 15, くま モン 放送 事故 海外の反応 30, ブラビア Dアニメ 見れない 31, Shamrock ギター Tab 7, スマホケース カード入れ 後付け 6, Succession ドラマ 配信 5, Foryou 歌詞 意味 9, ビルクリーニング技能士 1級 合格率 6, ひみつ道具 博物館 ネタバレ 4, Let's Play Again 意味 5, 賭ケグルイ ネタバレ 78 11, ニトリ 遮熱 カーテン 口コミ 8, ポケモン インターネット大会 参加賞 受け取り 24, 懸念 を 呈する 4, ギター ジャカジャカ 名前 35, Pso2 スッキリ 量産型 14, Anan 重版 いつ 28, ヒロシ Youtube キャンプ 13, ワンダーフォーゲル部 高校 費用 4, 非常 に 感心する ことわざ 5, いちばん 終わり 熟語 5, プロ野球 サード 最強 現役 25, 週刊誌 発行部数ランキング 2019 34, ビルダーズ2 クリア後 ハート 38, プロスピa Ob 2020 10, 戸田恵子 杏 ブログ 6,