Algoritmo de tiempo lineal para encontrar max desplazado

11

Suponga que se nos da una matriz A[1..n] contiene enteros no negativos (no necesariamente distintos).

BA

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

La solución obvia es ordenar A y luego calcular m . Esto proporciona un algoritmo que se ejecuta en el tiempo O(nlgn) en el peor de los casos.

¿Es posible hacerlo mejor? ¿Podemos calcular m en tiempo lineal?


Mi pregunta principal es la de arriba. Pero sería interesante saber acerca de la siguiente generalización del problema.

Deje que B sea A ordenados según alguna comparación Oracle y f una función dada por un oráculo. Dados A y oráculos para y f , ¿qué podemos decir sobre el tiempo necesario para calcular m=maxi[n]f(B[i],i) ?

Todavía podemos calcular m en tiempo O(nlgn) . Pero, ¿podemos demostrar un límite inferior superlineal para este caso generalizado?

Si la respuesta es sí, ¿se mantiene el límite inferior si suponemos que es el orden habitual en los enteros es una función "agradable" (monótono, polinomial, lineal, etc.)?ff

Kaveh
fuente

Respuestas:

10

Podemos calcular en tiempo lineal.m

Para simplificar, suponga que las matrices están basadas en 0: , . Queremos calcular .B [ 0 .. n - 1 ] m = max i B [ i ] + iA[0..n1]B[0..n1]m=maxiB[i]+i

Deje . Obviamente .m a x mmax=maxiA[i]maxm

Deje ser después de ordenar. Si tenemos 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.

Por lo tanto, podemos ignorar cuando . Solo necesitamos considerar los números en el rango .A [ j ] m a x - n [ m a x - n , m a x ]A[j]A[j]maxn[maxn,max]

Podemos usar el orden de conteo para ordenar los números en que están en el rango en tiempo lineal y usar la lista ordenada para calcular .[ m a x - n , m a x ] mA[maxn,max]m

Marzio De Biasi
fuente
... mmm ... pero ¿cuál es el costo de C [x] = C [x] +1?!?
Marzio De Biasi
1
¿hay algún problema con tu respuesta? porque me parece bien: estás diciendo que solo nos importan los elementos de matriz con valores en , por lo que podemos usar el orden de conteo. Esto funciona para el problema general siempre que para todo . [Mn,M]|f(B[i],i)B[i]|=O(n)i
Sasho Nikolov
Gracias @Marzio. :) Edité ligeramente su respuesta para mayor claridad. Siéntase libre de revertir mi edición o editar más.
Kaveh
1
Esta solución parece funcionar también para cualquier donde para todos e , . f(x,i)xin|f(x,i)x|=O(n)
Kaveh
@Kaveh: editar está bien! Escribí la respuesta rápidamente y ni siquiera estaba seguro de su corrección: -S
Marzio De Biasi
-1

Si la matriz consta de enteros distintos, entonces , ya que la distancia entre las entradas adyacentes en es al menos ; la situación es más interesante cuando no necesitan ser distintos.Am=max(A)+1B1

Para su pregunta más general, imagine una situación en la que solo es "interesante" cuando . Parece posible construir un argumento adverso que lo obligue a consultar para todo antes de que pueda saber , por lo tanto, necesita ordenar para encuentre la respuesta, que toma comparaciones de . (Hay algunas complicaciones ya que podría ser el caso de que podamos probar si en tiempo constante en lugar de lineal al consultar .) Este es el caso incluso si es un polinomio (de alto grado).f(B[i],j)i=jf(B[i],i)imaxif(B[i],i)AΩ(nlogn)A[i]=B[j]f(A[i],j)f

Yuval Filmus
fuente
1
¿Qué pasa si A tiene n - 1 ceros y uno solo? Entonces la respuesta es n, no 1.
Grigory Yaroslavtsev
Hola yuval No se puede números repetidos en . Como dijo Grigory, la solución no parece funcionar. A
Kaveh
Creo que veo su idea para el argumento de límite inferior: dado podemos calcular rápidamente usando los pares de consulta hechos a por un algoritmo que resuelve el problema en el tiempo . Podemos asegurarnos de que el algoritmo consulta en todos pero no podemos asegurarnos de que no consulte a otros pares. Sin embargo, podemos establecer para que otros pares sean un valor distinguible para que podamos descartar esos pares. B f o ( n lg n )ABfo(nlgn)( B [ i ] , i ) ff(B[i],i)f
Kaveh