Chiarimenti su Heap e PriorityQueue

di il
2 risposte

Chiarimenti su Heap e PriorityQueue

Salve! Sto cercando di implementare in Java una min priority queue usando un Heap ma ho un po' di confusione mentale.

A quanto ho capito, una priority queue è una struttura dati che serve a mantenere un insieme di elementi ciascuno con un valore associato (Key).
Per implementare una min priority queue usando un Heap non mi è ben chiaro come dichiarare le varie cose, mi spiego meglio; un heap è un array che può essere visto come un albero binario - no? E tale array per rappresentare un heap deve avere lunghezza dell'array ed elementi dell'heap memorizzati nell'array - giusto?

Mi chiedo quindi, nella mia classe devo per esempio dichiarare un ArrayList (che sarà il mio heap) e due variabili int per salvarmi le due lunghezze? E fatto ciò, nella stessa classe, faccio un costruttore che rappresenta la mia priority queue - usando dentro le due lunghezze dichiarate precedentemente e un ArrayList che rappresenta l'heap chiamando successivamente Heapify per far rispettare l'invariante di MIN priority queue?

cerco di scrivere una bozza di codice per spiegarmi leggermente meglio:
public class PriorityQueue{

  private int heapSize = 0;
  private int heapCapacity = 0;


  private ArrayList<T> heap = null;

  public Heap(ArrayList<T> arList) {

    heapSize = arList.size();
    heapCapacity = arList.size();
    heap = new ArrayList<T>(heapCapacity);
    
    // qualcosa per riempire l'heap

    // Heapify
    
  }

}
In oltre volevo chiedere, è possibile utilizzare Comparator di Java per facilitare in qualche modo gli ordinamenti?
Spero di essere stato chiaro nelle spiegazioni vi ringrazio in anticipo!

2 Risposte

  • Re: Chiarimenti su Heap e PriorityQueue

    NoProg ha scritto:


    A quanto ho capito, una priority queue è una struttura dati che serve a mantenere un insieme di elementi ciascuno con un valore associato (Key).
    Una priority-queue innanzitutto è una "coda", ovvero il classico (idealmente) "tubo" in cui si inserisce solo da un lato e si estrae solo dall'altro lato.
    La differenza rispetto ad una coda "normale" è che mentre una coda normale è puramente FIFO (il primo dato inserito sarà sicuramente il primo ad uscire), nella coda "a priorità" entra in gioco il concetto di priorità tra i valori, per cui i valori non sono accodati in modalità FIFO ma sono accodati e mantenuti ordinati secondo la priorità.
    La priorità viene specificata tramite un qualche "criterio di comparazione", che tipicamente si basa su una (o più) qualche proprietà dei valori (per oggetti di una classe Persona potrebbe essere es. per l'età).

    NoProg ha scritto:


    un heap è un array che può essere visto come un albero binario - no?
    Un Heap è concettualmente una forma specializzata di "albero binario". Poi ci può essere un "min heap" oppure un "max heap".
    E un heap può anche essere implementato tramite un array/lista (insomma con una sequenza di valori indirizzati per indice).

    NoProg ha scritto:


    In oltre volevo chiedere, è possibile utilizzare Comparator di Java per facilitare in qualche modo gli ordinamenti?
    Certo, puoi benissimo fare in modo che il tuo priority-queue sia codificato per delegare la comparazione ad un Comparator esplicito che dovrà essere passato al priority-queue all'atto della costruzione (da costruttore, e chiaramente il criterio non dovrà più cambiare).
  • Re: Chiarimenti su Heap e PriorityQueue

    andbin ha scritto:


    NoProg ha scritto:


    A quanto ho capito, una priority queue è una struttura dati che serve a mantenere un insieme di elementi ciascuno con un valore associato (Key).
    Una priority-queue innanzitutto è una "coda", ovvero il classico (idealmente) "tubo" in cui si inserisce solo da un lato e si estrae solo dall'altro lato.
    La differenza rispetto ad una coda "normale" è che mentre una coda normale è puramente FIFO (il primo dato inserito sarà sicuramente il primo ad uscire), nella coda "a priorità" entra in gioco il concetto di priorità tra i valori, per cui i valori non sono accodati in modalità FIFO ma sono accodati e mantenuti ordinati secondo la priorità.
    La priorità viene specificata tramite un qualche "criterio di comparazione", che tipicamente si basa su una (o più) qualche proprietà dei valori (per oggetti di una classe Persona potrebbe essere es. per l'età).

    NoProg ha scritto:


    un heap è un array che può essere visto come un albero binario - no?
    Un Heap è concettualmente una forma specializzata di "albero binario". Poi ci può essere un "min heap" oppure un "max heap".
    E un heap può anche essere implementato tramite un array/lista (insomma con una sequenza di valori indirizzati per indice).

    NoProg ha scritto:


    In oltre volevo chiedere, è possibile utilizzare Comparator di Java per facilitare in qualche modo gli ordinamenti?
    Certo, puoi benissimo fare in modo che il tuo priority-queue sia codificato per delegare la comparazione ad un Comparator esplicito che dovrà essere passato al priority-queue all'atto della costruzione (da costruttore, e chiaramente il criterio non dovrà più cambiare).
    Ok grazie, per quanto riguarda la creazione - a livello di codice, va più o meno bene quella che ho messo nel primo post?
Devi accedere o registrarti per scrivere nel forum
2 risposte