1
Fork 0
mirror of https://github.com/Steffo99/unisteffo.git synced 2024-12-01 12:24:19 +00:00
triennale-appunti-steffo/public/materials/year1/algoritmi/20_CodaConPriorità.md

58 lines
2.1 KiB
Markdown
Raw Normal View History

2022-02-03 02:15:39 +00:00
# Coda con priorità
La _coda con priorità_ è una struttura dati dal funzionamento molto simile a quello di una coda, ma invece che restituire il primo elemento inserito, essa restituisce l'**elemento con il valore di priorità minore**.
## Proprietà
- Ogni elemento è una coppia costituita da **valore** e **priorità** (un numero intero).
- Nuovi elementi possono essere aggiunti solo tramite il **metodo `insert()`**
- Gli elementi possono essere estratti solo tramite il **metodo `pop()`**
- Verranno restituiti i valori inseriti secondo la strategia **Lower Priority** (l'elemento con la priorità minore sarà il primo ad essere restituito).
- E' possibile diminuire la priorità di un elemento (e quindi anticipare la sua estrazione)
## Metodi
```python
class PriorityQueue:
def __init__(self): ...
def insert(self, new_elem: Element): ...
def minimum(self) -> Element: ...
def pop(self) -> Element: ...
def decrease_priority_for(self, elem: Element, priority: int): ...
```
## Implementazione con lista
E' possibile implementare la coda con priorità tramite una **lista**: l'inserimento di nuovi valori diventerà molto efficiente, ma tutte le altre operazioni saranno linearmente lente.
### Costo computazionale
- *insert()*: `O(1)`
- *minimum()*: `O(n)`
- *pop()*: `O(n)`
- *decrease_priority_for()*: `O(n)`
## Implementazione con lista ordinata
Implementando la coda con priorità con una **lista ordinata** si avrà un costo di ordinamento elevato negli inserimenti e modifiche alla priorità, ma costi costanti nell'estrazione di un elemento.
### Costo computazionale
- *insert()*: `O(n)`
- *minimum()*: `O(1)`
- *pop()*: `O(1)`
- *decrease_priority_for()*: `O(n)`
## Implementazione con heap
La **soluzione migliore** è quella di implementare la coda con priorità tramite un **heap**: tutti i costi saranno logaritmici, eccetto l'inserimento che sarà costante.
- `insert()` costa `O(1)`
- `minimum()` costa `O(log n)`
- `pop()` costa `O(log n)`
- `decrease_priority_for()` costa `O(log n)`
## Approfondimenti
Esistono code con priorità che restituiscono **l'elemento con priorità maggiore**, invece che quello minore.