J'ai un tableau trié, et je veux trouver efficacement la plus longue sous-séquence contiguë du début à la fin de manière à ce que array[begin]>=array[end] div 2
.
La solution évidente est (O^(n^2) ), mais existe-t-il quelque chose de mieux ?
J'ai un tableau trié, et je veux trouver efficacement la plus longue sous-séquence contiguë du début à la fin de manière à ce que array[begin]>=array[end] div 2
.
La solution évidente est (O^(n^2) ), mais existe-t-il quelque chose de mieux ?
Cela peut être fait en temps linéaire. Commençons par le quadratique :
i
j
à la position de l'indice i+1
a[j]/2 <= a[i]
, l'incrément ji
.Le piège est de réaliser que si vous échouez à l'étape 3 pour une paire (i, j)
alors cela signifie :
for every i < k < j, a[k] <= a[i]/2
a[j] > a[i]/2
Ainsi, à l'étape 5, en passant à n'importe quel k
plus petit que j
conduira à un score plus faible, car a[j] > a[i]/2 > a[k]/2
. Ainsi, l'indice suivant pour commencer est j
.
A présent, nous visitons un index au maximum une fois lors du calcul d'un score. Ce qui réduit cette étape de O(n^2)
à O(n)
. Ensuite, le choix de l'indice avec le score maximum est évidemment O(n)
.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.