* B è il fattore di ramificazione (il numero di possibili scelte in ciascun punto di decisione).
* d è la profondità dell'albero di ricerca (il numero massimo di decisioni che devono essere prese per raggiungere una soluzione).
Spiegazione:
Il backtracking esplora tutte le possibili soluzioni costruendo sistematicamente una soluzione candidata a un passo alla volta. Ad ogni passaggio, controlla se l'attuale candidato è promettente (cioè se potrebbe potenzialmente portare a una soluzione valida). Se il candidato è promettente, l'algoritmo esplora ricorsivamente ulteriori scelte. Se il candidato non è promettente (un "vicolo cieco"), l'algoritmo * si backtra * al passaggio precedente e prova una scelta diversa.
Poiché l'algoritmo esplora un albero di possibilità e il numero di rami può crescere rapidamente, la complessità del tempo può diventare molto grande, soprattutto quando la profondità aumenta.
Perché esponenziale?
Pensala come una ricerca sull'albero. Se ogni nodo nell'albero ha i bambini `b` (fattore di ramificazione` b`) e la profondità massima dell'albero è `d`, quindi nel peggiore dei casi, è possibile esplorare potenzialmente tutti i nodi` b^d`.
Considerazioni importanti:
* Scenario peggiore: La complessità del tempo O (b^d) è in genere uno scenario * peggiore *. Il tempo di esecuzione effettivo dipende fortemente dal problema e dall'efficacia della potatura (in che modo l'efficacia dell'algoritmo può identificare ed evitare di esplorare rami poco arrometri).
* potatura: I buoni algoritmi di backtracking impiegano varie tecniche di potatura per ridurre significativamente lo spazio di ricerca. La potatura può migliorare drasticamente il runtime, ma non cambia la natura esponenziale intrinseca dell'algoritmo nel caso peggiore.
* Esempio: Un esempio classico è risolvere il problema N-Ceens. Per posizionare N queen su una scacchiera NXN, il fattore di ramificazione è correlato al numero di colonne disponibili in una riga e la profondità è correlata al numero di righe. La complessità del tempo peggiore è significativamente ridotta controllando i conflitti (attaccando le regine) in ogni fase, che pota molti dei potenziali rami.
* Altri fattori: Oltre a `b` e` d`, altri fattori possono influire sul runtime. Ad esempio, il tempo necessario per valutare se una soluzione candidata è promettente può anche essere un fattore significativo.
* NP-Completeness: Molti problemi che vengono risolti usando il backtracking sono NP-completi. Ciò significa che si ritiene che non esista algoritmo a tempo polinomiale per risolverli in generale, e il backtracking spesso diventa un approccio necessario (anche se a volte inefficiente).
In sintesi:
Mentre il backtracking può essere una potente tecnica di risoluzione dei problemi, la sua complessità del tempo esponenziale significa che è più adatto ai problemi in cui:
* La dimensione del problema è relativamente piccola.
* Possono essere impiegate strategie di potatura efficaci per ridurre significativamente lo spazio di ricerca.
* Una soluzione approssimativa è accettabile se la soluzione esatta richiede troppo tempo per trovare.
Se il tuo problema è grande e la potatura è inefficace, potrebbe essere necessario considerare algoritmi alternativi o tecniche di approssimazione.
software © www.354353.com