Comment mettre en œuvre une Médiane de tas

Comme une Max-heap et Min-tas, je veux mettre en œuvre une Médiane de tas de garder une trace de la médiane d'un ensemble donné de nombres entiers. L'API doit avoir les trois fonctions suivantes:

insert(int)  //should take O(logN)
int median() //will be the topmost element of the heap. O(1)
int delmedian() //should take O(logN)

Je veux utiliser un tableau (a) mise en œuvre pour mettre en œuvre le tas où les enfants d'index de tableau k sont stockés dans des index de tableau 2*k et 2*k + 1. Pour plus de commodité, le tableau commence à peupler éléments de l'index 1.
C'est ce que j'ai à ce jour:
La Médiane de tas disposera de deux entiers de garder une trace du nombre d'entiers inséré jusqu'à présent qui sont > médiane actuelle (gcm) et < médiane actuelle (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.

De même pour les autres cas. Je ne peux pas venir avec un algorithme pour la façon de l'évier et de nager éléments. Je pense qu'il devrait prendre en considération le degré de fermer le nombre est à la médiane, donc quelque chose comme:

private void swim(int k) {
    while (k > 1 && absless(k, k/2)) {   
        exch(k, k/2);
        k = k/2;
    }
}

Je ne peux pas venir avec la solution complète bien.

  • Ce sera difficile, sans une limite à la multiplicité de toute valeur donnée.
InformationsquelleAutor Bruce | 2013-03-10