ZeitO(d3logd)
Lemma: Fixiere jedes . Dann gibt es eine Menge die Ecken von , die nächsten liegen und so, dass verbunden ist (was bedeutet, dass der durch induzierte Teilgraph des Hyperwürfels verbunden ist). S d + 1 { 0 , 1 } d x S S.x∈[0,1]dSd+1{0,1}dxSS
Beweis.
Betrachten Sie zunächst den Fall, dass keine Koordinaten gleich .1 / 2x1/2
Wenn eine Ecke in , erhöht das Umdrehen einer Koordinate von nicht den Abstand von nach wenn . S a j a a x | a j - x j | ≥ 1 / 2aSajaax|aj−xj|≥1/2
Betrachten Sie zwei beliebige Ecken in , die sich in mindestens einer Koordinate , und nehmen Sie WLOG an, dass und . Wenn ist, ergibt das Umdrehen von in einen weiteren Punkt in (weil dadurch der Abstand von zu verringert wird ). Oder, wenn dann Spiegeln in gibt einen Punkt in . Wiederholen Sie diesen Vorgang für jede unterschiedliche Koordinate inS j a j = 0 b j = 1 x j < 1 / 2 b j b S b x x j > 1 / 2 ein j a Sa,bSjaj=0bj=1xj<1/2bjbSbxxj>1/2ajaS und b ergibt einen Pfad, der a und verbindetaba innerhalb von S .bS
Wenn die Koordinaten auf gleich 1 / 2 , dann, bei der Auswahl S , Pause Beziehungen zwischen den äquidistanten Punkten durch Vorrang zu denen mit mehr Null Koordinaten geben. Dann funktioniert das gleiche Argument. QEDx1/2S
Durch das Lemma können Sie einen Dijkstra-ähnlichen Algorithmus verwenden, um zu finden . Beginne mit einer Ecke am nächsten x ( a mit einem j = 0 , wenn x j ≤ 1 / 2 ). Fügen Sie dann wiederholt zu S eine Ecke hinzu, die x am nächsten ist, unter denen, die an einen Punkt in S angrenzen . Stoppen Sie, wenn d + 1 Punkte hinzugefügt wurden. Sxaaj=0xj≤1/2SxSd+1
Naiv (unter Verwendung eines Min-Heaps, um den nächstgelegenen Punkt zu in jeder Iteration zu finden), gibt es vermutlich d + 1 Iterationen, und jede Iteration erfordert O ( d 2 ) -Arbeit, um die d Nachbarn des hinzugefügten Knotens (jeweils ) zu erzeugen davon hat eine Darstellung der Größe d ), was die Laufzeit O ( d 3 log d ) ergibt .xd+1O(d2)ddO(d3logd)
Zeit O(d2logd)
Stellen Sie jede Ecke implizit als Paar ( h , d ) dar , wobei h ein Hash der Menge von Indizes i ist, so dass a i = 1 ist und d der Abstand von x zu a ist . Aus einer gegebenen Ecke a können die Paare für alle benachbarten Ecken in O ( d ) Zeit (gesamt) erzeugt werden. Dies reduziert die Laufzeit auf O ( d 2 log d ) .a(h,d)hiai=1dxaaO(d)O(d2logd)
Schneller?
Um die Diskussion zu vereinfachen, formulieren wir das Problem wie folgt um. Wenn eine Folge von nicht negativen Zahlen y 1 ≤ y 2 ≤ ⋯ ≤ y d gegeben ist , finden Sie die d + 1 -Teilmengen der Zahlen mit minimalen Kosten, wobei die Kosten einer Teilmenge die Summe der darin enthaltenen Zahlen sind. dy1≤y2≤⋯≤ydd+1 (Um die Verbindung mit dem vorhergehenden Problem zu sehen, nehmen , dann wird jeder Teilmenge Y des Y i ‚s entspricht einer Ecke ayi=|xi−1/2|Yyi der HyperWürfels, wobei a i ( y ) ist 1wenn ( x i ≤ 1 / 2 und y i ∈ Y ) oder ( x i > 1 / 2 und y i ∉ Y ); und die Kosten von Y sind der Abstand von x zu a ( y ) .)a(y)ai(y)xi≤1/2yi∈Yxi>1/2yi∉YYxa(y)
Hier ist eine allgemeine Idee für einen schnelleren Algorithmus. Vielleicht kann jemand herausfinden, wie es funktioniert.
Yyi(h,c)hcYY→Y′(Y′)≥(Y)Y′Y→Y′Y(Y)≤(Y′)
d+1O(d)O(dlogd)