Laskennallinen monimutkaisuus on tietojenkäsittelytieteen ja algoritmien teorian käsite , joka kuvaa funktiota jonkin algoritmin suorittaman työn määrän riippuvuudesta syötetietojen koosta. Laskennallista monimutkaisuutta tutkivaa alaa kutsutaan laskennallisen monimutkaisuuden teoriaksi . Työn määrää mitataan yleensä abstrakteilla ajan ja tilan käsitteillä, joita kutsutaan laskentaresurssiksi . Aika määräytyy ongelman ratkaisemiseen tarvittavien perusvaiheiden lukumäärän mukaan, kun taas tila määräytyy tallennusvälineen muistin tai tilan määrän mukaan.. Tällä alueella yritetään siis vastata algoritmien kehittämisen keskeiseen kysymykseen: "miten suoritusaika ja varatun muistin määrä muuttuvat syötteen koosta riippuen?". Tässä syötteen koko on ongelmatietojen kuvauksen pituus bitteinä (esimerkiksi matkustava myyjä -tehtävässä syötteen pituus on lähes verrannollinen kaupunkien ja niiden välisten teiden lukumäärään), ja tulosteen koko on ongelman ratkaisun kuvauksen pituus (paras reitti matkustajamyyjäongelmassa).
Erityisesti laskennallinen monimutkaisuusteoria määrittelee NP-täydelliset ongelmat , jotka ei-deterministinen Turingin kone voi ratkaista polynomiajassa , kun taas deterministiselle Turingin koneelle ei tunneta polynomialgoritmia . Yleensä nämä ovat monimutkaisia optimointiongelmia , esimerkiksi matkamyyjän ongelma .
Tietojenkäsittelyteoriaan liittyvät läheisesti muun muassa algoritmien analysointi ja laskettavuusteoria . Teoreettisen tietojenkäsittelytieteen ja algoritmisen analyysin välinen yhteys on se, että niiden muodostus on omistettu tiettyjen ongelmien ratkaisemiseen tarvittavien algoritmien resurssien analysointiin, kun taas yleisempi kysymys on mahdollisuus käyttää algoritmeja tällaisiin ongelmiin. Tarkemmin sanottuna yritämme luokitella ongelmat, jotka voidaan ratkaista rajallisilla resursseilla tai joita ei voida ratkaista. Käytettävissä olevien resurssien voimakas rajoitus erottaa laskennallisen kompleksisuusteorian laskennallisesta teoriasta, joka vastaa kysymykseen, mitkä ongelmat periaatteessa voidaan ratkaista algoritmisesti.
Laskennallisen monimutkaisuuden teoria syntyi tarpeesta vertailla algoritmien nopeuksia, kuvata selkeästi niiden käyttäytymistä (suoritusaika ja tarvittava muistimäärä) syötteen koosta riippuen.
Algoritmin käyttämien perusoperaatioiden määrä tietyn ongelman ilmentymän ratkaisemiseen ei riipu pelkästään syötetietojen koosta, vaan myös itse tiedosta. Esimerkiksi lisäyslajittelualgoritmin operaatioiden määrä on paljon pienempi, jos syötetiedot on jo lajiteltu . Tällaisten vaikeuksien välttämiseksi harkitse algoritmin aikamonimutkaisuuden käsitettä pahimmassa tapauksessa .
Algoritmin aikamonimutkaisuus (pahimmassa tapauksessa) on syötetietojen koon funktio, joka on yhtä suuri kuin algoritmin suorittamien perustoimintojen enimmäismäärä määritellyn kokoisen ongelman ratkaisemiseksi.
Samoin kuin pahimmassa tapauksessa aikamonimutkaisuuden käsite , määritellään myös algoritmin aikamonimutkaisuuden käsite parhaassa tapauksessa . He ottavat myös huomioon algoritmin keskimääräisen käyntiajan käsitteen , eli algoritmin käyntiajan matemaattisen odotuksen . Joskus sanotaan yksinkertaisesti: " Algoritmin aikamonimutkaisuus " tai " Algoritmin ajoaika ", viitaten algoritmin aikaiseen monimutkaisuuteen pahimmassa, parhaassa tai keskimääräisessä tapauksessa (riippuen kontekstista).
Analogisesti aikamonimutkaisuuden kanssa ne määrittävät algoritmin spatiaalisen monimutkaisuuden , mutta tässä ei puhuta alkeisoperaatioiden lukumäärästä, vaan käytetyn muistin määrästä.
Huolimatta siitä, että algoritmin aikamonimutkaisuusfunktio voidaan joissain tapauksissa määrittää tarkasti, on useimmiten turha etsiä sen tarkkaa arvoa. Tosiasia on, että ensinnäkin ajan monimutkaisuuden tarkka arvo riippuu alkeisoperaatioiden määrittelystä (monimutkaisuus voidaan mitata esimerkiksi aritmeettisten operaatioiden, bittioperaatioiden tai Turingin koneen operaatioiden lukumäärällä ), ja toiseksi, kuten syöttötiedon koko kasvaa, vakiotekijöiden ja alemman kertaluvun termien osuus tarkan toiminta-ajan lausekkeessa tulee erittäin merkityksettömäksi.
Suuren syöttödatan huomioon ottaminen ja algoritmin käyntiajan kasvujärjestyksen arvioiminen johtaa käsitykseen algoritmin asymptoottisesta kompleksisuudesta . Samalla algoritmi, jolla on vähemmän asymptoottista monimutkaisuutta, on tehokkaampi kaikille syöttötiedoille, paitsi mahdollisesti pienikokoisille tiedoille. Asymptoottista merkintää käytetään algoritmien asymptoottisen monimutkaisuuden kirjoittamiseen :
Nimitys | Intuitiivinen selitys | Määritelmä |
---|---|---|
ylhäältä rajoittuu funktiolla (vakiotekijään asti) asymptoottisesti | tai | |
on alhaalta rajattu funktiolla (vakiotekijään asti) asymptoottisesti | ||
funktion rajoittama alhaalta ja ylhäältä asymptoottisesti | ||
hallitsee asymptoottisesti | ||
hallitsee asymptoottisesti | ||
vastaa asymptoottisesti |
Koska asymptoottisessa monimutkaisuusestimaatissa "logaritmi" kirjoitetaan usein ilman kantaa - esimerkiksi .
On syytä korostaa, että pahimman tapauksen suoritusajan kasvunopeus ei ole ainoa tai tärkein kriteeri algoritmien ja ohjelmien arvioinnissa. Tässä on muutamia huomioita, joiden avulla voit tarkastella suoritusaikakriteeriä muista näkökulmista:
Jos luotavaa ohjelmaa käytetään vain muutaman kerran, niin ohjelman kirjoittamisen ja virheenkorjauksen kustannukset hallitsevat ohjelman kokonaiskustannuksia, eli todellisella suoritusajalla ei ole merkittävää vaikutusta kokonaiskustannuksiin. Tässä tapauksessa tulee valita yksinkertaisin toteuttaa algoritmi.
Jos ohjelma toimii vain "pienillä" syötetiedoilla, ajoajan kasvunopeus on vähemmän tärkeä kuin ajoaikakaavassa oleva vakio [1] . Samaan aikaan syöttötietojen ”pienyyden” käsite riippuu myös kilpailevien algoritmien tarkasta suoritusajasta. On olemassa algoritmeja, kuten kokonaislukujen kertolaskualgoritmi , jotka ovat asymptoottisesti tehokkaimpia, mutta joita ei koskaan käytetä käytännössä edes suuriin ongelmiin, koska niiden suhteellisuusvakiot ovat huomattavasti parempia kuin muiden, yksinkertaisempien ja vähemmän "tehokkaiden" algoritmeja. Toinen esimerkki on Fibonacci-kasat , huolimatta niiden asymptoottisesta tehokkuudesta, käytännön näkökulmasta, ohjelmiston toteutuksen monimutkaisuus ja suuret vakioarvot ajoaikakaavoissa tekevät niistä vähemmän houkuttelevia kuin tavalliset binääripuut [1] .
Jos jonkin tehtävän ratkaisu n-pisteen graafille yhdellä algoritmilla vie aikaa (askelmäärä) luokkaa n C ja toisella - luokkaa n+n!/C, missä C on vakioluku , silloin "polynomiideologian" mukaan ensimmäinen algoritmi on käytännössä tehokas ja toinen ei, vaikka esimerkiksi C=10:ssä (10 10 ) tilanne on juuri päinvastainen [2] .A. A. Zykov
On tapauksia, joissa tehokkaat algoritmit vaativat niin suuria määriä koneen muistia (ilman mahdollisuutta käyttää ulkoisia tallennusvälineitä), että tämä tekijä mitätöi algoritmin "tehokkuuden" edun. Näin ollen ei vain "ajan monimutkaisuus" ole usein tärkeä, vaan myös "muistin monimutkaisuus" (tila monimutkaisuus).
Numeerisissa algoritmeissa algoritmien tarkkuus ja vakaus ovat yhtä tärkeitä kuin niiden aikatehokkuus.
Monimutkaisuusluokka on joukko tunnistusongelmia , joille on olemassa algoritmeja, jotka ovat samanlaisia laskennallisen monimutkaisuuden suhteen. Kaksi tärkeää edustajaa:
Luokka P sisältää kaikki ne tehtävät, joiden ratkaisua pidetään "nopeana" eli joiden ratkaisuaika riippuu polynomiaalisesti syötteen koosta. Tämä sisältää lajittelun , haun taulukosta, kaavioiden liitettävyyden selvittämisen ja monia muita.
NP-luokka sisältää ongelmia, jotka epädeterministinen Turingin kone voi ratkaista polynomimääräisellä askelmäärällä syötteen koosta. Niiden ratkaisu voidaan tarkistaa deterministisellä Turingin koneella polynomimääräisellä askelmäärällä. On huomattava, että ei-deterministinen Turingin kone on vain abstrakti malli, kun taas nykyaikaiset tietokoneet vastaavat determinististä Turingin konetta , jolla on rajoitettu muisti. Koska determinististä Turingin konetta voidaan pitää ei- deterministisen Turingin koneen erikoistapauksena , NP-luokka sisältää P-luokan sekä joitakin ongelmia, joissa vain algoritmit, jotka riippuvat eksponentiaalisesti syötteen koosta (ts. ovat tehottomia suurille koneille). syötteet) tiedetään ratkaisevan. NP-luokka sisältää monia kuuluisia ongelmia, kuten matkustava myyjä -ongelma , Boolen kaavojen tyytyväisyysongelma , tekijöiden jakaminen jne.
Kysymystä näiden kahden luokan tasa-arvoisuudesta pidetään yhtenä vaikeimmista avoimista ongelmista teoreettisen tietojenkäsittelytieteen alalla. Clay Mathematical Institute on sisällyttänyt tämän ongelman Millennium Problems -luetteloonsa ja tarjoaa miljoonan Yhdysvaltain dollarin palkkion sen ratkaisusta.
Sanakirjat ja tietosanakirjat |
---|
Algoritmien monimutkaisuusluokat | |
---|---|
Kevyenä pidetty | |
Taitaa olla vaikeaa | |
Vaikeaksi pidetty |
|