Encontrar el número de elementos más pequeños para cada elemento en una matriz de manera eficiente


9

Estoy atrapado en este problema:

Dada una matriz de los primeros números naturales permutados al azar, se construye una matriz , de modo que es el número de elementos de a que son más pequeños que . AnBB(k)A(1)A(k1)A(k)

i) Dado ¿puedes encontrar en tiempo? ii) Dado ¿puedes encontrar en tiempo?ABO(n)
BAO(n)

Aquí, . Para un ejemplo concreto: B(1)=0

|A843172965B000031644|

¿Alguien puede ayudarme? Gracias.


Encontré esto: Calcular codificaciones de permutación que proporciona algoritmos para estos problemas. Al menos creo que son los mismos problemas. O(nlogn)
Realz Slaw

@Merbs, ¿esa pista que diste significa que tienes una solución?
AJed

1
@AJed, significa que tengo un algoritmo, aunque se necesita para el algoritmo simple sin espacio y si se nos permite el espacio. Por el momento, me estoy inclinando hacia que no sea posible en y que ambos sean el mismo algoritmo. O(n2)O(nlogn)O(n)
Merbs

@Merbs. Siento que tu pista puede conducir al camino correcto. También tengo una solución (siguiendo su pista). Supongo que hay un truco en el análisis que lo lleva a . Creo que el truco es saber que va solo de 1: . A nO(n)An
AJed

2
Este documento también proporciona un algoritmo . ¿Estás seguro de que existe un algoritmo para esto? O ( n )O(nlogn)O(n)
Realz Slaw el

Respuestas:


1

El algoritmo ingenuo para determinar de :ABA

Para , determine el valor de comparando cada con para y contando los que satisfacen .B ( k ) A ( i ) A ( k ) i = 1 , , k A ( i ) < A ( k )k=1,,nB(k)A(i)A(k)i=1,,kA(i)<A(k)

Este algoritmo compara con todos los demás ( veces), con otros, etc., por lo que el número total de comparaciones es . Pero eso no es lo mejor que podemos hacer. Por ejemplo, mirando , ¡no tenemos que hacer ninguna comparación! porque son los primeros números naturales, y está garantizado (independientemente de la permutación) que los números naturales más bajos estarán allí. ¿Qué pasa con ? En lugar de verificar a , podríamos simplemente verificar . Es decir:A(1)n1A(2)n2(n1)(n2)2B(n)B(n)=A(n)1 nn1B(n1)A(1)A(n2)A(n)

Para , use el algoritmo anterior; para use el algoritmo inverso: determine configurándolo inicialmente en y luego restando para cada entrada para que es menor que .k=1,,n2k=n2,,nB(k)A(n)11A(i)i=k+1,,nA(k)

Esto llevaría pasos, que sigue siendo . Tenga en cuenta también que al construir partir de , si entonces .2×(n21)(n22)2=(n2)(n4)4O(n2)ABB(n)=A(n)1A(n)=B(n)+1

Pero ahora por más delicadeza. Si se nos permite espacio adicional u ordenar in situ, podemos ordenar los números a medida que los comparamos. Por ejemplo:

|A843172965S987432165B0000316|

En lugar de verificarlos todos (o verificarlos en orden), podríamos usar la búsqueda binaria para determinar cada . Sin embargo, la clasificación todavía lleva tiempo .B(k)O(nlogn)


Esta fue solo mi primera idea; aunque me doy cuenta de que el problema es más interesante de lo que originalmente le di crédito. Y aún no he tenido la oportunidad de leer los hallazgos de Realz Slaw, por lo que el algoritmo puede estar desactivado.
Merbs

0

¡En lugar de determinar cada uno a la vez, podemos mirar hacia adelante y solo revisar cada número en una vez ! Pero usaremos espacio:B(k)A n

|A123456789B800000000104000011112030001222230101123333407011233345320123444561901234445666012344567450123456784|

Podríamos ahorrar aún más tiempo al no actualizar los que ya se han determinado (es decir, no tiene sentido actualizar después del primer paso), pero en el peor de los casos, todavía tenemos que actualizar veces8(n)(n+2)2


0

tanto I como II pueden resolverse usando #next_greater_element que expliqué aquí . pero es un poco más difícil que solo el problema, pero antes de la solución necesitas aprender el siguiente elemento más importante:

  1. consideramos que tenemos un vector para cada elemento de nombre que para el elemento . ahora, una vez ejecutado el siguiente algoritmo mayor, comenzando de derecha a izquierda, pero excepto establecer el elemento en su próximo índice de elemento mayor, presione los elementos que es su próximo elemento mayor. Luego, repita el recorrido de izquierda a derecha y luego donde es el tamaño del vector .y su porque cada uno de los siguientes algoritmos mayores es y también iterar esASiiiASiiB[i]=j=0x(Si[j]+1)xSiΘ(n)Θ(n)Θ(n)

la segunda parte también es similar y señala que podemos obtener el valor del elemento más adecuado en EDIT: mi solución es incorrecta, parece que no tiene ninguna solucióno ( n )O(1)o(n)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.