Algoritmi ( lat. algorithmi - Keski-Aasialaisen matemaatikon Al-Khwarizmin [1] puolesta ) on rajallinen joukko tarkasti määriteltyjä sääntöjä tietyn luokan ongelman ratkaisemiseksi tai joukko ohjeita , jotka kuvaavat menettelyä, jolla esiintyjä ratkaisee tietyn tehtävän. ongelma. Vanhassa tulkinnassa sanaa "järjestys" käytettiin sanan "järjestys" sijaan, mutta rinnakkaisuuden kehittyessä tietokoneiden työssä sana "sekvenssi" alkoi korvata yleisemmällä sanalla "järjestys". Riippumattomat käskyt voidaan suorittaa mielivaltaisessa järjestyksessä, rinnakkain, jos käytetyt suorittajat sen sallivat.
Aikaisemmin venäjäksi kirjoitettiin "algori f m", nyt tätä kirjoitusasua käytetään harvoin, mutta siitä huolimatta on poikkeus ( tavallinen Markov -algoritmi ).
Usein tietokone toimii toimeenpanijana, mutta algoritmin käsite ei välttämättä tarkoita tietokoneohjelmia - esimerkiksi selkeästi kuvattu ruokalajin valmistusresepti on myös algoritmi, jolloin toimeenpanija on henkilö (tai ehkä joku mekanismi, esimerkiksi kudonta tai sorvi numeerisella ohjauksella ).
Laskennallisia algoritmeja (jatkossa puhumme pääasiassa niistä) ja ohjausalgoritmeja voidaan erottaa . Laskennalliset algoritmit itse asiassa muuntavat osan lähtötiedoista ulostuloksi toteuttaen jonkin funktion laskennan. Ohjausalgoritmien semantiikka voi vaihdella merkittävästi ja lykätä tarvittavien ohjaustoimintojen suorittamiseen joko tiettyinä aikoina tai vastauksena ulkoisiin tapahtumiin (tässä tapauksessa, toisin kuin laskentaalgoritmi, ohjausalgoritmi voi pysyä oikeana äärettömään suoritukseen).
Algoritmin käsite viittaa matematiikan alkuperäisiin peruskäsitteisiin. Luonteeltaan algoritmiset laskentaprosessit (kokonaislukujen aritmeettiset operaatiot, kahden luvun suurimman yhteisen jakajan löytäminen jne.) ovat olleet ihmiskunnan tiedossa muinaisista ajoista lähtien. Selkeässä muodossa algoritmin käsite syntyi kuitenkin vasta 1900-luvun alussa.
Algoritmin käsitteen osittainen formalisointi alkoi yrityksistä ratkaista resoluutioongelma ( saksa: Entscheidungsproblem ), jonka muotoili David Hilbert vuonna 1928 . Seuraavat formalisointivaiheet olivat tarpeen tehokkaan laskennan [2] tai "tehokkaan menetelmän" [3] määrittelemiseksi ; tällaisia formalisaatioita ovat Gödel - Herbran- Kleene rekursiiviset funktiot 1930 , 1934 ja 1935 , Alonzo Churchin λ-laskenta vuodelta 1936 , Emil Postin formulaation 1 vuodelta 1936 ja Turingin kone .
Laskennallisen algoritmin moderni muodollinen määritelmä annettiin 1900-luvun 30-50- luvuilla Turingin , Postin , Churchin ( Church-Turingin teesi ), N. Wienerin , A. A. Markovin teoksissa .
Itse sana "algoritmi" tulee persialaisen ( Khorezm ja Maverannakhr ) tiedemiehen al-Khorezmin nimestä . Noin 825 hän kirjoitti teoksen Kitab al-jabr wal-muqabala ("Lisä- ja vähennyskirja"), jonka alkuperäisestä nimestä tulee sana " algebra " (al-jabr - loppuun). Tässä kirjassa hän esitti ensimmäistä kertaa kuvauksen Intiassa keksitystä desimaalilukujärjestelmästä. Kirjan persialainen alkuperäisversio ei ole säilynyt. Al-Khwarizmi muotoili uuden järjestelmän laskennan säännöt ja käytti luultavasti ensimmäistä kertaa numeroa 0 osoittamaan puuttuvaa kohtaa luvun merkinnässä (arabit käänsivät sen intialaisen nimen as -sifr tai yksinkertaisesti sifr , joten sanat kuten "numero" ja "salaus"). Samoihin aikoihin muut arabialaiset tutkijat alkoivat käyttää intialaisia numeroita.
1100-luvun ensimmäisellä puoliskolla al-Khwarizmin kirja latinaksi käännettynä tunkeutui Eurooppaan. Kääntäjä, jonka nimeä ei ole tullut meille, antoi sille nimen Algoritmi de numero Indorum ("Algoritmit intiaanien tilistä") - siten keskiaasialaisen tiedemiehen latinoitu nimi sijoitettiin kirjan otsikkoon. Nykyään uskotaan, että sana "algoritmi" tuli eurooppalaisiin kieliin juuri tämän käännöksen vuoksi. Seuraavien vuosisatojen aikana ilmestyi monia muita teoksia, jotka on omistettu samalle aiheelle - lukujen avulla laskemisen taitoon opetetuille -, ja kaikkien niiden otsikossa oli sana algoritmi tai algorismi .
Myöhemmät kirjoittajat eivät tienneet mitään al-Khwarizmista, mutta koska kirjan ensimmäinen käännös alkaa sanoilla: "Dixit algorizmi: ..." ("Al-Khwarizmi sanoi: ..."), he yhdistävät silti tämän sanan tietyn henkilön nimellä. Versio kirjan kreikkalaisesta alkuperästä oli hyvin yleinen. 1200-luvun anglo-normannikäsikirjoituksessa , joka on kirjoitettu säkeellä, luemme:
Algorismi keksittiin Kreikassa .
Tämä on osa aritmetiikkaa . Sen keksi mestari nimeltä Algorism, joka antoi hänelle nimensä. Ja koska hänen nimensä oli Algorism,
Hän kutsui kirjaansa Algorismiksi.
Vuoden 1250 tienoilla englantilainen tähtitieteilijä ja matemaatikko John of Sacrobosco kirjoitti aritmetiikasta Algorismus vulgariksen , josta tuli pääasiallinen desimaalipaikannuslaskennan oppikirja monissa eurooppalaisissa yliopistoissa vuosisatojen ajan. Johdannossa Sacrobosco nimesi viisaan miehen nimeltä Algus laskentatieteen kirjoittajaksi . Ja Jean de Meunin suositussa keskiaikaisessa runossa " Ruusun romanssi " (1275-1280) "kreikkalainen filosofi Algus" asetetaan Platonin , Aristoteleen , Eukleideen ja Ptolemaiosen tasolle ! Myös nimestä Argus ( Argus ) oli kirjoitusasu. Ja vaikka muinaisen kreikkalaisen mytologian mukaan Argo - aluksen rakensi Jason , aluksen rakentaminen katsottiin tämän Argon ansioksi.
"Mestari Alguksesta" (tai Arguksesta) tuli keskiaikaisen kirjallisuuden laskennallisen taiteen henkilöitymä. Ja jo mainitussa "Roomalaisessa ruusussa" ja kuuluisassa italialaisessa runossa "Kukka", jonka on kirjoittanut Durante , on katkelmia, jotka sanovat, että edes "mestre Argus" ei pysty laskemaan, kuinka monta kertaa rakastajat riitelevät ja tehdä rauha. Englantilainen runoilija Geoffrey Chaucer runossaan " The Book of the Duches " ( 1369 ) kirjoittaa, että edes "kunnioittava laskuri Argus" (jalo kreivi Argu) ei pysty laskemaan hirviöitä, jotka ilmestyivät painajaismaisissa näyissä sankarille.
Ajan myötä matemaatikot olivat kuitenkin yhä vähemmän kiinnostuneita tällaisista selityksistä, ja matemaattisten teosten otsikoissa poikkeuksetta esiintyvä sana algorism (tai algorismus ) sai merkityksen tapana suorittaa aritmeettisia operaatioita arabialaisilla numeroilla. on paperilla, ilman helmitaulua . Tässä mielessä se tuli monille eurooppalaisille kielille . Esimerkiksi merkitty "vanhentuneeksi". se on englanninkielisen Webster's New World Dictionaryn edustavassa sanakirjassa , joka julkaistiin vuonna 1957. Brockhausin ja Efronin Encyclopedic Dictionary tarjoaa seuraavan tulkinnan: algoritmi (muuten, ennen vallankumousta oikeinkirjoitusta käytettiin algoritmi , kautta fita ) on tuotettu "arabian sanasta Al-Goremm, joka on juuri".
Algoritmi on taito laskea numeroilla, mutta aluksi sana "luku" viittasi vain nollaan. Kuuluisa ranskalainen truver Gautier de Coincy (Gautier de Coincy, 1177-1236) käytti yhdessä runossaan sanoja algorismus-cipher (joka tarkoitti numeroa 0) metaforana luonnehtimaan täysin hyödytöntä henkilöä. Ilmeisesti tällaisen kuvan ymmärtäminen vaati kuulijoiden asianmukaista valmistautumista, mikä tarkoittaa, että uusi numerojärjestelmä oli heille jo varsin tuttu.
Monien vuosisatojen ajan helmitaulu oli itse asiassa ainoa keino käytännön laskelmiin; sitä käyttivät kauppiaat, rahanvaihtajat ja tiedemiehet. Laskulaudalla suoritettavien laskelmien ansioita selitti kirjoituksissaan sellainen erinomainen ajattelija kuin Herbert Avrilaksky (938-1003), josta tuli paavi vuonna 999 nimellä Sylvester II. Uusi eteni hyvin vaivoin, ja matematiikan historiaan sisältyi sitkeä vastustus algoristien ja abasistien (joita joskus kutsutaan herbekisteiksi) leirien välillä, jotka kannattivat abakuksen käyttöä arabialaisten numeroiden sijaan laskelmissa. Mielenkiintoista on, että kuuluisa ranskalainen matemaatikko Nicolas Chuquet (Nicolas Chuquet, 1445-1488) kirjattiin Lyonin kaupungin veronmaksajien rekisteriin algoritmiksi (algoristiksi). Mutta kului yli vuosisata ennen kuin uusi laskentatapa vihdoin otettiin käyttöön, niin paljon aikaa tarvittiin yleisesti tunnustettujen merkintöjen kehittämiseen, laskentamenetelmien parantamiseen ja mukauttamiseen paperille kirjoittamista varten. Länsi-Euroopassa aritmeettisia opettajia kutsuttiin edelleen "abakuksen mestareiksi" aina 1600-luvulle asti , kuten esimerkiksi matemaatikko Niccolò Tartaglia (1500-1557).
Joten laskennan taitoa käsitteleviä kirjoituksia kutsuttiin algoritmeiksi . Monista sadoista voidaan nostaa esiin sellaisia epätavallisia kuin Alexander de Villa Dein (k. 1240) säkeessä kirjoittama tutkielma Carmen de Algorismo (latinaksi carmen ja tarkoittaa runoutta) tai wieniläisen tähtitieteilijän ja matemaatikon George Purbachin oppikirja ( Georg Peurbach, 1423-1461) Opus algorismi jocundissimi ("Hauskin essee algoritmista").
Vähitellen sanan merkitys laajeni. Tiedemiehet alkoivat soveltaa sitä paitsi puhtaasti laskennallisiin, myös muihin matemaattisiin menetelmiin. Esimerkiksi noin 1360 ranskalainen filosofi Nicolaus Oresme (1323/25-1382) kirjoitti matemaattisen opinnäytetyön Algorismusproportionum ("Suhteiden laskeminen"), jossa hän käytti ensimmäisen kerran potenssia murto-osien eksponenteilla ja pääsi lähelle ajatusta logaritmit. Kun helmitaulu korvattiin niin sanotulla viivojen laskemisella, lukuisia sen käsikirjoja alettiin kutsua nimellä Algorithmus linealis , eli viivojen laskemisen säännöt.
Voit kiinnittää huomiota siihen, että jonkin ajan kuluttua alkuperäinen muoto algorismi menetti viimeisen kirjaimen ja sana sai eurooppalaiselle ääntämisalgorismille sopivamman muodon . Myöhemmin se vuorostaan vääristyi, mikä todennäköisesti liittyi sanaan aritmetiikka .
Vuonna 1684 Gottfried Leibniz käytti kirjassaan Nova Methodvs pro maximis et minimis, itemque tangentibus... sanaa "algoritmi" ( Algorithmo ) vielä laajemmassa merkityksessä: systemaattisena tapana ratkaista ongelmia differentiaalilaskennassa.
1700 -luvulla eräässä saksalaisista matemaattisista sanakirjoista, Vollstandiges mathematisches Lexiconista (julkaistu Leipzigissä vuonna 1747 ), termiä algoritmi selitetään edelleen neljän aritmeettisen operaation käsitteenä. Mutta tämä merkitys ei ollut ainoa, koska matemaattisen tieteen terminologia oli vielä muodostumassa niinä päivinä. Erityisesti ilmaisualgoritmia infinitesimalis sovellettiin tapoihin suorittaa operaatioita äärettömän pienille arvoille. Sanaa algoritmi käytti myös Leonard Euler , jonka yksi teoksista on nimeltään "Uuden algoritmin käyttäminen Pell-ongelman ratkaisemiseksi" ( De usu novi algorithmi in problemate Pelliano solvendo ). Näemme, että Eulerin käsitys algoritmista synonyyminä ongelmanratkaisumenetelmälle on jo hyvin lähellä nykyaikaista.
Kesti kuitenkin vielä lähes kaksi vuosisataa, ennen kuin kaikki sanan muinaiset merkitykset katosivat käytöstä. Tämä prosessi voidaan jäljittää esimerkillä sanan "algoritmi" tunkeutumisesta venäjän kieleen.
Historioitsijat päivämäärävät yhden muinaisen venäläisen aritmeettisen oppikirjan luetteloista, joka tunnetaan nimellä "Laskemisen viisaus", vuoteen 1691 . Tämä teos tunnetaan monissa versioissa (varhaisimmat niistä ovat lähes sata vuotta vanhempia) ja juontavat juurensa vielä muinaisempiin 1500 -luvun käsikirjoituksiin. Heidän mukaansa voidaan jäljittää, kuinka arabialaisten numeroiden tuntemus ja niiden käsittelysäännöt vähitellen levisivät Venäjällä. Tämän oppikirjan koko nimi on "Tämä kirja, joka puhutaan kreikkalaisella ja kreikkalaisella aritmetiikalla ja saksalaisella algorismilla ja venäläisellä numerolaskennan viisaudella."
Siten ensimmäiset venäläiset matemaatikot ymmärsivät sanan "algoritmi" samalla tavalla kuin Länsi-Euroopassa. Se ei kuitenkaan ollut kuuluisassa V. I. Dahlin sanakirjassa eikä sata vuotta myöhemmin venäjän kielen selittävässä sanakirjassa, jonka toimitti D. N. Ushakov (1935). Mutta sana "algoritmi" löytyy suositusta vallankumousta edeltävästä Granat-veljesten Encyclopedic Dictionarysta ja vuonna 1926 julkaistusta Great Soviet Encyclopediasta (BSE) ensimmäisestä painoksesta . Sekä siellä että siellä sitä tulkitaan samalla tavalla. tapa: pääsääntöisesti, jonka mukaan tämä tai tämä neljästä aritmeettisesta operaatiosta desimaalilukujärjestelmässä. Kuitenkin 1900-luvun alussa. matemaatikoille sana "algoritmi" merkitsi jo mitä tahansa aritmeettista tai algebrallista prosessia, joka suoritetaan tiukasti määriteltyjen sääntöjen mukaan, ja tämä selitys annetaan myös TSB:n myöhemmissä painoksissa.
Algoritmeista tuli tutkijoiden kasvava huomio, ja vähitellen tämä käsite otti yhden modernin matematiikan keskeisistä paikoista. Mitä tulee matematiikasta kaukana oleviin ihmisiin, he saattoivat kuulla tämän sanan vasta 40-luvun alussa koulussa opiskellessaan yhdistelmässä "Eukleideen algoritmi". Tästä huolimatta algoritmia pidettiin edelleen puhtaasti teknisenä terminä, minkä vahvistaa se, että vähemmän laajoissa julkaisuissa ei ollut relevantteja artikkeleita. Erityisesti sitä ei ole edes kymmenen osaisen Small Soviet Encyclopediassa (1957), puhumattakaan yksiosaisista tietosanakirjoista. Mutta kymmenen vuotta myöhemmin, Suuren Neuvostoliiton Encyclopedian (1969) kolmannessa painoksessa , algoritmi on jo luonnehdittu yhdeksi matematiikan pääkategorioista, "jolla ei ole muodollista määritelmää yksinkertaisempien käsitteiden suhteen ja se on otettu suoraan kokemuksesta. " Kuten näemme, ero jopa TSB:n ensimmäisen painoksen tulkinnasta on silmiinpistävä! Algoritmista on tullut neljänkymmenen vuoden ajan yksi matematiikan keskeisistä käsitteistä, eikä sanaa sisällytetty enää tietosanakirjoihin, vaan sanakirjoihin. Esimerkiksi akateemisessa venäjän kielen sanakirjassa (1981) se esiintyy juuri terminä matematiikan alalta.
Samanaikaisesti algoritmin käsitteen kehittymisen kanssa sen laajentuminen puhtaasta matematiikasta muille alueille tapahtui vähitellen. Ja se alkoi tietokoneiden tulolla, jonka ansiosta sana "algoritmi" tuli vuonna 1985 kaikkiin tietojenkäsittelytieteen koulukirjoihin ja sai uuden elämän. Yleisesti voidaan sanoa, että hänen nykyinen maineensa liittyy suoraan tietokoneiden jakeluasteeseen. Esimerkiksi "Children Encyclopedia" (1959) kolmannessa osassa puhutaan paljon tietokoneista, mutta niistä ei ole vielä tullut jotain tuttua ja ne nähdään pikemminkin eräänlaisena valoisan, mutta melko kaukaisen tulevaisuuden attribuuttina. Näin ollen algoritmeja ei koskaan mainita sen sivuilla. Mutta jo 70-luvun alussa. Viime vuosisadalla, jolloin tietokoneet lakkasivat olemasta eksoottinen uteliaisuus, sana "algoritmi" on tulossa käyttöön nopeasti. Tietosanakirjajulkaisut tallentavat tämän herkästi. " Kybernetiikkatietosanakirjassa " (1974) artikkelissa "Algoritmi" se liittyy jo toteutukseen tietokoneissa, ja "Neuvostoliiton sotilastietosanakirjassa" (1976) jopa erillinen artikkeli "Algoritmi ongelman ratkaisemiseksi tietokoneessa " . tulee näkyviin.
Viimeisen puolentoista-kahden vuosikymmenen aikana tietokoneesta on tullut olennainen ominaisuus elämäämme, tietokoneen sanasto on tulossa yhä tutummaksi. Sana "algoritmi" on luultavasti kaikkien tiedossa nykyään. Se astui luottavaisesti jopa puhekieleen, ja nykyään tapaamme usein sanomalehdissä ja kuulemme poliitikkojen puheissa ilmaisuja, kuten "käyttäytymisalgoritmi", "menestysalgoritmi" tai jopa "petoksen algoritmi". Akateemikko N. N. Moiseev kutsui kirjaansa "Kehitysalgoritmeiksi" ja kuuluisa lääkäri N. M. Amosov kutsui sitä "terveysalgoritmiksi" ja "mielen algoritmiksi". Ja tämä tarkoittaa, että sana elää, rikastuen uusilla merkityksillä ja semanttisilla sävyillä.
Algoritmin erilaiset määritelmät, eksplisiittisesti tai implisiittisesti, sisältävät seuraavat yleiset vaatimukset:
Erilaiset matematiikan teoreettiset ongelmat sekä fysiikan ja tekniikan kehityksen kiihtyminen nostivat asialistalle algoritmin käsitteen tarkan määrittelyn.
Ensimmäiset yritykset selventää algoritmin käsitettä ja sen tutkimusta tekivät 1900-luvun alkupuoliskolla Alan Turing , Emil Post , Jacques Herbrand , Kurt Gödel , A. A. Markov , Alonzo Church . Algoritmin käsitteelle kehitettiin useita määritelmiä, mutta myöhemmin havaittiin, että ne kaikki määrittelevät saman käsitteen (katso Church-Turingin teesi ) [6]
Venäläinen matemaatikko, rakennelingvistiikan perustaja Neuvostoliitossa V. A. Uspensky uskoi, että algoritmin käsite ilmestyi ensimmäisen kerran Emil Borelissa vuonna 1912, artikkelissa määrätystä integraalista. Siellä hän kirjoitti "laskuista, jotka voidaan todella suorittaa", mutta korosti: "Jätän tarkoituksella sivuun enemmän tai vähemmän käytännön toiminnan; ydin tässä on, että jokainen näistä operaatioista on toteutettavissa rajallisessa ajassa luotettavan ja yksiselitteisen menetelmän avulla” [7] .
Turingin koneTuringin koneen perusidea on hyvin yksinkertainen. Turingin kone on abstrakti kone (automaatti), joka toimii yksittäisten solujen nauhalla, johon merkit kirjoitetaan. Koneessa on myös pää, jolla voit kirjoittaa ja lukea merkkejä soluista, jotka voivat liikkua nauhaa pitkin. Jokaisessa vaiheessa kone lukee merkin pään osoittamasta solusta ja ottaa luetun merkin ja sisäisen tilan perusteella seuraavan askeleen. Tässä tapauksessa kone voi muuttaa tilaansa, kirjoittaa soluun toisen merkin tai siirtää päätä yhden solun oikealle tai vasemmalle. [kahdeksan]
Näiden koneiden tutkimuksen perusteella esitettiin Turingin teesi (algoritmien päähypoteesi):
Jokin algoritmi jossain aakkostossa annetun funktion arvojen löytämiseksi on olemassa, jos ja vain jos funktio on Turingin arvioitava, eli kun se voidaan laskea Turingin koneella.
Tämä väitöskirja on aksiooma, postulaatti, eikä sitä voida todistaa matemaattisilla menetelmillä, koska algoritmi ei ole tarkka matemaattinen käsite.
Rekursiiviset funktiotJokainen algoritmi voidaan liittää funktioon, jonka se laskee. Herää kuitenkin kysymys, onko mahdollista liittää Turingin kone mielivaltaiseen funktioon, ja jos ei, niin mille funktioille on olemassa algoritmi? Näitä kysymyksiä koskeva tutkimus johti 1930-luvulla rekursiivisten funktioiden teorian luomiseen [9] .
Laskettavien funktioiden luokka kirjoitettiin kuvaan, joka muistutti jonkin aksioomajärjestelmään perustuvan aksiomaattisen teorian rakennetta. Ensin valittiin yksinkertaisimmat funktiot, joiden laskenta on ilmeistä. Sitten muotoiltiin säännöt (operaattorit) uusien funktioiden rakentamiselle olemassa olevien pohjalta. Tarvittava funktioluokka koostuu kaikista funktioista, jotka voidaan saada yksinkertaisimmalla operaattorisovelluksella.
Samalla tavalla kuin Turingin laskennallisten funktioiden teorian teesi, esitettiin olettamus, jota kutsutaan Churchin teesiksi :
Numeerinen funktio on algoritmisesti arvioitavissa silloin ja vain, jos se on osittain rekursiivinen.
Todiste siitä, että laskettavien funktioiden luokka osuu yhteen Turingin laskettavien funktioiden kanssa, tapahtuu kahdessa vaiheessa: ensin todistetaan yksinkertaisimpien funktioiden laskenta Turingin koneella ja sitten operaattorien soveltamisen tuloksena saatujen funktioiden laskenta.
Siten epävirallisesti algoritmi voidaan määritellä selkeäksi käskyjärjestelmäksi, joka määrittelee diskreetin deterministisen prosessin, joka johtaa lähtötiedoista (sisääntulossa) haluttuun tulokseen (ulostulossa), jos sellainen on olemassa, äärellisessä määrässä askeleet; jos haluttua tulosta ei ole, algoritmi joko ei pääty koskaan tai saavuttaa umpikujan.
Normaali algoritmi (algoritmi) MarkovNormaali Markovin algoritmi (algoritmi kirjoittajan kirjoituksessa) on peräkkäisten substituutioiden sovellusjärjestelmä, joka toteuttaa tietyt menettelyt uusien sanojen saamiseksi perussanoista, jotka on rakennettu tietyn aakkoston merkeistä. Kuten Turingin kone, normaalit algoritmit eivät suorita laskutoimituksia itse: ne suorittavat vain sanamuunnoksia korvaamalla kirjaimet annettujen sääntöjen mukaisesti [10] .
Normaalisti laskettava funktio on funktio, joka voidaan toteuttaa normaalilla algoritmilla. Eli algoritmi, joka muuttaa jokaisen sanan funktion kelvollisten tietojen joukosta sen alkuarvoiksi [11] ..
Normaalialgoritmien teorian luoja A. A. Markov esitti hypoteesin, jota kutsuttiin Markovin normalisointiperiaatteeksi:
Löytää jossain aakkostossa annetun funktion arvot, jos ja vain jos on jokin algoritmi, kun funktio on normaalisti numeroitavissa.
Kuten Turingin ja Churchin teesit, Markovin normalisointiperiaatetta ei voida todistaa matemaattisin keinoin.
Yllä oleva algoritmin muodollinen määritelmä voi kuitenkin joissain tapauksissa olla liian tiukka. Joskus on tarpeen käyttää satunnaismuuttujia [12] . Algoritmia, jonka toimintaa määrittävät paitsi lähtötiedot, myös satunnaislukugeneraattorilta saadut arvot, kutsutaan stokastiseksi (tai satunnaistetuksi, englanninkielisestä satunnaistetusta algoritmista ) [13] . Stokastiset algoritmit ovat usein tehokkaampia kuin deterministiset ja joissain tapauksissa ainoa tapa ratkaista ongelma [12] .
Käytännössä satunnaislukugeneraattorin sijasta käytetään pseudosatunnaislukugeneraattoria .
On kuitenkin syytä erottaa toisistaan stokastiset algoritmit ja menetelmät, jotka antavat oikean tuloksen suurella todennäköisyydellä. Toisin kuin menetelmä , algoritmi antaa oikeat tulokset myös pitkän ajon jälkeen.
Jotkut tutkijat myöntävät mahdollisuuden, että stokastinen algoritmi antaa väärän tuloksen tietyllä ennalta määrätyllä todennäköisyydellä. Sitten stokastiset algoritmit voidaan jakaa kahteen tyyppiin [14] :
Joidenkin tehtävien osalta yllä mainitut formalisoinnit voivat vaikeuttaa ratkaisujen löytämistä ja tutkimuksen tekemistä. Esteiden voittamiseksi kehitettiin molemmat modifikaatiot "klassisista" kaavoista ja luotiin uusia malleja algoritmista. Erityisesti voidaan nimetä:
Algoritmien tyypit loogisina ja matemaattisina keinoina heijastavat ihmisen toiminnan ja trendien osoitettuja komponentteja sekä itse algoritmeja riippuen tavoitteesta, ongelman alkuehdoista ja sen ratkaisutavoista. On syytä korostaa perustavaa laatua olevaa eroa laskennallisten algoritmien, jotka muuntavat osan tulodataa lähtötiedoiksi (niiden formalisaatio on edellä mainitut Turing-, Post-, PAM-koneet, normaalit Markov-algoritmit ja rekursiiviset funktiot) ja interaktiivisten algoritmien (Turing) välillä. on jo C-kone, englanninkielinen valinta - valinta, joka odottaa ulkoista vaikutusta, toisin kuin klassisessa A-koneessa, jossa kaikki lähtötiedot annetaan ennen laskennan alkua ja lähtötiedot ovat saatavilla vasta laskennan lopussa. laskelma). Jälkimmäiset on suunniteltu toimimaan vuorovaikutuksessa jonkin ohjausobjektin kanssa ja ne on suunniteltu varmistamaan oikea ohjaustoimintojen suorittaminen vallitsevasta tilanteesta riippuen, jotka heijastavat ohjausobjektista tulevat signaalit [15] [16] . Joissakin tapauksissa ohjausalgoritmi ei tarjoa työn valmistumista ollenkaan (esimerkiksi se ylläpitää loputonta odotussykliä tapahtumia, joihin annetaan sopiva reaktio), huolimatta siitä, että se on täysin oikein.
Algoritmit voidaan myös erottaa:
Algoritmien numeroinnilla on tärkeä rooli niiden tutkimisessa ja analysoinnissa [18] . Koska mikä tahansa algoritmi voidaan määrittää äärelliseksi sanaksi (esitetty jonkin aakkoston äärellisenä symbolijonona), ja äärellisen aakkoston kaikkien äärellisten sanojen joukko on laskettavissa , niin kaikkien algoritmien joukko on myös laskettavissa. Tämä tarkoittaa, että luonnollisten lukujen joukon ja algoritmijoukon välillä on yksi-yhteen-kuvaus, toisin sanoen mahdollisuus antaa numero jokaiselle algoritmille.
Algoritmien numerointi on samalla kaikkien algoritmisesti laskettujen funktioiden numerointi, ja millä tahansa funktiolla voi olla ääretön määrä numeroita.
Numeroinnin olemassaolo mahdollistaa työskentelyn algoritmien kanssa samalla tavalla kuin numeroiden kanssa. Numerointi on erityisen hyödyllistä tutkittaessa algoritmeja, jotka toimivat muiden algoritmien kanssa.
Algoritmin käsitteen formalisointi mahdollisti sellaisten ongelmien olemassaolon tutkimisen, joihin ei ole olemassa algoritmeja ratkaisujen löytämiseksi. Myöhemmin osoitettiin useiden ongelmien ratkaisujen algoritmisen laskennan mahdottomuus, mikä tekee mahdottomaksi ratkaista niitä millään tietokonelaitteella. Funktiota kutsutaan laskettavaksi , jos on olemassa Turingin kone , joka laskee arvon kaikille funktiomäärittelyjoukon elementeille. Jos tällaista konetta ei ole olemassa, funktion sanotaan olevan ei-laskettavissa. Funktion katsotaan olevan ei-laskettavissa, vaikka on olemassa Turingin koneita, jotka pystyvät laskemaan arvon koko syötejoukon osajoukolle [19] .
Tapausta, jossa funktion arvioinnin tulos on looginen lauseke "tosi" tai "epätosi" (tai joukko {0, 1}), kutsutaan ongelmaksi, joka voi olla ratkaistava tai ratkaisematon funktion laskettavuudesta riippuen. [19] .
On tärkeää määrittää tarkasti sallittu syöttötietojoukko, koska ongelma voi olla ratkaistavissa yhdelle joukolle ja ratkaisematon toiselle.
Yksi ensimmäisistä ongelmista, joiden ratkaisemattomuus osoitettiin, on pysäytysongelma . Se on muotoiltu seuraavasti:
Kun annetaan Turingin koneen ohjelman kuvaus, on määritettävä, päättyykö ohjelma äärellisessä ajassa vai ajaako se rajattomasti tietyllä syötteellä. [kaksikymmentä]
Pysäytysongelman ratkaisemattomuuden todistaminen on tärkeää, koska siihen voidaan lyhentää muita ongelmia. Esimerkiksi yksinkertainen pysähdystehtävä voidaan pelkistää pysäytysongelmaksi tyhjällä rivillä (kun täytyy määrittää tietylle Turingin koneelle, pysähtyykö se, kun se käynnistetään tyhjältä riviltä), mikä todistaa jälkimmäisen ratkaisemattomuuden. [19] .
Tietotekniikan leviämisen myötä ohjelmistovikojen riski on kasvanut. Yksi tapa välttää virheitä algoritmeissa ja niiden toteutuksissa on todistaa järjestelmien oikeellisuus matemaattisin keinoin.
Matemaattisten laitteiden käyttöä algoritmien ja niiden toteutusten analysointiin kutsutaan muodollisiksi menetelmiksi. Muodollisiin menetelmiin kuuluu muodollisten määritelmien käyttö ja yleensä joukko työkaluja spesifikaatioiden ominaisuuksien jäsentämiseen ja todistamiseen. Toteutustiedoista poistaminen mahdollistaa järjestelmän ominaisuuksien asettamisen riippumatta sen toteutuksesta. Lisäksi matemaattisten lausuntojen tarkkuus ja ainutlaatuisuus mahdollistavat luonnollisten kielten moniselitteisyyden ja epätarkkuuden välttämisen [21] .
Richard Macen hypoteesin mukaan "virheiden välttäminen on parempi kuin virheiden eliminointi" [22] . Hoaren oletuksen mukaan "ohjelmien todistaminen ratkaisee oikeellisuuden, dokumentoinnin ja yhteensopivuuden ongelman" [23] . Ohjelmien oikeellisuuden todistaminen antaa meille mahdollisuuden paljastaa niiden ominaisuudet suhteessa koko syötedata-alueeseen. Tätä varten oikeellisuuden käsite jaettiin kahteen tyyppiin:
Oikeuden todistamisen aikana ohjelman tekstiä verrataan halutun syöttö-lähtötietojen suhteen määrittelyyn. Hoare-tyyppisissä todisteissa määrittely on lauseiden muodossa, joita kutsutaan ennakko- ja jälkiehdoksi. Yhdessä itse ohjelman kanssa niitä kutsutaan myös Hoare-kolmioksi . Nämä lausunnot on kirjoitettu muodossa
{P}Q{S}missä P ovat ennakkoehtoja, joiden on oltava tosia ennen ohjelman Q suorittamista , ja S ovat jälkiehdot, jotka ovat tosia ohjelman päättymisen jälkeen.
Muodollisia menetelmiä on sovellettu menestyksekkäästi moniin ongelmiin, erityisesti: elektronisten piirien, tekoälyn, rautateiden automaattisten järjestelmien kehittäminen, mikroprosessorien todentaminen , standardien määrittely sekä ohjelmien määrittely ja todentaminen [24] .
Yleinen kriteeri algoritmien arvioinnissa on käyntiaika ja järjestys, jossa ajoaika kasvaa syötetyn tiedon määrästä riippuen. [25]
Jokaista tehtävää varten ne muodostavat tietyn luvun, jota kutsutaan sen kooksi. Esimerkiksi matriisien tulon laskentatehtävän koko voi olla suurin matriisitekijöiden koko, graafisissa tehtävissä koko voi olla graafin reunojen lukumäärä.
Aikaa, jonka algoritmi käyttää tehtävän koon funktiona, kutsutaan tämän algoritmin aikakompleksisuudeksi T ( n ). Tämän funktion käyttäytymisen asymptotiikkaa ongelman koon kasvaessa kutsutaan asymptoottiseksi aikakompleksisuudeksi, ja sen kuvaamiseen käytetään merkintää "O" big . Esimerkiksi jos algoritmi käsittelee syötetietoa ajassa cn² , jossa c on jokin vakio , niin tällaisen algoritmin aikamonimutkaisuuden sanotaan olevan O ( n² ).
Asymptoottinen monimutkaisuus on tärkeä, koska se on ominaisuus algoritmille, ei sen erityiselle toteutukselle: "optimoimalla" operaatiot, muuttamatta algoritmia, voidaan muuttaa vain kerrannaiskerrointa c , mutta ei asymptotiikkaa. Asymptoottinen monimutkaisuus on pääsääntöisesti se päätekijä, joka määrää algoritmin käsittelemien tehtävien koon.
Usein algoritmia kehitettäessä yritetään vähentää asymptoottista aikamonimutkaisuutta pahimmissa tapauksissa. Käytännössä on tapauksia, jolloin "yleensä" nopeasti toimiva algoritmi riittää.
Karkeasti ottaen keskimääräisen asymptoottisen aikamonimutkaisuuden analyysi voidaan jakaa kahteen tyyppiin: analyyttiseen ja tilastolliseen. Analyyttinen menetelmä antaa tarkempia tuloksia, mutta sitä on vaikea käyttää käytännössä. Mutta tilastollinen menetelmä mahdollistaa monimutkaisten ongelmien nopean analysoinnin [26] .
Seuraavassa taulukossa on lueteltu yleisimmät asymptoottiset kompleksit kommentteineen [27] .
Monimutkaisuus | Kommentti | Esimerkkejä |
---|---|---|
O (1) | Kestävä käyttöaika ei riipu tehtävän koosta | Odotettu hakuaika hash-taulukossa |
O ( kirjaudu sisään ) | Tarvittavan ajan erittäin hidas kasvu | n elementin interpoloivan haun odotettu suoritusaika |
O ( kirjaudu sisään ) | Logaritminen kasvu - Tehtävän koon kaksinkertaistaminen lisää suoritusaikaa vakiomäärällä | Laskenta x n ; Binäärihaku n elementin joukosta |
O ( n ) | Lineaarinen kasvu – tehtävän koon kaksinkertaistaminen kaksinkertaistaa tarvittavan ajan | Lukujen yhteen-/vähennys n numerosta; Lineaarinen haku n elementin joukosta |
O ( n log n ) | Lineaarinen kasvu - Tehtävän koon kaksinkertaistaminen hieman yli kaksinkertaistaa vaaditun ajan | Lajittele yhdistämisen tai n elementin joukon mukaan; lajittele alaraja vastaamalla n elementtiä |
O ( n² ) | Neliöllinen kasvu - Tehtävän koon kaksinkertaistaminen nelinkertaistaa vaaditun ajan | Peruslajittelualgoritmit _ |
O ( n³ ) | Kuutiokasvu - Tehtävän koon kaksinkertaistaminen lisää tarvittavaa aikaa kahdeksan kertaa | Tavallinen matriisi kertolasku |
O ( c n ) | Eksponentiaalinen kasvu - tehtävän koon kasvattaminen yhdellä johtaa tarvittavan ajan c - kertaiseen kasvuun; tehtävän koon kaksinkertaistaminen neliöttää vaaditun ajan | Jotkut matkustavan myyjän ongelmat , raa'an voiman hakualgoritmit |
Algoritmi on tarkasti määritelty ohje, jota soveltamalla peräkkäin lähtötietoihin saat ratkaisun ongelmaan. Jokaiselle algoritmille on olemassa tietty joukko objekteja, joita voidaan käyttää syöttötietoina. Esimerkiksi reaalilukujen jakamisalgoritmissa osinko voi olla mikä tahansa, eikä jakaja voi olla yhtä suuri kuin nolla.
Algoritmi ei yleensä ratkaise yhtä tiettyä ongelmaa, vaan tietyn luokan ongelmia. Joten summausalgoritmia voidaan soveltaa mihin tahansa luonnollisten lukujen pariin. Tämä ilmaisee sen massaominaisuuden, eli kyvyn käyttää samaa algoritmia toistuvasti mihin tahansa saman luokan tehtävään.
Algoritmien ja ohjelmien kehittämiseen käytetään algoritmisointia - algoritmien systemaattista kokoamista sovellettujen ongelmien ratkaisemiseksi. Algoritmisointia pidetään pakollisena vaiheena ohjelmien kehittämisessä ja ongelmien ratkaisemisessa tietokoneella. Juuri sovelletuille algoritmeille ja ohjelmille determinismi, tehokkuus ja massaluonne sekä asetettujen tehtävien ratkaisutulosten oikeellisuus ovat oleellisen tärkeitä.
Algoritmi on selkeä ja tarkka ohje esiintyjälle suorittaa sarja toimenpiteitä tavoitteen saavuttamiseksi.
Algoritmien merkintämuodot:
Yleensä aluksi (ideatasolla) algoritmi kuvataan sanoin, mutta toteutusta lähestyttäessä se saa yhä enemmän muodollisia ääriviivoja ja muotoilua esittäjän ymmärtämällä kielellä (esim. konekoodi ).
Vaikka algoritmin määrittely vaatii vain rajallisen määrän vaiheita, jotka vaaditaan tuloksen saavuttamiseksi, käytännössä valtavan määrän vaiheiden toteuttaminen johtaa ohjelmien pitkäkestoiseen suorittamiseen, ja yleensä on muita rajoituksia (koolla). ohjelma, sallituista toimista). Tässä yhteydessä esitellään sellaisia käsitteitä kuin algoritmin monimutkaisuus ( aika , ohjelman koko, laskennallinen ja muut).
Jokaiselle tehtävälle voi olla useita algoritmeja, jotka johtavat tavoitteeseen. Algoritmien tehokkuuden lisääminen on yksi tietojenkäsittelytieteen ongelmista, 1940 -luvulta lähtien tähän liittyen on rakennettu useita asymptoottisesti tehokkaampia algoritmeja perinteisiin ongelmiin (esim. nopeat kertolaskualgoritmit , Chudnovskyn algoritmi numeron laskeminen ).
Euklidesin algoritmi on tehokas menetelmä suurimman yhteisen jakajan (gcd) laskemiseen. Nimetty kreikkalaisen matemaatikon Euclidin mukaan; yksi vanhimmista edelleen käytössä olevista algoritmeista [28] .
Kuvattu Eukleideen "alkuissa" (noin 300 eKr.), nimittäin kirjoissa VII ja X. Seitsemännessä kirjassa kuvataan kokonaislukujen algoritmi ja kymmenennessä segmenttien pituuksille.
Algoritmista on useita muunnelmia, alla on pseudokoodilla kirjoitettu rekursiivinen versio :
funktio solmu(a, b) jos b = 0 palauttaa muuten palauttaa solmun (b, a mod b)GCD numeroista 1599 ja 650:
Vaihe 1 | 1599 = 650*2 + 299 |
Vaihe 2 | 650 = 299*2 + 52 |
Vaihe 3 | 299 = 52*5 + 39 |
Vaihe 4 | 52 = 39*1 + 13 |
Vaihe 5 | 39 = 13*3 + 0 |
Sanakirjat ja tietosanakirjat | ||||
---|---|---|---|---|
|