2023-11-05 04:15:02 +00:00
[[algoritmo]] di [[spanning tree construction]].
2023-12-19 01:19:27 +00:00
## [[comportamento]]
2023-11-08 18:28:09 +00:00
2023-11-05 04:15:02 +00:00
> [!Summary]
> Le [[entità]] del grafo vengono visitate sequenzialmente attraverso una [[depth-first search]].
>
> In ogni momento, a solo una [[entità]] è permesso eseguire codice, e questo permesso è tracciato attraverso un [[token metaforico]].
2023-11-08 18:28:09 +00:00
Il [[leader]] viene inizializzato a `LEADER` , le altre [[entità]] vengono inizializzate a `IDLE` .
2023-11-05 04:15:02 +00:00
### `LEADER`
2023-11-08 18:28:09 +00:00
Inizia possedendo il [[token metaforico]].
Inizia la visita inviando il [[token metaforico|token]] al primo [[vicini di un'entità|vicino]] non visitato con il tag `Forward` , diventando `VISITED` .
2023-11-05 04:15:02 +00:00
### `IDLE`
2023-11-08 18:28:09 +00:00
In attesa di ricevere il [[token metaforico]].
Quando riceve il token `Forward` :
1. memorizza il mittente come genitore;
2. procede con la visita inviando il [[token metaforico|token]] al primo suo [[vicini di un'entità|vicino]] non visitato con il tag `Forward` ;
3. diventa `VISITED` .
2023-11-05 04:15:02 +00:00
### `VISITED`
2023-11-08 18:28:09 +00:00
Ha già ricevuto il [[token metaforico]] in precedenza.
2023-11-05 04:15:02 +00:00
2023-11-08 18:28:09 +00:00
Se lo riceve con il tag `Forward` , lo rimanda al mittente con il tag `AlreadyVisited` .
Se lo riceve con il tag `AlreadyVisited` , invia il [[token metaforico|token]] al prossimo [[vicini di un'entità|vicino]] non visitato con il tag `Forward` .
2023-11-05 04:15:02 +00:00
2023-11-08 18:28:09 +00:00
Se lo riceve con il tag `Backward` , aggiunge all'[[albero]] il mittente, e poi invia il [[token metaforico|token]] al prossimo [[vicini di un'entità|vicino]] non visitato con il tag `Forward` .
Se riceve nuovamente il [[token metaforico|token]], e non ha altri vicini da visitare, restituisce il [[token metaforico|token]] al genitore, poi diventa `DONE` .
### `DONE`
2023-11-05 04:15:02 +00:00
Non fa nient'altro.
## [[algoritmo corretto|Correttezza]]
2023-11-08 18:28:09 +00:00
> [!Success]
>
> Dato che:
> 1. Tutte le [[entità]] tranne il [[leader]] inviano `Finished` una sola volta.
> 2. Un `Forward` e un `Backward` [[arco di un grafo|collegano]] le due [[entità]] coinvolte.
>
> Allora, il [[grafo]] risultante è un [[albero]] [[grafo connesso|connesso]].
2023-11-05 04:15:02 +00:00
## [[costo computazionale distribuito|Costo computazionale]]
2023-11-08 18:28:09 +00:00
| Costo | [[notazione O-grande]] |
|-|-|
| [[comunicazione]] | $O(Channels)$ |
2023-12-19 01:19:27 +00:00
| [[9 - Algoritmi distribuiti/1 - Problemi algoritmici/tempo]] | $O(Channels)$ |
2023-11-08 18:28:09 +00:00
2023-12-19 01:19:27 +00:00
### [[comunicazione]]
2023-11-05 04:15:02 +00:00
Tutti i [[canale di comunicazione|canali]] vengono visitati due volte, uno da `Token::Forward` , e uno da `Token::BackEdge` o `Token::Finished` :
$$
2 \cdot Channels
$$
In [[notazione asintotica]], è:
$$
\Large O(Channels)
$$
2023-12-19 01:19:27 +00:00
### [[9 - Algoritmi distribuiti/1 - Problemi algoritmici/tempo]]
2023-11-05 04:15:02 +00:00
Essendo la visita del grafo sequenziale, il tempo richiesto coincide con il costo di comunicazione:
$$
2 \cdot Channels
$$
In [[notazione asintotica]], è:
$$
\Large O(Channels)
$$