Cómo calcular la mediana de conjuntos de números dados cuando se cambia el número de elementos en una lista

El método de Anon mencionado anteriormente es bastante simple y directo; solo tiene que mantener una lista ordenada de elementos en todo momento; es decir, inserte el elemento entrante en el lugar correcto y simplemente seleccione la mediana de la lista ordenada (o el promedio de dos números medios).

Por otro lado, si le preocupa la eficiencia, sugeriría el método max-heap min-heap.

La idea clave detrás de este enfoque es mantener dos montones: un montón mínimo y un montón máximo, de modo que todos los elementos menores que la raíz del montón máximo se almacenen en el montón máximo y todos los elementos mayores que la raíz del montón mínimo se almacenan en el montón mínimo. Además, la raíz de min-heap> = raíz de max-heap. Finalmente, asegúrese de que el número de elementos en ambos montones difiera como máximo 1. De esta manera, la raíz del montón con más elementos es siempre la mediana, si # de elementos son iguales, entonces el promedio de los elementos raíz es la mediana .

Algoritmo

  1. Inicialice dos montones: min-heap y max-heap sin elementos
    • Para, cada número entrante ‘n’:
    • Identificar a qué montón debería pertenecer: en función de si el elemento es menor que la raíz del montón máximo o mayor que la raíz del montón mínimo, de lo contrario, los montones están bien
    • Insértelo en el montón relevante, equilibre el montón
    • Vuelva a equilibrar las longitudes del montón: Por lo tanto, si el número de elementos en uno de los montones excede el número de elementos en el otro en más de 1, elimine el elemento raíz de este montón e insértelo en el otro montón y equilibre.
  2. Identifica la mediana mirando las raíces de los árboles. Por. por ejemplo, si la raíz en min-heap = 6, la raíz en max-heap = 5 y el número de elementos en ambos árboles son iguales, entonces mediana = 5.5, de lo contrario si el número de elementos en min-heap> max-heap => mediana = 6.

Ejemplo:
Configuración inicial de montones
A partir del ejemplo que ha considerado, los montones pueden verse así:
Árbol izquierdo = montón máximo, Árbol derecho = montón mínimo


Insertar un elemento en el montón apropiado
Veamos, qué sucede si obtienes un nuevo número, digamos 5:
Claramente, es menor que la raíz de max-heap, por lo que debemos insertarlo allí.
Simplemente agréguelo a la primera hoja disponible en el árbol.


Equilibrio del montón relevante
Ahora, cambie sucesivamente hasta que cada padre sea mayor que sus hijos (en caso de min-montón, la condición se invierte; es decir, cambie hasta que cada padre sea más pequeño que sus hijos)


Encontrar la mediana
Ahora, vemos que la diferencia en # de elementos = 1, max-heap tiene más elementos, por lo tanto, mediana = raíz del max-heap = 6

Complejidad espacio-tiempo
Para el enfoque de almacenamiento dinámico, la inserción y el equilibrio toman O (log n). Buscando la mediana es O (1).

Mientras que, para el método de inserción-clasificación, el punto de inserción se puede encontrar usando la búsqueda binaria que toma O (log n), pero necesitará cambiar todos los datos, lo que le da el peor de los casos de O (n) operaciones

Así es como abordaría la pregunta. Es más fácil si lo dibujas (disculpas por los ejes que están “apagados”, parece que no puedo arreglarlo en mi computadora).

  1. Encuentra la mediana del conjunto de enteros existente. La mediana es el único “número medio” en una distribución. Dado que hay 6 números en este conjunto, todos los cuales son diferentes, no hay un número medio obvio. En este caso, debe promediar los dos números “más medianos”: 6 y 7. La mediana del conjunto original es, por lo tanto, 6.5.

2. Ahora, imagine cada escenario donde agrega un nuevo entero, “n”. “n” puede ser mayor o menor que 6.5. (¡No puede ser igual a 6.5, porque 6.5 no es un entero!)

  • Escenario 1: “n” es menor que 6.5. Independientemente de si “n” es 6, 2 o incluso un número negativo, esto mueve el centro de la distribución hacia los números más bajos (hacia la izquierda si lo está viendo en un gráfico). Como ejemplo, considere “n” = 2:

Como se muestra arriba, ahora hay un número “obvio medio” si cuenta la distribución en ambos lados: hay 3 valores a la “izquierda” de 6 y 3 a la “derecha” de 6. Entonces 6 es una mediana posible cuando agrega un nuevo entero, “n”.

Una advertencia a la forma “izquierda y derecha” de verlo: digamos que “n” fue 6 en su lugar. En forma de lista, sus enteros serían: 3,4,6,6,7,10,12. Una vez más, uno de los 6 está en el medio de la lista, y 6 sería su mediana. Para cualquier número entero menor que 6.5, su mediana en el nuevo conjunto será 6.

  • Escenario 2: “n” es mayor que 6.5. Ahora, la mitad de su distribución se moverá hacia los números más altos (hacia la derecha). Considere “n” = 8:

Nuevamente, ahora hay un número “obvio del medio”, solo que ahora es 7. Entonces 7 es otra posible mediana cuando agrega un nuevo entero, “n”. No importa si su n es 7, 8, 10000000222 o cualquier otro número entero mayor que 6.5: el centro de la distribución seguirá siendo donde tiene 3 números a la izquierda de la mediana y 3 a la derecha de la mediana . Cuando n es mayor que 6.5, la única mediana posible que se ajustará a este criterio es 7.

La respuesta es 6 y 7.

3. En caso de que aún no esté convencido, puede estar seguro de que la mediana no es también 6.5 porque ahora tiene un conjunto de 7 enteros. En un conjunto de 7 enteros, siempre habrá un número medio en una lista ascendente (incluso si la lista fuera “1,1,1,1,1,1,1”). Como este número medio es la mediana, la mediana tiene que ser un número entero.