Binäre Ish-Suche durch teilweise bestellte Set
-
29-09-2020 - |
Frage
Ich habe eine interessante Funktion. Es nimmt Teilmengen von {1, ..., n} bis positive Ganzzahlen, d. H. $ F: P ([N]) \ Rightarrow Z ^ + $ .
Ich weiß, dass, wenn S ein Teilset von S ', $ f (S) ist
Wenn ich wusste, dass die Bestellung perfekt lexikologisch war, würde ich eine einfache binäre Suche verwenden. Das weiß ich nicht, und ich glaube, es ist nicht (z. B. $ f (\ {1,2,3,4,5,6 \}) $ ist möglicherweise größer als $ F (\ {7 \}) $ ). Gibt es einen guten O (N) -Algorithmus, um diese Suche auf dem Poset zu tun? Natürlich muss ich für n der nennenswerten Größe f on-the-fliege berechnen und kann sich nicht auf den lagerung im Speicher verlassen.
Klarstellung nach einer Diskussion in den Kommentaren:
Der jeweilige
Lösung
Hier ist ein einfacher Algorithmus, der in $ O (N ^ 2) $ Zeit und $ O (N) ausgeführt wird $ Speicherplatz, vorausgesetzt, dass $ F (\ ENEPYSET) $ , $ F (\ {1 \}) $ , $ F (\ {2 \}) $ , $ \ cdots $ ,
Die Startidee ist ungefähr das Gleiche wie das, was das OP in seinem Kommentar gegeben hat. "Wir werden nach Subsets der Größe K mit der lexikografischen Reihenfolge suchen, für jeden $ K $ aus $ 0 $ zu $ N $ . Behalten Sie den mit dem besten Wert von $ F $ . "
Das Problem ist dann, wie Sie den besten Wert von $ F $ auf Subsets der Größe $ K $ , benannter $ b_k $ , in $ o (n) $ Zeit. Anstelle von binärer Suche prüfen wir, ob $ N $ , $ n-1 $ , \ CDOTs, $ 1 $ sollte in die beste Teilset nacheinander einbezogen werden, indem er den echten Vorteil der lexikografischen Reihenfolge auf Subsets einnimmt.
- .
- Initialisieren $ b_k= f (\ emesyset) $ . $ \ b_k $ ist der beste Wert auf subsets der größe $ k $ am Ende dieses Vorgangs .
- initialisieren $ count= 0. $ $ \ count $ ist die Anzahl der Elemente, die wir haben bisher in der besten Teilmenge enthalten.
- Check $ F (\ {n \}) $ . Wenn $ b_k + f (\ {n \ \}) + f (\ {1, 2, \ cdoten, k-count -1 \}) \ le z $ ,
$ N $ muss aufgenommen werden. Fügen Sie $ F (\ {n \}) $ auf $ B_K $ und fügen Sie 1 zu $ count $ . - Check $ F (\ {n-1 \}) $ . Wenn $ b_k + f (\ {n-1 \}) + f (\ {1, 2, \ Cdoten, k-count-1 \}) \ le z $ , $ n-1 $ muss einbeziehen. $ F (\ {n-1 \}) $ auf $ B_K $ und fügen Sie 1 zu
$ count $ . - und so weiter.
- , bis wir entweder geprüft haben, $ f (\ {1 \}) $ oder $ count== k $ < / span>.
wir könnten sich wundern, wenn es $ o (n) $ dauert, um jeden $ F (\ {1) zu berechnen , 2, \ cdoten, k-count-1 \}) $ , berechnen Jeder $ B_K $ allein wird $ O (n * n) $ Zeit. Da jedoch $ F $ Additiv ist, können wir alle Präfixsummen von $ F (\ {1 \}) berechnen $ , $ F (\ {2 \}) $ , $ \ cdots $ , < Span-Klasse="Math-Container"> $ F (\ {n \ \}) $ upfront in
Da suche $ b_k $ in $ o (n) $ Time, für jede
Die Beschreibung oben des Algorithmus überspringt den einfachsten Fall, wenn $ f (\ emesyet) \ gt Z $ . In diesem Fall sollte der Algorithmus zurückkehren, dass es keine solche Teilmenge gibt.