Man betrachte einen dimensionalen Vektor v, wobei v i ∈ { 0 , 1 } ist . Für jedes i kennen wir p i = P ( v i = 1 ) und nehmen an, dass v i unabhängig sind. Gibt es unter Verwendung dieser Wahrscheinlichkeiten einen effizienten Weg, um binäre n- dimensionale Vektoren zu iterieren, um mit größter Wahrscheinlichkeit die geringste Wahrscheinlichkeit (mit willkürlichen Auswahlmöglichkeiten für Bindungen) zu erzielen, indem Raum-Sublinearität in der Ausgabegröße verwendet wird?
Nehmen wir zum Beispiel . Der wahrscheinlichste Vektor ist ( 1 , 0 , 1 ) und der am wenigsten wahrscheinliche ist { 0 , 1 , 0 } .
Für sehr kleine könnten wir jeden der 2 n Vektoren mit seiner Wahrscheinlichkeit bezeichnen und einfach sortieren, aber dies würde natürlich immer noch keinen sublinearen Raum verwenden.
Eine enge Variante dieser Frage wurde zuvor unter /cs/24123/how-to-iterate-over-vectors-in-order-of-probability gestellt .
quelle
Antworten:
Das Folgende gibt einen Algorithmus an, der ungefähr Zeit und 2 n / 2 Raum verwendet.2n 2n/2
Betrachten wir zunächst das Problem des Sortierens der Summen aller Teilmengen von Elementen.n
Betrachten Sie dieses Unterproblem: Sie haben zwei sortierte Listen mit der Länge und möchten eine sortierte Liste der paarweisen Summen der Zahlen in den Listen erstellen. Sie möchten dies in ungefähr 0 ( m 2 ) Zeit (der Ausgabegröße), aber im sublinearen Raum tun . Wir können O ( m ) Raum erreichen. Wir führen eine Prioritätswarteschlange und ziehen die Summen in aufsteigender Reihenfolge aus der Prioritätswarteschlange heraus.m O(m2) O(m)
Die Listen seien und b 1 … b m , in aufsteigender Reihenfolge sortiert. Wir nehmen die m Summen a i + b 1 , i = 1 … m und stellen sie in eine Prioritätswarteschlange.a1…am b1…bm m ai+b1 i=1…m
Wenn wir nun die kleinste verbleibende Summe aus der Prioritätswarteschlange ziehen, setzen wir , wenn j < m , die Summe a i + b j + 1 in die Prioritätswarteschlange. Der Raum wird von der Prioritätswarteschlange dominiert, die immer höchstens m Summen enthält. Und die Zeit ist O ( m 2 log m ) , da wir O ( log m ) für jede Prioritätswarteschlangenoperation verwenden. Dies zeigt, dass wir das Teilproblem in O ( m 2 lösen könnenai+bj j<m ai+bj+1 m O(m2logm) O(logm) Zeit und O ( m ) Raum.O(m2logm) O(m)
Um nun die Summen aller Teilmengen von Zahlen zu sortieren , verwenden wir einfach diese Unterroutine, bei der die Liste a i die Menge von Teilmengen der ersten Hälfte der Elemente ist und die Liste b i die Menge von Teilmengen ist der zweiten Hälfte der Artikel. Wir können diese Listen mit demselben Algorithmus rekursiv finden.n ai bi
Wir werden nun das ursprüngliche Problem betrachten. Sei der Satz von Koordinaten, die 0 sind , und S 1 der Satz von Koordinaten, die 1 sind . Dann ∏ i ∈ S 0 p ( v i = 0 ) ∏ i ∈ S 1 p ( v i = 1 )S0 0 S1 1
Das Sortieren dieser Zahlen ist dasselbe wie das Sortieren der Zahlen , daher haben wir das Problem auf das Sortieren der Summen von Teilmengen von n Elementen reduziert .∑i∈S1logp(vi=1)−logp(vi=0) n
quelle
Wir können das im Raum (wenn uns die Laufzeit egal ist).O(n)
(Wir sollten uns auch um mögliche Bindungen kümmern, aber das ist nicht schwierig.)
quelle
Bearbeiten: Diese Antwort ist falsch. Siehe Kommentare für Details. ~ Gandaliter
Linear im Ausgabemittel . Ich denke, der offensichtliche Algorithmus verwendet nur den O ( n ) Raum, abgesehen von der Ausgabe selbst natürlich.O(2n) O(n)
Nimm die Liste mit den Paaren und sortieren Sie sie nach | 0,5 - p i | größte zuerst.(i,pi) |0.5−pi|
Definieren Sie eine doppelt rekursive Funktion, die eine Liste solcher Paare und einen teilweise gefüllten Vektor aufnimmt und den Wert von v i auf 1 setzt, wenn p i > 0,5 ist , undv vi 1 pi>0.5 andernfalls auf 0 , und rekursiv (unter Verwendung des Endes der Liste und v ) , kippt dann v i und rekursiert erneut. Wenn die Liste leer ist, wird stattdessen v ausgegeben.0 v vi v
Rufen Sie diese rekursive Funktion für die sortierte Liste und einen leeren Vektor auf.
Die Intuition ist, dass Sie die Werte der sichersten Elemente im Vektor zuerst festlegen (diejenigen, deren Wahrscheinlichkeiten am nächsten bei und 1 liegen ) und den Vektor auf diese Weise ausfüllen und mit denen abschließen, deren Wahrscheinlichkeiten am nächsten bei 0,5 liegen . Jeder mögliche Wert, den der gesamte Vektor annehmen könnte, wird in der Reihenfolge seiner Wahrscheinlichkeit ausgegeben.0 1 0.5
Die Laufzeit ist . Dies ist die Untergrenze, da dies die Länge der Ausgabe ist. Die Raumkomplexität ist O ( n ), weil die Sortierung nicht mehr als das erfordert, und die rekursive Länge ist die Länge des Vektors, die n ist . Ich glaube, dass dies auch die Untergrenze ist, da es für jeden Zeitschritt beim Ausführen des Algorithmus einen anderen Speicherzustand geben muss und die Zeitkomplexität O ( 2 n ) ist .O(2n) O(n) n O(2n) -Zustände im Speicher sind erforderlich, um O ( 2 n ) aufzulisten.O(n) O(2n) Zeitschritte. Daher ist dieser Algorithmus im ungünstigsten Fall für die Komplexität optimal.
quelle