Algorithme de temps linéaire pour trouver le max décalé


11

Supposons que l'on nous donne un tableau contenant des entiers non négatifs (pas nécessairement distincts).A[1..n]

Soit un trié dans l'ordre non croissant. Nous voulons calculer A m = max i [ n ] B [ i ] + i .BA

m=maxi[n]B[i]+i.

La solution évidente consiste à trier A puis à calculer m . Cela donne un algorithme qui s'exécute dans le temps O(nlgn) dans le pire des cas.

Est-il possible de faire mieux? Peut-on calculer m en temps linéaire?


Ma principale question est celle ci-dessus. Mais il serait intéressant de connaître la généralisation suivante du problème.

Soit B un A trié selon une comparaison oracle et f une fonction donnée par un oracle. Étant donné A et les oracles pour et f , que pouvons-nous dire du temps nécessaire pour calculer m=maxi[n]f(B[i],i) ?

On peut encore calculer m en temps O(nlgn) . Mais peut-on prouver une borne inférieure super-linéaire pour ce cas généralisé?

Si la réponse est oui, la borne inférieure est-elle valable si nous supposons que est l'ordre habituel sur les entiers et est une fonction "agréable" (monotone, polynomiale, linéaire, etc.)?ff

Réponses:


10

Nous pouvons calculer en temps linéaire.m

Pour simplifier, supposons que les tableaux soient basés sur 0: , . Nous voulons calculer .B [ 0 .. n - 1 ] m = max i B [ i ] + iA[0..n1]B[0..n1]m=maxiB[i]+i

Soit . Évidemment .m a x mmax=maxiA[i]maxm

Soit soit après le tri. Si nous avons B [ k ] A [ j ] m a x - n B [ k ] + k B [ k ] + ( n - 1 ) = A [ j ] + ( n - 1 ) ( m a x - n ) + ( n - 1 ) =A[j]B[k]A[j]maxn

B[k]+kB[k]+(n1)=A[j]+(n1)(maxn)+(n1)=max1<maxm.

On peut donc ignorer quand . Il suffit de considérer les nombres dans la plage .A [ j ] m a x - n [ m a x - n , m a x ]A[j]A[j]maxn[maxn,max]

Nous pouvons utiliser le tri par comptage pour trier les nombres dans qui sont dans la plage en temps linéaire et utiliser la liste triée pour calculer .[ m a x - n , m a x ] mA[maxn,max]m


... mmm ... mais quel est le coût de C [x] = C [x] +1?!?
Marzio De Biasi

1
y a-t-il un problème avec votre réponse? car cela me semble bien: vous dites que nous ne nous soucions que des éléments de tableau avec des valeurs dans , donc nous pouvons utiliser le tri par comptage. Cela fonctionne pour le problème général lorsque pour tout . [Mn,M]|f(B[i],i)B[i]|=O(n)i
Sasho Nikolov

Merci @Marzio. :) J'ai légèrement modifié votre réponse pour plus de clarté. N'hésitez pas à annuler ma modification ou à modifier davantage.
Kaveh

1
Cette solution semble fonctionner aussi pour tout où pour tout et , . f(x,i)xin|f(x,i)x|=O(n)
Kaveh

@Kaveh: l'édition est ok! J'ai écrit la réponse rapidement et je n'étais même pas sûr de son exactitude: -S
Marzio De Biasi

-1

Si le tableau est composé d'entiers distincts, alors , car la distance entre les entrées adjacentes dans est d'au moins ; la situation est plus intéressante lorsqu'elles n'ont pas besoin d'être distinctes.Am=max(A)+1B1

Pour votre question plus générale, imaginez une situation dans laquelle n'est "intéressant" que lorsque . Il semble possible de construire un argument adversaire qui vous oblige à interroger pour tout avant de pouvoir connaître , donc vous devez trier afin de trouver la réponse, qui prend des comparaisons . (Il y a quelques complications car il se peut que nous puissions tester si en temps constant plutôt que linéaire en interrogeant .) C'est le cas même si est un polynôme (de haut degré).i = j f ( B [ i ] , i ) i max i f ( B [ i ] , i ) A Ω ( n log n ) A [ i ] = B [ j ] ff(B[i],j)i=jf(B[i],i)imaxif(B[i],i)AΩ(nlogn)A[i]=B[j]f(A[i],j)f


1
Et si A a n - 1 zéros et un seul? Alors la réponse est n, pas 1.
Grigory Yaroslavtsev

Salut Yuval. Il peut y avoir des chiffres répétés dans . Comme l'a dit Grigory, la solution ne semble pas fonctionner. A
Kaveh

Je pense que je vois votre idée pour l'argument de la borne inférieure: étant donné nous pouvons calculer rapidement en utilisant les paires de requêtes faites à par un algorithme résolvant le problème dans le temps . Nous pouvons nous assurer que l'algorithme interroge sur tous mais nous ne pouvons pas nous assurer qu'il ne questionne pas d'autres paires. Cependant, nous pouvons définir pour que les autres paires soient une valeur distincte afin que nous puissions éliminer ces paires. B f fABff ( B [ i ] , i )o(nlgn)f(B[i],i)f
Kaveh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.