Mediana de flujo continuo de números – (usando Set)

Dado que los enteros se leen de un flujo de datos. Encuentre la mediana de todos los elementos leídos hasta ahora a partir del primer entero hasta el último entero. Esto también se llama Mediana de enteros móviles.
El enlace dado ya contiene la solución de este problema usando Priority Queue .
Sin embargo, la siguiente solución utiliza el mismo concepto, pero la implementación se realiza mediante el uso de conjuntos.
En esta solución, imprimiremos la mediana más pequeña en caso de longitud uniforme en lugar de tomar su promedio.

Ejemplos:

Entrada: arr[] = {-10, 14, 11, -5, 7}
Salida: -10 -10 11 -5 7

Entrada: arr[] = {2, -5, 14}
Salida: 2 -5 2

Acercarse:

  • Cree dos conjuntos múltiples g en orden ascendente que almacenarán la mitad superior y s en orden descendente para almacenar la mitad inferior de la array arr[] .
  • Inserte el primer elemento en s . E inicializa la mediana con este valor.
  • Para cualquier otro elemento de la array x . Consulta las tallas de ambos conjuntos:
    • Cuando tamaño(s) > tamaño(g) : si x > mediana , inserte el primer elemento de s en g y elimine ese elemento de s , inserte x en s . De lo contrario, inserte x en g .
    • Cuando tamaño(s) < tamaño(g) : Si x < mediana , inserte el primer elemento de g en s y elimine ese elemento de g , inserte x en g . De lo contrario, inserte x en s .
    • Cuando talla(s) = talla(g) : Si x > mediana . Inserta x en s . De lo contrario, inserte x en g .

A continuación se muestra la implementación del enfoque anterior:

// C++ program to find running median for 
// a stream of integers using Set
#include <bits/stdc++.h>
using namespace std;
  
// Function to print the running median 
// for the array arr[]
void printRunningMedian(int arr[], int n)
{
    // Multiset is used to handle duplicates
    // Multiset g for storing upper half 
    // (ascending order)
    // The first element will be the smallest)
    multiset<int> g;
  
    // Multiset s for storing lower half 
    // (descending order). The first element 
    // will be the largest
    multiset<int, greater<int> > s;
  
    s.insert(arr[0]);
  
    // Initialise median with the first element
    int med = arr[0];
    printf("%d ", med);
  
    for (int i = 1; i < n; i++) {
  
        // Only add elements to upper half if 
        // its size less then the size of the
        // lower half (maintain only difference
        // of 1)
        if (s.size() > g.size()) {
            if (arr[i] < med) {
                int temp = *s.begin();
                s.erase(s.begin());
                g.insert(temp);
                s.insert(arr[i]);
            }
            else
                g.insert(arr[i]);
  
            med = *s.begin() > *g.begin() ?
                   *g.begin() : *s.begin();
        }
  
        // Only add elements to lower half if 
        // it's size less then the size of the 
        // upper half (maintain only difference
        // of 1)
        else if (s.size() < g.size()) {
            if (arr[i] > med) {
                int temp = *g.begin();
                g.erase(g.begin());
                s.insert(temp);
                g.insert(arr[i]);
            }
            else
                s.insert(arr[i]);
  
            med = *s.begin() > *g.begin() ? 
                   *g.begin() : *s.begin();
        }
  
        // If sizes are same
        else {
            if (arr[i] > med) {
                g.insert(arr[i]);
                med = *g.begin();
            }
            else {
                s.insert(arr[i]);
                med = *s.begin();
            }
        }
  
        printf("%d ", med);
    }
  
    printf("\n");
}
  
// Driver code
int main()
{
    int arr[] = { -10, 14, 11, -5, 7 };
    int n = sizeof(arr) / sizeof(arr[0]);
    printRunningMedian(arr, n);
    return 0;
}
Producción:

-10 -10 11 -5 7

Publicación traducida automáticamente

Artículo escrito por Praveen Sinha y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *