立方体の最も近い


8

立方体 の点に最も近い単位立方体のコーナーをどのように見つけることができますか? L1メトリックを使用して、4d | -0000 | =、| -0001 | = (右側の)など。R d x x ∑ x i x x 3 + x 2 + x 1 + (1 − x 0)x 0d+1Rdx
x∑xixx3+x2+x1+(1−x0)
x0

別の定式化の場合、最初に > 1/2を反転してソートし、 1/2; 対称性により、このケースのアルゴリズムはキューブ内の任意のを実行できます。 定義、。 次に、コーナーが最も小さいコーナーが必要です。 0 ≤ X D - 1 ≤ ... X 1 ≤ X 0 ≤ X C ≡ 1 - 2 X 1 ≥ C D - 1 ≥ ... C 1 ≥ C 0 ≥ 0 D + 1個のC ⋅xi0≤xd−1≤… x1≤x0≤x
c≡1−2x1≥cd−1≥… c1≥c0≥0
d+1c⋅

たとえば4dでは、上記のように1/2 .. 0に減少すると、最も近い5つのコーナーがxi

    0 0 0 0
    0 0 0 1
    0 0 1 0

    0 1 0 0  or  0 0 1 1
                 0 1 * *

    1 0 0 0
 or 0 1 0 1

ただし、5d、6d ...コーナーが増える木は(私には)ますます乱雑に見えます。
近似最近傍のヒューリスティックスは問題ありません。


簡単なアプローチで何が壊れますか?立方体の各角がであると仮定し及びX ∈ [ 0 、1 ] D。ラウンド最も近い整数に各コーディネータ最も近い点を得るためにPを、そして生成Dを追加することによって、より多くの「最も近い点を」それぞれの座標独立。{0,1}dx∈[0,1]dpdp1mod2p
— ダニエルアポン

@Daniel Apon、3dで0 <= x2 <= x1 <= x0 <= 1/2または1> = c2> = c1> = c0> = 0上記のように、最も近い4つのコーナーは000 001 010 100としてあなたが示唆するだけでなく、顔000 001 010 011であることができる(8 + 6個、8角プラス隣接する6面に全体の3Dキューブ分割)
— デニス

2
この問題を説明する別の方法を次に示しますの負でない数のコレクションが与えられた場合、最小コストのサブセットを見つけます(セットのコストはその中の数の合計です)。n + 1nn+1
— Neal Young

はい、それは分cです。上記のコーナー-最小コストのサブセットがより良い名前です、それをタイトル/タグに追加しますか?
— デニス

回答:


8

時間O(d3log⁡d)

補題: 任意の修正。次に、最も近いコーナーを含み、が接続されているセットがあります(つまり、によって生成されたハイパーキューブのサブグラフが接続されています)。x∈[0,1]dD + 1 { 0 、1 } D X S SSd+1{0,1}dxSS

証明。 まずその場合考えるない座標に等しいていない1 / 2。x1/2

任意のコーナーを考えるとにおけるS座標フリッピング、Jのからの距離を増加させないだろうにX場合| a j − x j | ≥ 1 / 2。 aSajaax|aj−xj|≥1/2

少なくとも1つの座標jが異なるSの 2つのコーナーを考慮し、 WLOGをa j = 0およびb j = 1と仮定します。もしXがJ < 1 / 2は、その後反転のb jはでBがで別のポイントが得られるSを(それから距離を減少させるため、BにX)。または、場合のx J > 1 / 2は、その後、フリップjでa,bSjaj=0bj=1xj<1/2bjbSbxxj>1/2ajin はSにポイントを与えます。それぞれ異なる座標に対してこのプロセスを繰り返すとBは接続路与えA及びB内のSを。aSababS

場合座標に等しい有する1 / 2、次いで、選択する際にSを、より多くのゼロ座標を持つものに優先順位を与えることで等距離点間の関係を壊します。次に、同じ引数が機能します。QEDx1/2S

補題によって、ダイクストラのようなアルゴリズムを使用してを見つけることができます。コーナーに最も近いで始まるX(持つJ = 0であれば、XがJ ≤ 1 / 2)。次に、Sのある点に隣接するコーナーの中でxに最も近いコーナーをSに繰り返し追加します。d + 1ポイントが追加されたら停止します。 Sxaaj=0xj≤1/2SxSd+1

単純に(隣に最も近い点を見つけるために最小ヒープを使用して各反復で)を、Iがある推測D + 1回の反復は、それぞれ反復が必要O (D 2)を生成する作業を、Dの各(追加されたノードの近隣をそのサイズd)の表現を持ち、実行時間O (d 3 log d )を与えます。xd+1O(d2)ddO(d3log⁡d)

時間O(d2log⁡d)

各コーナー暗黙的にペア(h 、d )として表します。ここで、hはa i = 1であるようなインデックスiのセットのハッシュであり、dはxからaまでの距離です。特定のコーナーaから、すべての隣接するコーナーのペアをO (d )時間(合計)で生成できます。これにより、実行時間がO (d 2 log d )になります。a(h,d)hiai=1dxaaO(d)O(d2log⁡d)

もっと早く?

議論を簡単にするために、問題を次のように言い換えましょう。 一連の所与の非負数Y 1 ≤ Y 2 ≤ ⋯ ≤ Y D、検索D + 1つのサブセットのコストは、それの数字の和である数の最小コストのサブセットを、。dy1≤y2≤⋯≤ydd+1 (テイク、以前の問題との接続を確認するには各サブセット; YのY Iの対応するコーナーにAyi=|xi−1/2|Yyi超立方体の I(yは) 1である場合( X I ≤ 1 / 2及び Y I ∈ Y)又は( X I > 1 / 2及び Y I ∉ Y)。Yのコストは、 xから a (y )までの距離です。)a(y)ai(y)xi≤1/2yi∈Yxi>1/2yi∉YYxa(y)

これは、より高速なアルゴリズムの一般的な考え方です。多分誰かがそれを機能させる方法を理解することができます。

各ノードがy iのサブセットである暗黙の有向グラフを定義します。開始ノードは空のセットです。ノードを暗黙的にペア(h 、c )として表します。ここで、hはサブセットのハッシュで、cはコストです。各サブセットYについて、隣接するサブセットを何らかの方法で定義して、(i)Y → Y ′が有向エッジの場合、コスト(Y ′)≥コスト(Y )であり、(ii)任意のサブセットY ′が存在するようにします。有向エッジYyi(h,c)hcYY→Y′(Y′)≥(Y)Y′あるサブセット Yからの Y → Y '。ただし、コスト(Y )≤コスト(Y ')。次に、開始ノードから始まるこの暗黙のグラフでダイクストラを実行します。Y→Y′Y(Y)≤(Y′)

(i)と(ii)の両方が成り立つようにエッジを(どういうわけか)選択し、最も安いノードの次数の合計がO (d )になるようにします。(これは常に可能です。たとえば、エッジを最初にルート化されたいくつかの最短パスツリーのエッジにすることができます。)しかし、最短パスツリーのアプリオリな知識がなくても、そのようなグラフを定義できますか?その場合、これはO (d log d )時間アルゴリズム(?)につながる可能性があります。d+1O(d)O(dlog⁡d)


ニールに感謝します。ダイクストラのようなコーナー拡張を改善できますか?正規化後の可能な最も近いd + 1コーナーのセット(xを<= 1/2に反転してソート)は、dとともに非常にゆっくりと成長するように見えます。
— Denis

回答を編集して、ランタイムをより明確に説明しました。
— Neal Young

そして、Davidの答えは、それをする方法を示しています。O(dlog⁡d)
— ニールヤング

8

これは、の負でない重み付けされたアイテムのセットの中で、最小合計重みのd + 1サブセットを要求することと同じです。アイテムのすべてのサブセットをツリーに形成することができます。この場合、サブセットの親は、最も重いアイテムを削除することで形成されます(タイは任意に、ただし一貫して壊れています)。D + 1つのソリューションは、そのルートに接続され、このツリーのサブツリー(空集合)を形成します。dd+1d+1

したがって、サブセットの優先キューを維持し、それらを優先順に削除するダイクストラのアルゴリズムの形式によって、このツリーで最小のアイテムを検索できます。最初に選択したアイテムが空のセットであるところから始めます。次に、各ステップで、アルゴリズムの不変式として、すでに選択されている各サブセットの次の未選択の子を含む優先度キューを維持します。セットSを選択すると、それを優先度キューから削除し、2つの新しいサブセットを優先度キューに追加します。最初の子(Sの最も重い要素よりも次の重い要素を追加することによって形成されるセット)とその次の兄弟(Sの最も重い要素を削除し、同じ次のより重い要素を追加することによって形成されるセット)。d+1SSS

アイテムを重みで並べ替えた後、各セットを暗黙的に(最も重い要素とその親セットへのポインターとして)表し、各セットの合計重みを維持し、アルゴリズムで必要な最初の子と次の兄弟を見つけるのは簡単です。セットごとの一定の時間。したがって、合計時間は、最初のソートと、合計時間を要する優先キュー操作によって支配されます。O(dlog⁡d)

アイテムがすでにウェイトでソートされている場合は、これも改善できます。前のアルゴリズムの「最初の子」と「次の兄弟」の関係を、サブセットのバイナリツリーの左側と右側の子として表示します。このツリーはヒープ順(親から子へと重みが増加する)なので、ヒープ順バイナリツリーで最小重みノードを見つけるアルゴリズムを適用できます[GN Frederickson。最小ヒープでの選択に最適なアルゴリズム。Information and Computation、104:197–214、1993]。ソーティングステップ後の合計時間はO (d )です。d+1O(d)


私はデビッドの解決策に同意します。彼が説明するバイナリツリーはすべてのセットに到達するのに十分であり、時間を与えます。O(dログ⁡d)
— ニールヤング

0

実際には、重みはほぼ均一に分布することがよくありおよそ1 2 3 … 次に、簡単なヒューリスティックは、…

単一ビット、例えば10000000 01000000 ... 00000001d…
低ビット組合せ00000011 00000101 00000110 00000111⌈lん2d⌉
次のいくつかのビットの組み合わせ、例えば00001001 00001010 00001100。これらの候補 の中の最良のd + 1は、実際には少なくとも小さなdに対してはかなりうまく機能します。⌈lん2d⌉
d+1d

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.