Tidskomplexiteten för en backtracking -algoritm är i allmänhet
exponentiell , även om det kan variera beroende på problemet och dess begränsningar. Det finns ingen enda "tidskomplexiteten för backtracking eftersom det beror starkt på:
* Antalet val vid varje steg: Om du har *B *-val vid varje steg, och djupet på sökträdet är *d *, kan komplexiteten vara o (b
d
).
* Problemets specifika begränsningar och beskärningstekniker: Backtracking involverar ofta att beskära sökutrymmet. Om du effektivt kan beskära grenar som inte leder till en lösning kan du minska sökutrymmet avsevärt och förbättra prestandan. Effektiviteten i beskärningsstrategin påverkar starkt den sista tidskomplexiteten.
* Problemets natur: Vissa problem är i sig mer mottagliga för backtracking än andra.
Här är en uppdelning av varför det i allmänhet är exponentiellt och några exempel:
* Exponentiell natur: Backtracking undersöker alla möjliga kombinationer eller permutationer tills en lösning hittas. I det värsta fallet kan det behöva utforska en stor del av sökutrymmet, vilket leder till exponentiell tillväxt i antalet besökta noder.
* Exempel och deras komplexitet:
* n-Queens Problem: Hitta alla möjliga placeringar av N -drottningar på ett NXN -schackbräde så att inga två drottningar hotar varandra. Tidskomplexiteten är ungefär O (n!), I värsta fall. Beskärningstekniker kan förbättra prestandan avsevärt.
* Travel Salesperson Problem (TSP): Hitta den kortaste möjliga rutten som besöker varje stad exakt en gång och återvänder till startstaden. En naiv backtracking -strategi skulle ha en tidskomplexitet av o (n!), Där 'n' är antalet städer. Gren och bunden används som beskärning för snabbare utförande.
* SUMSUM SUM -problem: Att bestämma om det finns en delmängd av en given uppsättning siffror vars summa är lika med ett målvärde. Tidskomplexiteten kan vara O (2
n
), där 'n' är antalet element i uppsättningen, eftersom du kan behöva överväga alla möjliga delmängder.
* Sudoku Solver: I värsta fall kan en backtracking Sudoku -lösare prova ett stort antal möjligheter för varje tom cell. Även om teoretiskt exponentiellt, bra heuristik och begränsningar gör att den verkliga sudokuen är mycket snabbt.
* graffärgning: Tilldela färger till vertikaler i en graf så att inga två angränsande vertikaler har samma färg. Värsta fall är exponentiellt men effektiviteten beror på hur du beställer noderna.
* Faktorer som påverkar tidskomplexiteten:
* Djupet i rekursionen: Ju djupare sökträdet, desto fler beräkningar krävs.
* grenfaktor: Antalet val vid varje nod i sökträdet. En större grenfaktor leder till snabbare exponentiell tillväxt.
* beskärning: Effektiv beskärning minskar sökutrymmet och förbättrar prestandan. Beskärning är den enskilt viktigaste faktorn att tänka på.
Sammanfattningsvis:
Även om det är svårt att ge en exakt tidskomplexitet för backtracking i allmänhet, är det säkert att säga att det vanligtvis är exponentiellt (O (B
d
) eller O (2
n
) eller o (n!)) I värsta fall. Den faktiska tidskomplexiteten påverkas starkt av problemets struktur, effektiviteten för alla beskärningsstrategier som används och storleken på ingången. Det är viktigt att designa backtracking -algoritmer med effektiv beskärning för att undvika att utforska onödiga vägar. I vissa fall kan beskärning vara så effektiv att den gör algoritmen mycket snabbare i praktiken än dess exponentiella komplexitet i värsta fall skulle antyda. Men för många problem, även med beskärning, förblir backtracking i sig ineffektiv för stora ingångsstorlekar.