Algoritmi

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 25. tammikuuta 2022 tarkistetusta versiosta . tarkastukset vaativat 10 muokkausta .

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 .

Termin historia

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ä.

Algoritmien määritelmät

Algoritmien ominaisuudet

Algoritmin erilaiset määritelmät, eksplisiittisesti tai implisiittisesti, sisältävät seuraavat yleiset vaatimukset:

Muodollinen määritelmä

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 kone

Turingin 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 funktiot

Jokainen 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) Markov

Normaali 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.

Stokastiset algoritmit

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] :

Muut formalisoinnit

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ä:

  • moninauhaiset ja ei-deterministiset Turingin koneet;
  • rekisteri ja RAM-kone  - nykyaikaisten tietokoneiden ja virtuaalikoneiden prototyyppi;
  • äärelliset ja soluautomaatit

Algoritmien tyypit

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:

  • Mekaaniset algoritmit tai muutoin deterministiset , jäykät (esim. koneen, moottorin tms. toiminnan algoritmit) - asettavat tiettyjä toimintoja, jotka merkitsevät ne yhtenä ja luotettavana sekvenssinä, jolloin saadaan yksiselitteinen vaadittu tai haluttu tulos, jos ne prosessiolosuhteet täyttyvät tehtävät, joita varten algoritmi on kehitetty.
  • Joustavat algoritmit , kuten stokastiset, eli probabilistiset ja heuristiset.
  • Probabilistinen (stokastinen) algoritmi antaa ohjelman ongelman ratkaisemiseksi useilla tavoilla tai tavoilla, jotka johtavat tuloksen todennäköiseen saavuttamiseen.
  • Heuristinen algoritmi (kreikan sanasta " eureka ") - algoritmi, joka käyttää erilaisia ​​järkeviä näkökohtia ilman tiukkoja perusteluja [17] .
  • Lineaarinen algoritmi  on joukko komentoja (käskyjä), jotka suoritetaan peräkkäin ajassa peräkkäin.
  • Haaroitusalgoritmi  on algoritmi, joka sisältää vähintään yhden ehdon, jonka seurauksena algoritmin jako useisiin vaihtoehtoisiin haaroihin voidaan suorittaa.
  • Syklinen algoritmi  on algoritmi, joka sisältää toistuvan saman toiminnon (samat toiminnot). Suurin osa laskentamenetelmistä ja vaihtoehtojen luettelointi on pelkistetty syklisiksi algoritmeiksi. Ohjelmasykli on sarja komentoja (sarja, syklin runko), joka voidaan suorittaa useita kertoja.
  • Apualgoritmi ( alisteinen ) on algoritmi , joka on aiemmin kehitetty ja jota on käytetty kokonaan tietyn ongelman algoritmisoinnissa. Joissakin tapauksissa, jos eri datalle on identtiset käskysarjat (komennot), erotetaan myös apualgoritmi tietueen lyhentämiseksi. Kaikissa valmisteluvaiheissa ongelman algoritmisointiin käytetään laajasti algoritmin rakenteellista esitystapaa.
  • Rakenteellinen lohkokaavio , algoritmin graafinen kaavio - algoritmin  graafinen esitys nuolilla (siirtymäviivoilla) yhdistettyjen lohkojen kaavion muodossa - graafiset symbolit, joista jokainen vastaa yhtä algoritmin vaihetta. Lohkon sisällä on kuvaus vastaavasta toimenpiteestä. Algoritmin graafista esitystapaa käytetään laajalti ennen tehtävän ohjelmointia sen selkeyden vuoksi, koska visuaalinen havainto helpottaa yleensä ohjelman kirjoittamista, sen korjaamista mahdollisten virheiden varalta sekä tiedonkäsittelyprosessin ymmärtämistä. Voit jopa kohdata tällaisen lausunnon: "Ulkopuolisesti algoritmi on kaavio - joukko suorakulmioita ja muita symboleja, joiden sisään se kirjoitetaan, mitä lasketaan, mitä syötetään koneeseen ja mitä tulostetaan ja mitä muuta. keino näyttää tietoa."

Algoritmin numerointi

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.

Algoritmisesti ratkaisemattomia ongelmia

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] .

Algoritmien analyysi

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:

  • Osittain oikein  - ohjelma antaa oikean tuloksen niissä tapauksissa, kun se lopettaa.
  • Täysi oikeellisuus  - ohjelma lopettaa ja tuottaa oikean tuloksen kaikille syötetietoalueen elementeille.

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] .

Aukioloajat

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

Lähtötietojen ja jonkin tuloksen olemassaolo

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 esitys

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 ).

Algoritmien tehokkuus

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 ).

Esimerkki

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

Katso myös

Muistiinpanot

  1. Semenov A. L. ALGORITMI . Suuri venäläinen tietosanakirja. Sähköinen versio (2016). Haettu 29. lokakuuta 2018. Arkistoitu alkuperäisestä 30. lokakuuta 2018.
  2. Kleene 1943 Davisissa 1965: 274
  3. Rosser 1939 Davisissa 1965: 225
  4. Knuth, 2006 , 1.1. Algoritmit.
  5. Robert Andrew Wilson, Frank C. Keil. MIT Encyclopedia of the Cognitive Sciences . - MIT Press, 2001. - S. 11. - 1106 s. — ISBN 9780262731447 . Arkistoitu 17. marraskuuta 2021 Wayback Machinessa
  6. (Igoshin, s. 317)
  7. V. A. Uspensky: "Matematiikka on humanitaarinen tiede"  // Trinity Variant. - 2014. - 28. tammikuuta ( nro 2 (146) ). - s. 4-6 . Arkistoitu alkuperäisestä 27. marraskuuta 2018.
  8. Perusteet: Turingin kone (tulkin kanssa!) . Good Math, Bad Math (9. helmikuuta 2007). Arkistoitu alkuperäisestä 2. helmikuuta 2012.
  9. (Igoshin, jakso 33)
  10. Encyclopedia of Cybernetics , osa 2 , s. 90-91.
  11. (Igoshin, jakso 34)
  12. 1 2 "Todennäköisyyspohjaisia ​​algoritmeja ei pidä sekoittaa menetelmiin (jotka kieltäydyn kutsumasta algoritmeiksi), jotka tuottavat tuloksen, jonka oikea todennäköisyys on suuri. On oleellista, että algoritmi tuottaa oikeat tulokset (inhimilliset tai tietokonevirheet huomioimatta), vaikka tämä tapahtuisi hyvin pitkän ajan kuluttua." Henri Cohen. Laskennallisen algebrallisen lukuteorian kurssi  . - Springer-Verlag , 1996. - s  . 2 . — ISBN 3-540-55640-0 .
  13. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rives't, Clifford Stein. Johdatus  algoritmeihin . - 2. - MIT Press , 2001. - S. 531. - ISBN 0-262-03293-7 .
  14. (Osa 12, s. 12-22, Atallah, 2010)
  15. Dina Goldin, Peter Wegner. Turingin teesi myytin alkuperä , CS-04-14, lokakuu 2004
  16. Interaktiivinen laskenta on tehokkaampaa kuin ei-interaktiivinen Arkistoitu 19. marraskuuta 2015 Wayback Machinessa , c2.com
  17. M. Gary, D. Johnson, Tietojenkäsittelykoneet ja vaikeat ongelmat, M .: Mir, 1982, C. 155.
  18. (Igoshin, jakso 36)
  19. 1 2 3 Peter Linz. Johdatus muodollisiin kieliin ja  automaatteihin . — Jones and Bartlett Publishers, 2000. - ISBN 0-7637-1422-4 .
  20. Lasketettavuus ja monimutkaisuus, Encyclopedia of Computer Science and Technology , Facts On File, 2009, ISBN 978-0-8160-6382-6 . 
  21. (O'Regan, osio 4.5)
  22. (osio 5.3.6, Enders, 2003)
  23. (osio 5.3.7, Enders, 2003)
  24. (O'Regan, s. 119)
  25. A. Aho , J. Hopcroft , J. Ullman . Laskennallisten algoritmien rakentaminen ja analyysi = The Design and Analysis of Computer Algorithms . - M . : "Mir", 1979.
  26. (Atallah, jakso 11, 2010)
  27. (osio 1 kirjassa Atallah, 2010)
  28. Knuth D. Tietokoneohjelmoinnin taito, osa 2 : Puolinumeeriset algoritmit  . – 3. — Addison–Wesley , 1997. — ISBN 0201896842 .

Kirjallisuus

  • Thomas H. Cormen, Charles I. Leiserson, Ronald L. Rivest, Clifford Stein. Algoritmit: rakentaminen ja analyysi = Johdanto algoritmeihin, kolmas painos. - 3. - M. : "Williams" , 2013. - 1328 s. - ISBN 978-5-8459-1794-2 .
  • Donald Knuth . The Art of Computer Programming = The Art of Computer Programming, voi. 1. Perusalgoritmit. - 3. painos - M . : "Williams" , 2006. - V. 1. Perusalgoritmit. - S. 720. - ISBN 0-201-89683-4 .
  • Thomas H. Cormen. Algoritmit: Johdantokurssi = Algoritmit auki. - M. : "Williams" , 2014. - 208 s. — ISBN 978-5-8459-1868-0 .
  • Igoshin VI Matemaattinen logiikka ja algoritmien teoria. - 2. painos, poistettu .. - M . : Tietokeskus "Akatemia", 2008. - 448 s. — ISBN 5-7695-1363-2 .

Linkit

  • " Sana "algoritmi": alkuperä ja kehitys ", V. V. Shilov, Potentiaalinen aikakauslehti  - historiallisen tiedon lähde.
  • Tietoja algoritmista  (pääsemätön linkki 22-05-2013 [3452 päivää] - historia ,  kopio ) tietosanakirjassa "Maailman ympäri"