特定の間隔と重複するすべての間隔を検索します


7

注:私はこの質問をstackoverflow.comから移動しました

よりも上で解決できるかどうかを確認したいアルゴリズムの問​​題があります。O(n)

Iは、テーブル与えているの各要素はタプル要素用いてと各タプルは、間隔のいくつかの種類、すなわち、。指定された間隔と重複するすべての間隔を見つける必要がありますおよびです。さらに、それぞれのエントリを指すインデックスとともに、値または値をそれぞれ含む、2つの並べ替えられたリストおよびがあります。リストは次でソートされますTn(si,ei)si,eiNsi<ei[t0,t1]t0,t1Nt0<t1SEseiTs値、または値。(と両方の値が一意であると仮定しましょう。)ese

問題:

各間隔/タプルを見つける必要があります。ここでおよびe_i \ geqslant t_0です。(si,ei)Tsit1eit0

これまでの私の考え:

私たちは、いずれかの適用区間の境界の1、すなわち検索でいくつかの要素を除外することができt1Sまたはt0E。これにより、残りの要素のリストLが得られます

L{eEet0} or L{sSst1}
ただし、どの検索を実行しても、Lの要素数に下限はありませんL。さらに、以前に実行した検索に応じて、s \ leqslant t_1またはe \ geqslant t_0の場合、Lのすべての要素をそれぞれチェックする必要があります。Lst1et0

このソリューションの複雑さはO(n)です。

ただし、が間隔と重複する要素の最大数であるとします。と仮定すると適切な検索を選択することで少なくとも要素を除外できるため、複雑度はなります。それでもます。k[t0,t1]knO(n/2)n/2LO(n/2)O(n)

この問題を解決するためのより良いアプローチを考えることができますか?

記録について:

間隔ツリーを使用して特定の間隔と重複するすべての間隔を見つける複雑さは、ここで、は重複する間隔の数です。ただし、私の実際のケースでは、各値、つまりとインデックスツリーを個別に提供するMySQLデータベースを使用しています。この方法では、未満で重複する間隔を見つけることができません。両方の区間境界、つまりと単一のデータ構造に格納する検索ツリーである区間ツリーを作成する必要があります。区間ツリーを構築するための複雑さはです。[O(logn+k)kseO(n)seO(nlogn)http://www.dgp.utoronto.ca/people/JamesStewart/378notes/22intervals/]


2
場合、私が考えるの事前計算が存在するで得られた空間、時間検索は。それでいいのかしら。knO(nk)O(k2+logn)
KarolisJuodelė2013

回答:


6

私はと信じている区間木があなたの問題の解決策を提供します。基本的に、間隔は間隔ツリーデータ構造に格納します。次に、と重複するすべての区間を見つけるには、区間ツリーにクエリを実行します。これで問題が解決され、時間よりも速く実行されます。[t0,t1]O(n)


参照いただきありがとうございます。しかし、最初の問題については、より良い解決策はないと思います。と仮定できる場合にのみ、速度をことができますが、残念ながら、この仮定は私の場合は当てはまりません。ありがとう。O(n)kn
セマ2013

1
@セマ、私は混乱しています。ある場合はの重複区間、そしてもちろん、あなたよりも良い行うことはできません時間、その場合にはあなたにもちょうどセット中の区間のそれぞれを確認するかもしれない- Iそうあなたの質問が何であるのか、なぜあなたが尋ねているのか分かりません(あなたはすでに、単純なアルゴリズムよりもうまくできないことの証明を持っています)。対照的に、場合、間隔ツリーは、可能な各間隔をチェックするよりも優れています。一般に、間隔ツリーの実行時間は一致の数に基づいているため、実行時間は期待できる最高の時間に近くなります。k=Θ(n)O(n)k=o(n)
DW

混乱させて申し訳ありません。私はあなたに同意し、私自身のために要約しますような上限を見つけることが望ましいでしょう。一般的な問題については、で行き詰まり、うまくいくことができません。あなたの答えと区間ツリーへの参照をありがとう。kknO(n)
セマ2013

おそらく間隔ツリーの作成に費やした時間を回答に含める必要があります。
ラファエル

@semaという表記は、漸近的な意味ではあまり意味がありません。を使用したい。knko(n)
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.