A számítási komplexitás egy olyan fogalom a számítástechnikában és az algoritmusok elméletében , amely valamely algoritmus által elvégzett munka mennyiségének a bemeneti adatok méretétől való függésének függvényét jelöli. A számítási komplexitást tanulmányozó ágat számítási komplexitáselméletnek nevezzük . A munka mennyiségét általában a számítási erőforrásoknak nevezett absztrakt idő- és térfogalmakban mérik . Az időt a probléma megoldásához szükséges elemi lépések száma, míg a helyet a memória vagy tárhely mennyisége határozza meg . Így ezen a területen az algoritmusfejlesztés központi kérdésére próbálnak választ adni: „hogyan fog változni a végrehajtási idő és a foglalt memória mennyisége a bemenet méretétől függően?”. Itt a bemenet mérete a probléma adatának leírásának hossza bitben (például az utazó eladó feladatban a bemenet hossza szinte arányos a városok és a közöttük lévő utak számával), és a a kimenet mérete a probléma megoldásának leírásának hossza (a legjobb útvonal az utazó eladó problémában).
A számítási komplexitás elmélete NP-teljes problémákat határoz meg , amelyeket egy nem determinisztikus Turing-gép képes megoldani polinomiális idő alatt , míg a determinisztikus Turing-gépre nem ismert polinomiális algoritmus . Általában ezek összetett optimalizálási problémák , például az utazó eladó problémája .
Az elméleti számítástechnikához szorosan kapcsolódnak olyan területek, mint az algoritmusok elemzése és a kiszámíthatóság elmélete . Az elméleti számítástechnika és az algoritmikus analízis között az a kapcsolat, hogy kialakításuk az egyes algoritmusok feladatmegoldáshoz szükséges erőforrásigényének elemzésére irányul, míg általánosabb kérdés az algoritmusok alkalmazásának lehetősége az ilyen jellegű problémákra. Hogy konkrétak legyünk, megpróbáljuk osztályozni azokat a problémákat, amelyek korlátozott erőforrásokkal megoldhatók vagy nem. A rendelkezésre álló erőforrások erős korlátja különbözteti meg a számítási komplexitás elméletét a számítási elmélettől, ez utóbbi ad választ arra a kérdésre, hogy elvileg milyen problémákat lehet algoritmikusan megoldani.
A számítási komplexitás elmélete abból adódott, hogy össze kellett hasonlítani az algoritmusok sebességét, világosan le kell írni a viselkedésüket (végrehajtási idő és a szükséges memória mennyisége) a bemenet méretétől függően.
Az algoritmus által a probléma egy adott példányának megoldására fordított elemi műveletek száma nemcsak a bemeneti adatok méretétől függ, hanem magától az adattól is. Például a beillesztési rendezési algoritmus műveleteinek száma sokkal kevesebb, ha a bemeneti adatok már rendezve vannak. Az ilyen nehézségek elkerülése érdekében a legrosszabb esetben vegye figyelembe az algoritmus időbeli összetettségének fogalmát .
Egy algoritmus időbonyolultsága (a legrosszabb esetben) a bemeneti adatok méretének függvénye, megegyezik az algoritmus által a megadott méretű problémapéldány megoldására végrehajtott elemi műveletek maximális számával.
Hasonlóan a legrosszabb esetben az időbonyolultság fogalmához , a legjobb esetben az algoritmus időbonyolultságának fogalma is definiálva van . Figyelembe veszik az algoritmus átlagos futási idejének fogalmát is , vagyis az algoritmus futási idejének matematikai elvárását . Néha egyszerűen azt mondják: " Az algoritmus időbonyolultsága " vagy " Az algoritmus futási ideje ", utalva az algoritmus időbeli összetettségére a legrosszabb, legjobb vagy átlagos esetben (kontextustól függően).
Az időbonyolultsággal analóg módon meghatározzák az algoritmus térbeli összetettségét , csak itt nem az elemi műveletek számáról, hanem a felhasznált memória mennyiségéről beszélnek.
Annak ellenére, hogy egy algoritmus időbonyolultsági függvénye bizonyos esetekben pontosan meghatározható, a legtöbb esetben értelmetlen annak pontos értékét keresni. A helyzet az, hogy egyrészt az időbonyolultság pontos értéke az elemi műveletek definíciójától függ (például a komplexitás az aritmetikai műveletek, bitműveletek vagy Turing-gépen végzett műveletek számában mérhető ), másodszor pedig a bemenő adatok mérete megnő, a pontos működési időre vonatkozó kifejezésben megjelenő konstans tényezők és alacsonyabb rendű tagok hozzájárulása rendkívül jelentéktelenné válik.
A nagy bemeneti adatok figyelembevétele és az algoritmus futási idejének növekedési sorrendjének becslése elvezet az algoritmus aszimptotikus komplexitásának koncepciójához . Ugyanakkor egy kisebb aszimptotikus komplexitású algoritmus minden bemeneti adatra hatékonyabb, kivéve esetleg a kis méretű adatokat. Az aszimptotikus jelölést az algoritmusok aszimptotikus összetettségének írásához használják :
Kijelölés | Intuitív magyarázat | Meghatározás |
---|---|---|
felülről függvény határolja (konstans tényezőig) aszimptotikusan | vagy | |
alulról egy függvény határolja (konstans tényezőig) aszimptotikusan | ||
alulról és felülről a függvény határolja aszimptotikusan | ||
aszimptotikusan dominál | ||
aszimptotikusan dominál | ||
aszimptotikusan egyenértékű |
Mivel az aszimptotikus komplexitásbecslésben a „logaritmust” gyakran az alap említése nélkül írják le – például .
Hangsúlyozni kell, hogy az algoritmusok és programok értékelésénél nem a legrosszabb végrehajtási idő növekedési üteme az egyetlen vagy a legfontosabb kritérium. Íme néhány megfontolás, amelyek lehetővé teszik, hogy a futásidejű kritériumot más nézőpontokból is megvizsgálja:
Ha a készülő programot csak néhány alkalommal használjuk, akkor a program teljes költségén a program megírásának és hibakeresésének költsége dominál, vagyis a tényleges végrehajtási időnek nincs jelentős hatása a teljes költségre. Ebben az esetben a legegyszerűbben megvalósítható algoritmust kell előnyben részesíteni.
Ha a program csak "kis" bemeneti adatokkal fog működni, akkor a futási idő növekedési üteme kevésbé lesz fontos, mint a futási idő képletében jelen lévő állandó [1] . Ugyanakkor a bemeneti adatok „kicsinységének” fogalma a versengő algoritmusok pontos végrehajtási idejétől is függ. Vannak olyan algoritmusok, mint például az egész szám szorzási algoritmus , amelyek aszimptotikusan a leghatékonyabbak, de amelyeket soha nem használnak a gyakorlatban, még nagy problémák esetén sem, mert arányossági állandóik jelentősen felülmúlják más, egyszerűbb és kevésbé "hatékony" algoritmusokat. algoritmusok. Egy másik példa a Fibonacci kupacok , aszimptotikus hatékonyságuk ellenére gyakorlati szempontból a megvalósítás szoftveres összetettsége és a futási idő képletek nagy konstansértékei miatt kevésbé vonzóak, mint a közönséges bináris fák [1] .
Ha egy probléma megoldása egy n csúcsú gráfra az egyik algoritmussal n C nagyságrendű idő (lépések száma) , egy másikkal pedig - n+n!/C nagyságrendű, ahol C egy állandó szám , akkor a "polinomiális ideológia" szerint az első algoritmus gyakorlatilag hatékony , a második pedig nem, bár például C=10 (10 10 ) esetén a helyzet éppen az ellenkezője [2] .A. A. Zykov
Vannak esetek, amikor a hatékony algoritmusok akkora gépmemóriát igényelnek (külső adathordozó használatának lehetősége nélkül), hogy ez a tényező érvényteleníti az algoritmus "hatékonyságának" előnyeit. Így gyakran nemcsak az "idő-bonyolultság" fontos, hanem a "memória-bonyolultság" (térbeli komplexitás) is.
A numerikus algoritmusokban az algoritmusok pontossága és stabilitása nem kevésbé fontos, mint az időhatékonyságuk.
A komplexitási osztály olyan felismerési problémák halmaza, amelyekhez hasonló számítási komplexitású algoritmusok léteznek. Két fontos képviselője:
A P osztály tartalmazza mindazokat a feladatokat, amelyek megoldása "gyorsnak" számít, vagyis amelyek megoldási ideje polinomiálisan függ a bemenet méretétől. Ez magában foglalja a rendezést , a tömbben való keresést, a grafikonok összekapcsolhatóságának kiderítését és még sok mást.
Az NP osztály olyan problémákat tartalmaz, amelyeket egy nemdeterminisztikus Turing-gép meg tud oldani a bemenet méretétől számított polinomiális lépésekben. Megoldásukat egy determinisztikus Turing-géppel polinomiális lépésszámban ellenőrizhetjük. Meg kell jegyezni, hogy a nem determinisztikus Turing-gép csak egy absztrakt modell, míg a modern számítógépek egy korlátozott memóriával rendelkező determinisztikus Turing-gépnek felelnek meg. Mivel a determinisztikus Turing -gép egy nem determinisztikus Turing-gép speciális eseteként fogható fel , az NP osztály magában foglalja a P osztályt, valamint néhány olyan problémát, amelyeknél csak a bemeneti mérettől exponenciálisan függő algoritmusok (azaz nem hatékonyak nagy gépeknél) bemenetek) megoldása ismert. Az NP osztály számos híres problémát tartalmaz, például az utazó eladó problémáját , a Boole-képletek kielégíthetőségi problémáját , a faktorizációt stb.
E két osztály egyenlőségének kérdése az egyik legnehezebb nyitott probléma az elméleti számítástechnika területén. A Clay Mathematical Institute felvette ezt a problémát a millenniumi problémák listájára , és egymillió dollár jutalmat kínál a megoldásáért.
Szótárak és enciklopédiák |
---|
Algoritmusok összetettségi osztályai | |
---|---|
Fénynek tekinthető | |
Állítólag nehéz | |
Nehéznek tartott |
|