対数時間で共通の最小値を見つける


7

空でない交差があることがわかっているサイズ 2つのインスタンスが与えられ、交差の最小要素が時間で見つかるようなセットを格納するデータ構造を探しています。これは、最悪の場合または償却後の複雑さのどちらでも達成できますか?データ構造の他の要件:削除、初期化。O(n)O(logn)O(logn)O(nlogn)

要件を明確にするために、このようなデータ構造の適用例を次に示します。入力は、すべて番号nを含むのn個のサブセットで構成されます。出力はn行n列の行列で、そのエントリはセットiとjの共通部分の最小要素です。基本的なアプローチで、この問題を時間で解決できます。上記の条件を満たすデータ構造では、時間で解くことができ。{1,...,n}i,jO(n3)O(n2logn)


私が最も興味を持っている状況は、セットのテールがまばらで、密度が着実に増加している場合です。たとえば、密度が1 / d未満に制限されているセットには、明らかなO(d log n)アルゴリズムがあります。この場合、最小ヒープを使用し、最小の1つのセットから開始します。次に、ピンポンを前後に動かして、常に次の最大の要素を取得します。安定するまでヒープ内。

セットの裾がまばらになっていること、または密度が着実に増加していることはどういう意味ですか?
DW

例えば、I <NとN確率1に含まれるための要素iが確率1 /(NI)に含まれているランダム集合を考える
プレ腎臓

質問を編集して特定の問題を指定できる場合。これは、これを解決しやすくする可能性があります。たとえば、各セットがランダムに選択された場合(要素iはiに関係なく確率pで含まれます)、予想される実行時間がような自然なアルゴリズムがあると思います:最初に列挙しますセットすべてのペア(どちらも1を含む)。次に、1を含むすべてのペア(まだ検出されていない)。等々。単純な停止条件があり、セットがランダムである場合は、停止する前にそれほど遠くに進む必要はありません。O(n2logn)Si,Sj
DW

別の例として、コメント内の特定の分布について、各セットの予想されるサイズがであるため、簡単な時間アルゴリズムがあり。O(n2logn)O(logn)
DW

回答:


2

できません。そのようなデータ構造はありません。セットごとに個別のインスタンスがあり、各インスタンスが個別に初期化される(他のセットに関する情報ではなく、それが表すセットに関する情報のみを使用する)と仮定すると、これらの実行時間は達成できません。

特に、2つのセットがある場合、最小の共通要素を見つけるには時間かかります。実際、ここで説明するように、素のテストには時間が必要です。ここで、宇宙上の2つのセットから始めることを想像してください。LETと。これで、は共通の要素を持つことが保証されます。したがって、問題に適切なデータ構造がある場合は、をデータ構造の1つのインスタンスに格納し、を別のインスタンスに格納します。その後、我々は最小限の要素を見つけるための方法があった場合内をΩ(n)Ω(n)S1,S2{1,2,,n1}T1=S1{n}T2=S2{n}T1,T2T1T2T1T2o(n)時間、これはを時間でテストする方法を提供します(最小要素がより小さいかどうかをテストするだけです)-後者は不可能であることはすでにわかっています。つまり、前者も不可能です。つまり、問題のデータ構造は、2つのセットの最小の共通要素を見つけるのに時間かかる必要があります。S1,S2o(n)nΩ(n)

これは、アプリケーションを効率的に解決できないことを意味するものではありません。アプリケーションを時間で解決する方法はまだあります。この結果はそれを除外しません。O(n2logn)


1
別の投稿であなたの答えを引用しているため、あなたが言及していない結果を引用しているので、あなたがあなたの答えをもう少し自己完結型にしていただければ幸いです。

さらに詳しく説明する必要があると私が思うステップを正確に指摘しておきます。あなたの議論の重要なステップは、どちらの方法で格納されているが、お互いのメモリにアクセスできないセットの場合、素性の決定問題を解決するのにOmega(n)時間かかるという主張です。より高速なアルゴリズムは基本的な通信の複雑性の結果と矛盾すると主張します。ただし、通信チャネルのこのモデルは、Omega(n)の範囲がわかっている文献で見つけた基本的な通信モデルよりも一般的であるように見えます。これが私が特定の引用を求める理由です。

@ pre-kidney、私はそれがより一般的に見える方法を理解していません。とにかく、あなたの異論は主に私の別の答えにあるようですので、そこで議論してみましょう。ここで私の回答を編集して、削減について詳しく説明しました。計算モデルについて特に懸念がある場合は、そこにコメントして、計算モデルの違いを具体的に説明してください。私はそれを見ませんが、それはあなたが間違っているという意味ではありません-私はこの問題の専門家ではないので、私は常に誤解される可能性があります。
DW

公平なポイントと更新をありがとう。見てみましょう。

-1

2セット与えられた問題を解決するためのアイデアは次のとおりです。

赤黒木で「セット」をホールドできます。さらに、ツリー内のすべてのノードに対して1ビットを関連付けて、そのサブツリーに両方のセットの要素が含まれているかどうかを判断します。プレゼンテーションのために、これを挿入ビットと呼びます。赤黒の木は要素を左から右に並べ替えると思います。

要素をツリーに挿入するとき、アルゴリズムは要素がツリー(つまり、他のセット)に存在するかどうかをチェックします。そうでない場合は、通常どおり要素を挿入します。そうでない場合、ルートから要素を含むリーフに移動することにより、アルゴリズムは対応するノードの挿入ビットをオンにします。最悪の場合、がかかり。O(logn)

要素を削除するとき、アルゴリズムは要素がツリーに存在するかどうか、および挿入ビットがオンになっているかどうかをチェックします。要素がツリーに存在しない場合、エラーが返されます。要素が存在し、挿入ビットがオフの場合、Red Blackツリーアルゴリズムのように要素を削除します。それ以外の場合、ルートから要素を含むリーフに移動することにより、アルゴリズムは対応するノードの挿入ビットをオフにします。削除にはです。O(logn)

最後に、両方のセットで共有される最小要素を見つけるためのアルゴリズムは、ルートから始まります。ルートの挿入ビットがオフの場合、セットがばらばらになると、アルゴリズムはエラーを返します。それ以外の場合、挿入ビットがオンになっている場合、アルゴリズムは左の子に再帰的に移動し、そうでない場合は、右の子に移動します。アルゴリズムは、最小値の要素で停止します。アルゴリズムは実行され。O(logn)

私はより多くのセットのために一般化する方法を考えています...


1
これは、初期化中に2つのインスタンスが相互に認識されていると想定しているため、上記の基準を満たしていません。多くのインスタンスがあり、ペアワイズの最小交差を見つける必要がある場合、データ構造を再構築する必要があるため、タイミングを満たしません。セットの各ペア。

インスタンスが相互に認識されていない場合、en.wikipedia.orgO(n)
wiki /…

問題の入力は何ですか?セットを初期化するときに、要素を共通ツリーに挿入/削除できます。その後、削除と挿入の連続操作を使用しても、クエリの複雑さに影響はありませんO(logn)
。O

それがポイントです、セットを結合することはできません。明確にするために、そのようなデータ構造のサンプルアプリケーションを使用して質問を更新します。

ちなみに、私はあなたに反対票を投じませんでした-私の質問に本当に答えられなくても、あなたの答えはそれが生み出した議論と追加の説明に役立つと思います。

-1

初期化:
1)リスト全体のリスト#1-O(n log n)のすべての要素を含む赤黒ツリーを作成します。
2)リスト#2のすべての要素を反復処理し、それが赤黒ツリーに存在するかどうかを確認します-リスト全体のO(n log n)
3)赤黒ツリーに存在する場合、リストからその要素を挿入します#2お気に入りの最小ヒープに-リスト全体のO(n log n)

次に、最小交差要素を検索するには、ヒープの上部を見るだけでよいので、それがO(1)です。


2
このアプローチには、user3563894の回答と同じ問題があります。コメントを参照してください。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.