Mediana del flujo de datos (Java)

Mediana del flujo de datos (Java)

Descripción del tema
¿Cómo obtener la mediana en un flujo de datos? Si se lee un número impar de valores de la secuencia de datos, la mediana es el valor en el medio después de que se ordenan todos los valores. Si se lee un número par de valores del flujo de datos, entonces la mediana es el promedio de los dos números del medio después de que se ordenan todos los valores. Utilizamos el método Insert () de la lectura de flujos de datos utilizando el método GetMedian () para obtener los datos de la mediana actuales leen
códigos:

import java.util.PriorityQueue;

/**
 * @desc 数据流中的中位数
 * @author zhaoliang
 * @date 20200412
 */
public class Main41 {
    //中位数的左区间,大顶堆
    private PriorityQueue<Integer> queue1 = new PriorityQueue<>(((o1,o2) -> (o2 - o1)));
    //中位数的右区间,小顶堆
    private PriorityQueue<Integer> queue2 = new PriorityQueue<>();
    //数据流中的个数
    private int sum = 0;

    public void Insert(Integer num) {
        if(sum % 2== 0){
            //当两个堆的元素个数一样的时候此时新增一个元素,我是放入大顶堆(左区间)
            queue1.add(num);
        }else {
            queue2.add(num);
        }
        if (!queue2.isEmpty() && queue1.peek() > queue2.peek()){

            int temp1 = queue1.poll();
            int temp2 = queue2.poll();

            queue1.add(temp2);
            queue2.add(temp1);
        }
        sum++;
    }

    public Double GetMedian() {
        if ( sum % 2 == 1){
            return  (double) queue1.peek();
        }else {
            return (queue1.peek() + queue2.peek())/2.0;
        }
    }
}
Publicado 71 artículos originales · gustó 0 · visitas 881

Supongo que te gusta

Origin blog.csdn.net/sinat_40968110/article/details/105464801
Recomendado
Clasificación