Beginnen wir mit folgender Beobachtung:
Sei m a x das Maximum der Folge ein1, . . . , einn und sei m i n das Minimum. Wenn ein1= m a x , ist die Auswahl von b1= b2= . . . = bn= ⌊ ( m a x + m i n ) / 2 ⌋ optimal.
Warum ist das so? Nun, da die Sequenz mit dem Maximum beginnt, wählen wir entweder b1 groß und erleiden eine große Abweichung vom Minimum der Sequenz (da jedes nachfolgende bich größer oder gleich b1 ), oder wir wählen b1 klein und leiden unter Abweichung bis m a x . Der Durchschnitt minimiert die maximale Abweichung.
Wir können nun versuchen, diese Beobachtung auf die allgemeinen Folgen a_1, ..., a_n zu verallgemeinern ein1, . . . , einn. Zum Beispiel können wir jede Sequenz in Teilsequenzen aufteilen, so dass jede mit dem Maximum der jeweiligen Teilsequenz beginnt.
Beispiel: wird in , und .( 2 ) ( 6 , 4 , 1 , 5 , 2 ) ( 8 , 7 , 5 , 1 )( 2 , 6 , 4 , 1 , 5 , 2 , 8 , 7 , 5 , 1 )( 2 )( 6 , 4 , 1 , 5 , 2 )(8,7,5,1)
Angesichts dieser Aufteilung können wir nun jede dieser Teilsequenzen separat lösen und eine Zuweisung der , was jedoch die nicht abnehmende Bedingung verletzen könnte. Dies kann behoben werden, ohne an Optimalität zu verlieren.bi
Beachten Sie, dass die letzte Teilfolge des maximalen enthält immer der gesamten Sequenz (sonst gäbe es eine andere Teilfolge danach). Sei die Werte, die wir den zugewiesen haben . Um nun in eine Nichtverringerung zu erreichen wir bei von hinten und arbeiten uns nach vorne vor. Wenn größer als , setzen wir einfach . Wenn es kleiner ist, behalten wir es. Dann vergleichen wir mit und so weiter. Beachten Sie, dass Sie jedes auf den Wert von senken.w 1 , w 2 , . . . , W k k w 1 , . . . , W k w k w k - 1 w k w k - 1 : = w k w k - 2 w k - 1 w i w i + 1 w i w i + 1maxw1,w2,...,wkkw1,...,wkwkwk−1wkwk−1:=wkwk−2wk−1wiwi+1Erhöht niemals die Abweichung, da der Maximalwert in der mit zugewiesenen immer niedriger ist als der Maximalwert in der mit zugewiesenen Teilfolge .wiwi+1
Dieser Algorithmus sollte meiner Meinung nach korrekt sein. In Bezug auf die Laufzeit besteht der Schlüsselschritt darin, die ansteigenden Maxima für die Teilfolgen zu berechnen, was in . Ich bin mir nicht sicher, wo beitrage.lO(n)l
Ich denke, das sollte in O (n) machbar sein.
Nehmen Sie das ähnliche Problem: Wenn , 1 ≤ i ≤ n und d ≥ 0 sind, finden Sie b i in nicht absteigender Reihenfolge, so dass | a i - b i | ≤ d für alle i, oder zeigen Sie, dass es nicht möglich ist. Dies kann in O (n) erfolgen, und mit der binären Suche wird das ursprüngliche Problem in O (n log l) gelöst.ai bi |ai−bi|≤d
Aber wenn a_i - a_j ≤ 2d für alle i ≤ j, dann denke ich, wird immer eine Lösung gefunden werden. Also müssen wir nur m = max (a_i - a_j) für alle i ≤ j finden und d = floor ((m + 1) / 2) wählen. Dieses Maximum kann in O (n) gefunden werden.
quelle