(Translated by https://www.hiragana.jp/)
区間木 - Wikipedia

区間くかんまたはインターバルえい: 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種類しゅるい設計せっけい解説かいせつする。

Centered interval tree

編集へんしゅう

クエリにかかる時間じかんは O(log n + m) となる(n格納かくのうされている区間くかん総数そうすうm報告ほうこくされる結果けっか総数そうすう)。構築こうちくには O(n log n) の時間じかんがかかり、メモリ使用しようりょうは O(n) となる。

構築こうちく

編集へんしゅう

かず直線ちょくせんじょうn 区間くかんがあるとき、これらをあらわすデータ構造こうぞう構築こうちくし、べつてん区間くかんとオーバーラップするすべての区間くかん効率こうりつてき検索けんさくしたいとする。

まず、すべての区間くかんふくまれる範囲はんい特定とくていし、その中央ちゅうおうx_center分割ぶんかつする(x_center分割ぶんかつするのは、構造こうぞうをなるべく平衡へいこうにするため)。これによって、区間くかんは3種類しゅるい分類ぶんるいされる。x_center左側ひだりがわにある区間くかんぐんS_leftx_center右側みぎがわにある区間くかんぐんS_rightx_center にオーバーラップする区間くかんぐんS_center とする。

S_leftS_rightぞくする区間くかんぐん同様どうよう方式ほうしき再帰さいきてき分割ぶんかつしていき、左右さゆう区間くかんまったのこらない状態じょうたいにする。

S_centerぞくする区間くかんぐん中央ちゅうおうてんにオーバーラップしている区間くかんぐん)は、区間くかん木内きなしのノードにリンクされたべつのデータ構造こうぞう格納かくのうされる。このデータ構造こうぞうは2つのリストから構成こうせいされていて、1つは区間くかんぐん始点してんでソートしたリスト、もう1つは区間くかんぐん終点しゅうてんでソートしたリストである。

結果けっかとして構築こうちくされる2分木ぶんぎのノードには、以下いかのようなデータが格納かくのうされる。

  • 中央ちゅうおうてん位置いち
  • 区間くかん全体ぜんたい中央ちゅうおうてん左側ひだりがわにある区間くかんぐん対応たいおうしたノードへのポインタ
  • 区間くかん全体ぜんたい中央ちゅうおうてん右側みぎがわにある区間くかんぐん対応たいおうしたノードへのポインタ
  • 中心ちゅうしんてんとオーバーラップするぜん区間くかん始点してんでソートしたリスト
  • 中心ちゅうしんてんとオーバーラップするぜん区間くかん終点しゅうてんでソートしたリスト

検索けんさく(クエリ)

編集へんしゅう

以上いじょうのように構築こうちくされたデータ構造こうぞうがあるとき、区間くかんまたはてんについてのクエリをあたえられると、その入力にゅうりょくとオーバーラップするすべての区間くかん集合しゅうごうかえす。

区間くかん R入力にゅうりょくとしてあたえられたとき、それをてん入力にゅうりょくとしてあたえられた場合ばあい還元かんげんすることができる。まず、始点してん終点しゅうてんR区間くかんないにある区間くかんすべさがす。1次元じげん場合ばあいかく区間くかん始点してん終点しゅうてん構成こうせいされた単純たんじゅん構造こうぞう使つかえばよい。このとき、かくてんには対応たいおうする区間くかんへのポインタを付与ふよしておく。

この O(log n) の探索たんさくによって、考慮こうりょすべき最小さいしょう最大さいだいてんあきらかとなる。この範囲はんいないかくてんには区間くかん対応たいおうしていて、それがクエリの区間くかんとオーバーラップしているので、かいくわえる。ただし、始点してん終点しゅうてんRふくまれる区間くかんかんがえられるので、じゅう登録とうろくしないよう注意ちゅうい必要ひつようである。これをふせぐには、かく区間くかんあらわすデータ構造こうぞうにフラグを用意よういしておいて、かいくわえられたときにそのフラグをてればよい。

以上いじょうでまだ考慮こうりょされていない区間くかんは、R完全かんぜんふくまれてしまうような区間くかんである(始点してん終点しゅうてんRなかにはない)。このような区間くかんさがすには、R うち任意にんいてんについて下記かきしめてんクエリのアルゴリズムを実施じっしすればよい(ここでも、じゅう登録とうろくしないよう注意ちゅうい必要ひつようである)。

つぎてん x入力にゅうりょくとしてあたえられた場合ばあいかんがえる。通常つうじょうの2分木ぶんぎ走査そうさするのと同様どうよう再帰さいきてきアルゴリズムで構造こうぞう走査そうさする。かくノードについて x とそのノードの中央ちゅうおうてんである x_center比較ひかくする。xx_center よりちいさい場合ばあい左側ひだりがわS_left調しらべる。xx_center よりもおおきい場合ばあい右側みぎがわS_right調しらべる。

ノードからノードまで、走査そうさしていく過程かていで、それぞれのノードの S_centerふくまれる区間くかんぐん処理しょりする。xx_center よりちいさい場合ばあいS_center にある区間くかんかなら終点しゅうてんx よりおおきい(そうでないと x_center とオーバーラップできない)。したがって、S_center にある区間くかんぐんのうち x より始点してんちいさい区間くかんさがせばよい。S_center対応たいおうするデータ構造こうぞうはすでにあるのでそれを使つかい、この場合ばあい始点してんだけをればいいので始点してんでソートされたリストを調しらべる。始点してんx よりちいさい区間くかんは、かならxふくんでいる(終点しゅうてんx_center よりおおきく、x_centerx よりおおきいため)。したがって、始点してんでソートされたリストを先頭せんとうからじゅんていき、始点してんx よりちいさいものを出力しゅつりょくくわえる(始点してんxえた時点じてん終了しゅうりょう)。

同様どうようxx_center よりおおきい場合ばあいS_center にある区間くかんぐんすべ始点してんx よりちいさいことがわかっているので、終点しゅうてんでソートされたリストを使つかって、終点しゅうてんx よりおおきい区間くかんさがせばよい。

xx_center同一どういつ場合ばあいS_center にある区間くかんぐんすべかいふくめることができ、しかもそれ以降いこう構造こうぞう走査そうさをする必要ひつようがない。

こう次元じげん

編集へんしゅう

区間くかんはより高次こうじN 次元じげん拡張かくちょうでき、クエリ時間じかん構築こうちく時間じかんは1次元じげんおなじで、メモリ使用しようりょうは O(n log n) となる。

まず、N次元じげん領域りょういき探索たんさく構築こうちくし、クエリの領域りょういき R始点してん終点しゅうてんふくまれるすべての区間くかん効率こうりつてき検索けんさくできるようにする。そのような領域りょういきあきらかになったら、のこ問題もんだいはクエリの領域りょういき内包ないほうする領域りょういきさが方法ほうほうである。そのようなオーバーラップをさがすにはN次元じげん区間くかん構築こうちくし、いずれかの座標軸ざひょうじくについて R交差こうさするかどうかを調しらべる。たとえば、2次元じげん場合ばあい、Xじくについての区間くかん構築こうちくし、四角形しかっけいなどの領域りょういき R がクエリとしてあたえられる。そして、同時どうじにYじくについての区間くかんたいしても同様どうようにクエリを処理しょりする。

次元じげんがあがると、それに対応たいおうして区間くかん余分よぶん必要ひつようになる。構造こうぞう走査そうさするさいに、オーバーラップをさがすために xS_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つの区間くかん AB がオーバーラップするのは、A.low ≤ B.high と A.high ≥ B.low が同時どうじ場合ばあいだけである。この構造こうぞうでオーバーラップをさがして走査そうさしていく場合ばあい以下いかのような場合ばあい即座そくざ除外じょがいできる。

  • みぎノードの始点してん下限かげん)がクエリの終点しゅうてん上限じょうげん)よりおおきい場合ばあい、それ以降いこう部分ぶぶん走査そうさする必要ひつようがない。
  • 最大さいだい上限じょうげんがクエリの始点してんよりちいさい部分ぶぶん走査そうさする必要ひつようがない。

区間くかん全体ぜんたいとしては、まず始点してんでソートされ、いで終点しゅうてんでソートされていることになる。この順序じゅんじょけを利用りようして区間くかんじゅう登録とうろくふせぐことができる。区間くかん挿入そうにゅうは O(log n) だが、じゅう登録とうろく検出けんしゅつには O(k + log n) がかかる(kあらたな区間くかんとオーバーラップしている区間くかんすう)。

こう次元じげん

編集へんしゅう

この構造こうぞうこう次元じげん拡張かくちょうするには、かくレベルで対応たいおうする次元じげん周期しゅうきてき変化へんかさせればよい。たとえば、2次元じげん場合ばあい奇数きすうレベルではXじく範囲はんいあつかい、偶数ぐうすうレベルではYじくあつかう。ただし、このような構造こうぞう回転かいてんによって平衡へいこうたもつアルゴリズムは、あまりあきらかではない。

脚注きゃくちゅう

編集へんしゅう
  1. ^ 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