mirror of
https://github.com/Steffo99/appunti-magistrali.git
synced 2024-11-24 19:24:19 +00:00
50 lines
1.9 KiB
Markdown
50 lines
1.9 KiB
Markdown
|
# Dizionario
|
||
|
|
||
|
Un _dizionario_ è una struttura dati che **associa dei valori a delle chiavi**.
|
||
|
|
||
|
## Proprietà
|
||
|
|
||
|
- Ogni elemento del dizionario è un **valore** che è stato **associato a una chiave**.
|
||
|
- Possiamo aggiungere nuovi elementi con il **metodo `add(chiave, valore)`**.
|
||
|
- Posiamo estrarre elementi con il **metodo `get(chiave)`**, che restituirà il valore associato a `chiave`.
|
||
|
- E' possibile rimuovere elementi con il **metodo `delete(chiave)`**.
|
||
|
- Due elementi con **chiavi diverse** non devono **mai restituire lo stesso valore**.
|
||
|
|
||
|
## Metodi
|
||
|
|
||
|
Beh... Non ha molto senso in questo caso...
|
||
|
|
||
|
```python
|
||
|
dict()
|
||
|
```
|
||
|
|
||
|
## Implementazione con tabella hash
|
||
|
|
||
|
Una _tabella hash_ è un'array di coppie **chiave-valore**, che formano l'insieme _universo_.
|
||
|
|
||
|
Per determinare l'**indice dell'array** in cui inserire una coppia, usiamo una [funzione _hash_](https://it.wikipedia.org/wiki/Hash#Algoritmo_di_hash) sulla chiave, che restituirà **numeri da `0` a `len(hash_table)`**.
|
||
|
|
||
|
### Risoluzione collisioni
|
||
|
|
||
|
Potrebbe capitare però che **due chiavi diverse abbiano lo stesso indice**. Dobbiamo allora usare un metodo di _risoluzione collisioni_, che mi permetta di distinguere tra chiavi diverse.
|
||
|
|
||
|
#### Lista di trabocco
|
||
|
|
||
|
Possiamo salvare nell'array **liste di coppie** chiave-valore; in caso di collisione, **aggiungo un nuovo elemento alla lista**.
|
||
|
|
||
|
In media, ciascuna di queste liste conterrà `elementi_inseriti / dimensione_tabella` elementi.
|
||
|
|
||
|
#### Indirizzamento aperto
|
||
|
|
||
|
Possiamo decidere di mettere le coppie che non trovano posto nel loro indice in **un altro indirizzo vuoto** dell'array.
|
||
|
|
||
|
Ci sono diversi modi in cui decidere il nuovo indirizzo, ognuno con vantaggi e svantaggi: si può scegliere quello successivo, oppure il primo vuoto dell'array, oppure un indirizzo casuale.
|
||
|
|
||
|
> Python, nei `dict`, usa indirizzamento aperto pseudorandom.
|
||
|
|
||
|
### Costo computazionale
|
||
|
|
||
|
- Aggiungere una chiave: `O(n)`
|
||
|
- Trovare una chiave: `O(n)`
|
||
|
- Eliminare una chiave: `O(n)`
|