Come un max-heap e un min-heap, voglio implementare un heap mediano per tenere traccia della mediana di un dato insieme di numeri interi. L'API dovrebbe avere le seguenti tre funzioni:Come implementare un heap mediano
insert(int) // should take O(logN)
int median() // will be the topmost element of the heap. O(1)
int delmedian() // should take O(logN)
voglio usare un array (a) attuazione per attuare mucchio dove i figli di indice di matrice k sono memorizzati negli indici di matrice 2 * k e 2 * k + 1. Per comodità, la matrice inizia a popolare gli elementi dall'indice 1. Questo è quello che ho finora: L'heap mediano avrà due numeri interi per tenere traccia del numero di numeri interi inseriti che sono> mediana corrente (gcm) e < mediana corrente (lcm).
if abs(gcm-lcm) >= 2 and gcm > lcm we need to swap a[1] with one of its children.
The child chosen should be greater than a[1]. If both are greater,
choose the smaller of two.
Analogamente per l'altro caso. Non riesco a trovare un algoritmo su come affondare e nuotare elementi. Penso che dovrebbe prendere in considerazione quanto vicino il numero è per la mediana, in modo da qualcosa come:
private void swim(int k) {
while (k > 1 && absless(k, k/2)) {
exch(k, k/2);
k = k/2;
}
}
io non posso venire con l'intera soluzione però.
Questo otterrà difficile senza un limite alla molteplicità di ogni valore dato. – greybeard