5

次のタプルのリストを考えてみましょう: [(5,4,5), (6,9,6), (3,8,3), (7,9,8)]

リスト内に、そのタプルのすべての要素が特定のタプル (針) 以上であるタプルが少なくとも 1 つ存在するかどうかをチェックするアルゴリズムを考案しようとしています。

たとえば、特定のタプル (6,5,7) の場合、特定のタプルのすべての要素がリストの最後のタプル (7,9,8) より小さいため、アルゴリズムは True を返す必要があります。ただし、特定のタプル (9,1,9) の場合、リストには各要素が特定のタプルより大きいタプルがないため、アルゴリズムは False を返す必要があります。特に、これは、リスト内のすべてのタプルの 2 番目の要素よりも小さい、指定されたタプルの 2 番目の要素 1 によるものです。

単純なアルゴリズムは、リスト内のタプルを 1 つずつループし、内側のループでタプルの要素をループします。n 個のタプルがあり、各タプルに m 個の要素があると仮定すると、O(nm) の複雑さが得られます。

複雑さの低いタスクを生成するアルゴリズムを持つことが可能かどうかを考えています。データを保存するための前処理または任意の派手なデータ構造が許可されています!

私の最初の考えは、バイナリ検索のいくつかの変形を利用することでしたが、最初の要素に基づいていくつかのタプルを削除した後、単純なソリューションに戻らないようにするデータ構造を見つけることができないようです。このアルゴリズムは、最後に O(nm) になる可能性もあります。

ありがとう!

4

4 に答える 4

1

この種の問題は、空間インデックスシステムによって対処されます。クエリを効率的に実行できるデータ構造が多数あります。

于 2013-06-11T00:18:17.597 に答える
0

Sを n 個の各 m タプルの元のセットの位相的にソートされたコピーとします。次に、検索ごとに O(m ln n) のコストで、S 内の任意のテスト タプルに対してバイナリ検索を使用できます (プライごとに最大で m の比較を持つ最大で lg n の検索プライによる)。

P ≤ Q となるようなタプル P, Q が S に存在すると仮定します (つまり、対応する P の要素よりも小さい Q の要素はありません)。次に、タプル Q を S から削除できます。実際には、これにより S のサイズが m の小さな倍数に削減されることが多く、O(m ln m) のパフォーマンスが得られます。しかし、最悪の場合、まったく削減されません。

于 2013-06-11T00:43:28.543 に答える