区間 くかん 木 き またはインターバル木 き (英 えい : Interval tree )は、区間 くかん を保持 ほじ するための木 き 構造 こうぞう のデータ構造 こうぞう の一種 いっしゅ 。計算 けいさん 幾何 きか 学 がく のアルゴリズム 。特 とく に、指定 してい された区間 くかん や点 てん にオーバーラップする全 すべ ての区間 くかん を探 さが すという問題 もんだい を効率 こうりつ 的 てき に解 と くことができる。例 たと えば、表示 ひょうじ されている地図 ちず 内 ない に見 み えている全 すべ ての道路 どうろ を求 もと めるとか、3次元 じげん のシーンで見 み えている全 すべ てのオブジェクトを求 もと めるといった用途 ようと に使 つか われる。似 に たものに区分 くぶん 木 き (英 えい : Segment tree , segtree )があるが別物 べつもの である。
単純 たんじゅん なケースとして、区間 くかん が互 たが いにオーバーラップしないなら、単純 たんじゅん な2分木 ぶんぎ で表 あらわ すことができ、クエリにかかる時間 じかん は O(log n ) となる。しかし、区間 くかん 同士 どうし がオーバーラップするなら、始点 してん でソートする場合 ばあい と終点 しゅうてん でソートする場合 ばあい で順序 じゅんじょ が異 こと なることになるので、挿入 そうにゅう 時 じ に2つの区間 くかん をどう比較 ひかく すべきかが問題 もんだい となる。素朴 そぼく な方法 ほうほう としては、同時 どうじ に2つの木 き を作 つく り、一方 いっぽう は始点 してん でソートし、もう一方 いっぽう は終点 しゅうてん でソートすればよい。これを使 つか ってクエリを行 おこな うと、それぞれの木 き で O(log n ) の時間 じかん でオーバーラップする可能 かのう 性 せい のある区間 くかん をリストアップできるが、その結果 けっか をマージする必要 ひつよう があって、それには O(n ) の時間 じかん がかかる。つまりクエリに対 たい して O(n + log n ) = O(n ) の時間 じかん がかかることになり、力 ちから まかせ探索 たんさく と比較 ひかく すると全 まった く改善 かいぜん されていない。
区間 くかん 木 き はこの問題 もんだい を解決 かいけつ するものである。以下 いか では 'centered interval tree' と 'augmented tree' という2種類 しゅるい の設計 せっけい を解説 かいせつ する。
クエリにかかる時間 じかん は O(log n + m ) となる(n は格納 かくのう されている区間 くかん の総数 そうすう 、m は報告 ほうこく される結果 けっか の総数 そうすう )。構築 こうちく には O(n log n ) の時間 じかん がかかり、メモリ使用 しよう 量 りょう は O(n ) となる。
数 かず 直線 ちょくせん 上 じょう に n 個 こ の区間 くかん があるとき、これらを表 あらわ すデータ構造 こうぞう を構築 こうちく し、別 べつ の点 てん や区間 くかん とオーバーラップする全 すべ ての区間 くかん を効率 こうりつ 的 てき に検索 けんさく したいとする。
まず、全 すべ ての区間 くかん が含 ふく まれる範囲 はんい を特定 とくてい し、その中央 ちゅうおう の x_center で分割 ぶんかつ する(x_center で分割 ぶんかつ するのは、木 き 構造 こうぞう をなるべく平衡 へいこう にするため)。これによって、区間 くかん は3種類 しゅるい に分類 ぶんるい される。x_center の左側 ひだりがわ にある区間 くかん 群 ぐん を S_left 、x_center の右側 みぎがわ にある区間 くかん 群 ぐん を S_right 、x_center にオーバーラップする区間 くかん 群 ぐん を S_center とする。
S_left と S_right に属 ぞく する区間 くかん 群 ぐん は同様 どうよう の方式 ほうしき で再帰 さいき 的 てき に分割 ぶんかつ していき、左右 さゆう に区間 くかん が全 まった く残 のこ らない状態 じょうたい にする。
S_center に属 ぞく する区間 くかん 群 ぐん (中央 ちゅうおう 点 てん にオーバーラップしている区間 くかん 群 ぐん )は、区間 くかん 木内 きなし のノードにリンクされた別 べつ のデータ構造 こうぞう に格納 かくのう される。このデータ構造 こうぞう は2つのリストから構成 こうせい されていて、1つは区間 くかん 群 ぐん を始点 してん でソートしたリスト、もう1つは区間 くかん 群 ぐん を終点 しゅうてん でソートしたリストである。
結果 けっか として構築 こうちく される2分木 ぶんぎ のノードには、以下 いか のようなデータが格納 かくのう される。
中央 ちゅうおう 点 てん の位置 いち
区間 くかん 全体 ぜんたい が中央 ちゅうおう 点 てん の左側 ひだりがわ にある区間 くかん 群 ぐん に対応 たいおう したノードへのポインタ
区間 くかん 全体 ぜんたい が中央 ちゅうおう 点 てん の右側 みぎがわ にある区間 くかん 群 ぐん に対応 たいおう したノードへのポインタ
中心 ちゅうしん 点 てん とオーバーラップする全 ぜん 区間 くかん を始点 してん でソートしたリスト
中心 ちゅうしん 点 てん とオーバーラップする全 ぜん 区間 くかん を終点 しゅうてん でソートしたリスト
以上 いじょう のように構築 こうちく されたデータ構造 こうぞう があるとき、区間 くかん または点 てん についてのクエリを与 あた えられると、その入力 にゅうりょく とオーバーラップする全 すべ ての区間 くかん の集合 しゅうごう を返 かえ す。
区間 くかん R が入力 にゅうりょく として与 あた えられたとき、それを点 てん を入力 にゅうりょく として与 あた えられた場合 ばあい に還元 かんげん することができる。まず、始点 してん か終点 しゅうてん が R の区間 くかん 内 ない にある区間 くかん を全 すべ て探 さが す。1次元 じげん の場合 ばあい 、各 かく 区間 くかん の始点 してん と終点 しゅうてん で構成 こうせい された単純 たんじゅん な木 き 構造 こうぞう を使 つか えばよい。このとき、各 かく 点 てん には対応 たいおう する区間 くかん へのポインタを付与 ふよ しておく。
この O(log n ) の探索 たんさく によって、考慮 こうりょ すべき最小 さいしょう と最大 さいだい の点 てん が明 あき らかとなる。この範囲 はんい 内 ない の各 かく 点 てん には区間 くかん が対応 たいおう していて、それがクエリの区間 くかん とオーバーラップしているので、解 かい に加 くわ える。ただし、始点 してん も終点 しゅうてん も R に含 ふく まれる区間 くかん も考 かんが えられるので、二 に 重 じゅう に登録 とうろく しないよう注意 ちゅうい が必要 ひつよう である。これを防 ふせ ぐには、各 かく 区間 くかん を表 あらわ すデータ構造 こうぞう にフラグを用意 ようい しておいて、解 かい に加 くわ えられたときにそのフラグを立 た てればよい。
以上 いじょう でまだ考慮 こうりょ されていない区間 くかん は、R が完全 かんぜん に含 ふく まれてしまうような区間 くかん である(始点 してん も終点 しゅうてん も R の中 なか にはない)。このような区間 くかん を探 さが すには、R 内 うち の任意 にんい の点 てん について下記 かき に示 しめ す点 てん クエリのアルゴリズムを実施 じっし すればよい(ここでも、二 に 重 じゅう に登録 とうろく しないよう注意 ちゅうい が必要 ひつよう である)。
次 つぎ に点 てん x が入力 にゅうりょく として与 あた えられた場合 ばあい を考 かんが える。通常 つうじょう の2分木 ぶんぎ を走査 そうさ するのと同様 どうよう の再帰 さいき 的 てき アルゴリズムで木 き 構造 こうぞう を走査 そうさ する。各 かく ノードについて x とそのノードの中央 ちゅうおう 点 てん である x_center を比較 ひかく する。x が x_center より小 ちい さい場合 ばあい 、左側 ひだりがわ の S_left を調 しら べる。x が x_center よりも大 おお きい場合 ばあい 、右側 みぎがわ の S_right を調 しら べる。
根 ね ノードから葉 は ノードまで、走査 そうさ していく過程 かてい で、それぞれのノードの S_center に含 ふく まれる区間 くかん 群 ぐん を処理 しょり する。x が x_center より小 ちい さい場合 ばあい 、S_center にある区間 くかん は必 かなら ず終点 しゅうてん が x より大 おお きい(そうでないと x_center とオーバーラップできない)。したがって、S_center にある区間 くかん 群 ぐん のうち x より始点 してん が小 ちい さい区間 くかん を探 さが せばよい。S_center に対応 たいおう するデータ構造 こうぞう はすでにあるのでそれを使 つか い、この場合 ばあい は始点 してん だけを見 み ればいいので始点 してん でソートされたリストを調 しら べる。始点 してん が x より小 ちい さい区間 くかん は、必 かなら ず x を含 ふく んでいる(終点 しゅうてん は x_center より大 おお きく、x_center は x より大 おお きいため)。したがって、始点 してん でソートされたリストを先頭 せんとう から順 じゅん に見 み ていき、始点 してん が x より小 ちい さいものを出力 しゅつりょく に加 くわ える(始点 してん が x を超 こ えた時点 じてん で終了 しゅうりょう )。
同様 どうよう に x が x_center より大 おお きい場合 ばあい 、S_center にある区間 くかん 群 ぐん は全 すべ て始点 してん が x より小 ちい さいことがわかっているので、終点 しゅうてん でソートされたリストを使 つか って、終点 しゅうてん が x より大 おお きい区間 くかん を探 さが せばよい。
x が x_center と同一 どういつ の場合 ばあい 、S_center にある区間 くかん 群 ぐん は全 すべ て解 かい に含 ふく めることができ、しかもそれ以降 いこう の木 き 構造 こうぞう の走査 そうさ をする必要 ひつよう がない。
区間 くかん 木 き はより高次 こうじ の N 次元 じげん に拡張 かくちょう でき、クエリ時間 じかん と構築 こうちく 時間 じかん は1次元 じげん と同 おな じで、メモリ使用 しよう 量 りょう は O(n log n ) となる。
まず、N 次元 じげん の領域 りょういき 探索 たんさく 木 き を構築 こうちく し、クエリの領域 りょういき R に始点 してん や終点 しゅうてん が含 ふく まれる全 すべ ての区間 くかん を効率 こうりつ 的 てき に検索 けんさく できるようにする。そのような領域 りょういき が明 あき らかになったら、残 のこ る問題 もんだい はクエリの領域 りょういき を内包 ないほう する領域 りょういき を探 さが す方法 ほうほう である。そのようなオーバーラップを探 さが すにはN 次元 じげん の区間 くかん 木 き を構築 こうちく し、いずれかの座標軸 ざひょうじく について R と交差 こうさ するかどうかを調 しら べる。例 たと えば、2次元 じげん の場合 ばあい 、X軸 じく についての区間 くかん 木 き を構築 こうちく し、四角形 しかっけい などの領域 りょういき R がクエリとして与 あた えられる。そして、同時 どうじ にY軸 じく についての区間 くかん 木 き に対 たい しても同様 どうよう にクエリを処理 しょり する。
次元 じげん があがると、それに対応 たいおう して区間 くかん 木 き も余分 よぶん に必要 ひつよう になる。木 き 構造 こうぞう を走査 そうさ する際 さい に、オーバーラップを探 さが すために x と S_center の比較 ひかく を行 おこな う。1次元 じげん の場合 ばあい に2つのソートされたリストが使 つか われていた部分 ぶぶん に、領域 りょういき 探索 たんさく 木 き を構築 こうちく する。これにより、S_center と領域 りょういき R のオーバーラップを効率 こうりつ 的 てき に検索 けんさく できるようになる。
別 べつ の手法 しゅほう は、Introduction to Algorithms, Second Edition [ 1] の 14.3 章 しょう (pp.331–317、First Edition は15.3章 しょう )に記述 きじゅつ がある。
挿入 そうにゅう と削除 さくじょ にかかる時間 じかん は O(log n ) である(n は区間 くかん の総数 そうすう )。
これは、単純 たんじゅん な順序 じゅんじょ 木 き (例 たと えば2分 ふん 探索 たんさく 木 き や平衡 へいこう 2分 ふん 探索 たんさく 木 き )を使 つか うもので、ノードの順序 じゅんじょ は各 かく 区間 くかん の始点 してん (下限 かげん の値 ね )に従 したが い、各 かく ノードには区間 くかん の終点 しゅうてん (上限 じょうげん )とそのノード配下 はいか の部分 ぶぶん 木 き 全体 ぜんたい の最大 さいだい 上限 じょうげん 値 ち が格納 かくのう される。この情報 じょうほう を挿入 そうにゅう ・削除 さくじょ に際 さい して保 たも つには、O(h ) ステップ(h はそのノードの高 たか さ)の処理 しょり を行 おこな えばよく、上位 じょうい ノードに対 たい して最大 さいだい 値 ち の更新 こうしん をしていく。
2つの区間 くかん A と B がオーバーラップするのは、A .low ≤ B .high と A .high ≥ B .low が同時 どうじ に成 な り立 た つ場合 ばあい だけである。この木 き 構造 こうぞう でオーバーラップを探 さが して走査 そうさ していく場合 ばあい 、以下 いか のような場合 ばあい を即座 そくざ に除外 じょがい できる。
右 みぎ の子 こ ノードの始点 してん (下限 かげん )がクエリの終点 しゅうてん (上限 じょうげん )より大 おお きい場合 ばあい 、それ以降 いこう の部分 ぶぶん 木 き は走査 そうさ する必要 ひつよう がない。
最大 さいだい 上限 じょうげん 値 ち がクエリの始点 してん より小 ちい さい部分 ぶぶん 木 き は走査 そうさ する必要 ひつよう がない。
区間 くかん は全体 ぜんたい としては、まず始点 してん の値 ね でソートされ、次 つ いで終点 しゅうてん の値 ね でソートされていることになる。この順序 じゅんじょ 付 づ けを利用 りよう して区間 くかん の二 に 重 じゅう 登録 とうろく を防 ふせ ぐことができる。区間 くかん の挿入 そうにゅう は O(log n ) だが、二 に 重 じゅう 登録 とうろく の検出 けんしゅつ には O(k + log n ) がかかる(k は新 あら たな区間 くかん とオーバーラップしている区間 くかん 数 すう )。
この木 き 構造 こうぞう を高 こう 次元 じげん に拡張 かくちょう するには、木 き の各 かく レベルで対応 たいおう する次元 じげん を周期 しゅうき 的 てき に変化 へんか させればよい。例 たと えば、2次元 じげん の場合 ばあい 、奇数 きすう レベルではX軸 じく の範囲 はんい を扱 あつか い、偶数 ぐうすう レベルではY軸 じく を扱 あつか う。ただし、このような木 き 構造 こうぞう で木 き の回転 かいてん によって平衡 へいこう を保 たも つアルゴリズムは、あまり明 あき らかではない。
^ Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest , and Clifford Stein. Introduction to Algorithms , Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7
Mark de Berg; Marc van Kreveld; Mark Overmars; Otfried Schwarzkopf (2000). “Section 10.1: Interval Trees”. Computational Geometry (Second Revised ed.). Springer-Verlag. pp. 212-217. (centered interval tree). ISBN 3642096816 . NCID BA45765321
(日本語 にほんご 訳 やく M.ドパーグ、M.ファン.クリベルト、M.オーバマーズ、O.シュワルツコップ「10.1:区間 くかん 木 き 、10.3:区間 くかん 木 き 」『コンピュータ・ジオメトリ―計算 けいさん 幾何 きか 学 がく :アルゴリズムと応用 おうよう 』近代 きんだい 科学 かがく 社 しゃ 、2000年 ねん (原著 げんちょ 1997年 ねん )、pp.260-268,274-282頁 ぺーじ 。ISBN 4764903881 。 )
Franco P. Preparata; Michael Ian Shamos (1985). Computational Geometry: An Introduction . augmented tree. Springer-Verlag. ISBN 0387961313 . NCID BA00039338 . ISBN 3540961313