Commençons par l'observation suivante:
Soit le maximum de la séquence , et désigne son minimum. Si , choisir est optimal.maxa1,...,anmina1=maxb1=b2=...=bn=⌊(max+min)/2⌋
pourquoi est-ce le cas? Eh bien, puisque la séquence commence par le maximum, soit nous choisissons grand, et nous subissons une grande déviation par rapport au minimum de la séquence (puisque tout ultérieur doit être supérieur ou égal à b_1 ), soit nous choisissons b_1 petit et souffrons de la écart à max . La moyenne minimise l'écart maximal.b i b 1 b 1 m a xb1bib1b1max
On peut maintenant essayer de généraliser cette observation pour l'utiliser sur les séquences générales a1,...,an . Par exemple, nous pouvons partitionner n'importe quelle séquence en sous-séquences, de telle sorte que chacune commence par le maximum de la sous-séquence respective.
Exemple: est divisé en , et .( 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)
Compte tenu de ce partitionnement, nous pouvons maintenant résoudre chacune de ces sous-séquences séparément, et obtenir une affectation des , ce qui pourrait cependant violer la condition non décroissante. Cela peut être corrigé sans perdre l'optimalité.bi
Observez que la dernière sous-séquence contient toujours le maximum de la séquence entière (sinon, il y aurait une autre sous-séquence après). Soit les valeurs que nous avons attribuées aux séquences. Maintenant, pour atteindre la non-diminution dans , nous partons de l'arrière à et nous nous dirigeons vers l'avant. Si est plus grand que , nous mettons simplement . S'il est plus petit, nous le conservons. Ensuite, nous procédons à la comparaison de avec et ainsi de suite. Notez que l'abaissement de tout à la valeur demaxw1,w2,...,wkkw1,...,wkwkwk−1wkwk−1:=wkwk−2wk−1wiwi+1n'augmente jamais l'écart, car la valeur maximale dans la sous-séquence affectée avec est toujours inférieure au maximum dans la sous-séquence affectée avec .wiwi+1
Cet algorithme devrait être correct, je pense. Concernant le temps d'exécution, l'étape clé est le calcul des maxima croissants pour les sous-séquences, ce qui est possible dans ? Je ne sais pas où contribue.O(n)l
Je pense que cela devrait être faisable en O (n).
Prenons le problème similaire: étant donné , 1 ≤ i ≤ n et d ≥ 0, trouver b i dans un ordre non décroissant tel que | a i - b i | ≤ d pour tout i, ou montrer que ce n'est pas possible. Cela peut être fait dans O (n), et en utilisant la recherche binaire, le problème d'origine est résolu dans O (n log l).ai bi |ai−bi|≤d
Maintenant, s'il y a i ≤ j tel que a_i - a_j> 2d, alors il n'y a pas de solution (car ).bi≥ai−d,bj≤aj+d<ai−2d+d=ai−d≤bi
Mais si a_i - a_j ≤ 2d pour tout i ≤ j, je pense qu'une solution sera toujours trouvée. Il nous suffit donc de trouver m = max (a_i - a_j) pour tout i ≤ j, et de choisir d = étage ((m + 1) / 2). Ce maximum peut être trouvé dans O (n).
la source