Algoritm

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 25 januari 2022; kontroller kräver 10 redigeringar .

Algoritm ( lat.  algorithmi  - på uppdrag av den centralasiatiska matematikern Al-Khwarizmi [1] ) är en ändlig uppsättning exakt definierade regler för att lösa en viss klass av problem eller en uppsättning instruktioner som beskriver proceduren för utföraren att lösa en specifik problem. I den gamla tolkningen användes ordet "sekvens" istället för ordet "ordning", men när parallellismen i datorernas arbete utvecklades började ordet "sekvens" ersättas med det mer allmänna ordet "ordning". Oberoende instruktioner kan utföras i en godtycklig ordning, parallellt, om de exekutörer som används tillåter det.

Tidigare på ryska skrev de "algori f m", nu används denna stavning sällan, men det finns ändå ett undantag ( normal Markov- algoritm ).

Ofta fungerar en dator som en exekutor, men begreppet en algoritm hänvisar inte nödvändigtvis till datorprogram  - till exempel är ett tydligt beskrivet recept för att tillaga en maträtt också en algoritm, i vilket fall exekutören är en person (eller kanske någon mekanism, till exempel en vävning eller svarv med numerisk kontroll ).

Det är möjligt att peka ut beräkningsalgoritmer ( vidare pratar vi huvudsakligen om dem) och kontrollera sådana . Beräkningsalgoritmer omvandlar faktiskt vissa initiala data till utdata och realiserar beräkningen av någon funktion. Semantiken för kontrollalgoritmer kan skilja sig avsevärt och kommer till att utfärda de nödvändiga kontrollåtgärderna antingen vid givna tidpunkter eller som ett svar på externa händelser (i detta fall, till skillnad från en beräkningsalgoritm, kan kontrollalgoritmen förbli korrekt för oändlig exekvering).

Begreppet en algoritm hänvisar till de ursprungliga, grundläggande, grundläggande begreppen inom matematik. Beräkningsprocesser av algoritmisk natur (arithmetiska operationer på heltal, hitta den största gemensamma delaren av två tal, etc.) har varit kända för mänskligheten sedan urminnes tider. Men i en explicit form bildades begreppet en algoritm först i början av 1900-talet.

Partiell formalisering av begreppet en algoritm började med försök att lösa upplösningsproblemet ( tyska:  Entscheidungsproblem ) , som formulerades av David Hilbert 1928 . Följande formaliseringssteg var nödvändiga för att definiera effektiv beräkning [2] eller "effektiv metod" [3] ; sådana formaliseringar inkluderar Gödel  - Herbran-  Kleene rekursiva funktioner från 1930 , 1934 och 1935  , Alonzo Churchs λ-kalkyl från 1936  , Emil Posts formulering 1 från 1936 och Turing-maskinen .

Termens historia

Den moderna formella definitionen av en beräkningsalgoritm gavs på 30-50-talet av XX-talet i verk av Turing , Post , Church ( Church-Turing-avhandling ), N. Wiener , A. A. Markov .

Själva ordet "algoritm" kommer från namnet på den persiske ( Khorezm och Maverannakhr ) vetenskapsmannen al-Khorezmi . Omkring 825 skrev han verket Kitab al-jabr wal-muqabala ("Boken om addition och subtraktion"), från den ursprungliga titeln som kommer ordet " algebra " (al-jabr - fullbordan). I den här boken gav han för första gången en beskrivning av det positionella decimaltalssystem som uppfanns i Indien. Det persiska originalet av boken har inte överlevt. Al-Khwarizmi formulerade reglerna för beräkning i det nya systemet och använde förmodligen för första gången siffran 0 för att indikera en saknad position i notationen av ett tal (araberna översatte dess indiska namn som as-sifr eller helt enkelt sifr , därav ord som "siffra" och "chiffer"). Ungefär samtidigt började andra arabiska forskare använda indiska siffror.

Under första hälften av 1100-talet trängde boken om al-Khwarizmi i latinsk översättning in i Europa. Översättaren, vars namn inte har kommit till oss, gav den namnet Algoritmi de numero Indorum ("Algorithmer om det indiska kontot") - sålunda placerades det latiniserade namnet på den centralasiatiska vetenskapsmannen i bokens titel. Idag tror man att ordet "algoritm" kom till europeiska språk just på grund av denna översättning. Under de kommande århundradena dök många andra verk ägnade åt samma fråga - lära ut konsten att räkna med siffror, och alla hade ordet algoritmi eller algorismi i titeln .

Senare författare visste ingenting om al-Khwarizmi, men eftersom den första översättningen av boken börjar med orden: "Dixit algorizmi: ..." ("Al-Khwarizmi sa: ..."), associerade de fortfarande detta ord med namnet på en viss person. Versionen om bokens grekiska ursprung var mycket vanlig. I ett anglo-normandiskt manuskript från 1200-talet , skrivet på vers, läser vi:

Algorismen uppfanns i Grekland .

Detta är en del av aritmetiken . Det uppfanns av en mästare vid namn Algorism, som gav honom sitt namn. Och eftersom han hette Algorism,

Han kallade sin bok Algorism.

Omkring 1250 skrev den engelske astronomen och matematikern John of Sacrobosco Algorismus vulgaris om aritmetik , som blev huvudläroboken om beräkningar i decimalpositionell notation vid många europeiska universitet i århundraden. I inledningen namngav Sacrobosco en vis man vid namn Algus som författare till vetenskapen om räkning . Och i den populära medeltida dikten " Rosens romantik " (1275-1280) av Jean de Meun ställs den "grekiske filosofen Algus" i paritet med Platon , Aristoteles , Euklid och Ptolemaios ! Det fanns också en stavning av namnet Argus ( Argus ). Och även om Argo- skeppet enligt antik grekisk mytologi byggdes av Jason , tillskrevs skeppets konstruktion till denna Argo.

"Mästare Algus" (eller Argus) blev personifieringen av räknekonsten i den medeltida litteraturen. Och i den redan nämnda "Roman of the Rose", och i den berömda italienska dikten "The Flower", skriven av Durante , finns det fragment som säger att även "mestre Argus" inte kommer att kunna räkna hur många gånger älskare bråkar och gör fred. Den engelske poeten Geoffrey Chaucer i dikten " The Book of the Duchess " ( 1369  ) skriver att inte ens "the glorious counter Argus" (ädel countour Argu) kommer att kunna räkna monstren som dök upp i mardrömslika visioner för hjälten.

Men med tiden blev matematiker mindre och mindre intresserade av sådana förklaringar, och ordet algorism (eller algorismus ), som alltid fanns i titlarna på matematiska verk, fick betydelsen av ett sätt att utföra aritmetiska operationer med arabiska siffror, att är på pappret utan att använda en kulram . Det är i denna mening som den kom in på många europeiska språk . Till exempel märkt "föråldrad". den finns i den representativa ordboken för engelskspråkiga Webster's New World Dictionary , publicerad 1957.  Encyclopedic Dictionary of Brockhaus and Efron erbjuder följande tolkning: algoritmen (förresten, före revolutionen användes stavningen algoritm , genom fita ) produceras "från det arabiska ordet Al-Goremm, det vill säga rot".

Algoritm är konsten att räkna med siffror, men till en början syftade ordet "tal" bara på noll. Den berömda franska truvern Gautier de Coincy (Gautier de Coincy, 1177-1236) använde i en av sina dikter orden algorismus-chiffer (som betydde siffran 0) som en metafor för att karakterisera en absolut värdelös person. Uppenbarligen krävde förståelsen av en sådan bild lämplig förberedelse av lyssnarna, vilket innebär att det nya nummersystemet redan var ganska välkänt för dem.

Under många århundraden var kulramen faktiskt det enda sättet för praktiska beräkningar; det användes av köpmän, växlare och vetenskapsmän. Fördelarna med beräkningar på en räknebräda förklarades i hans skrifter av en så framstående tänkare som Herbert av Avrilaksky (938-1003), som blev påve 999 under namnet Sylvester II. Det nya tog sig fram med stor svårighet, och matematikens historia innefattade en envis motsättning mellan algoritmernas och abacisternas läger (ibland kallade herbekister), som förespråkade användningen av kulram i stället för arabiska siffror för beräkningar. Intressant nog var den berömda franske matematikern Nicolas Chuquet (Nicolas Chuquet, 1445-1488) inskriven i registret över skattebetalare i staden Lyon som en algoritm (algoritm). Men det gick mer än ett sekel innan den nya räknemetoden äntligen etablerades, så mycket tid krävdes för att utveckla allmänt erkända notationer, förbättra och anpassa beräkningsmetoder för att skriva på papper. I Västeuropa fortsatte lärare i aritmetik att kallas "mästare i kulramen" fram till 1600-talet , som till exempel matematikern Niccolò Tartaglia (1500-1557).

Så skrifter om konsten att räkna kallades Algoritmer . Av de många hundra kan man peka ut sådana ovanliga som avhandlingen Carmen de Algorismo (latin carmen och betyder poesi) skriven på vers av Alexander de Villa Dei (d. 1240) eller den wienske astronomen och matematikern George Purbachs lärobok ( Georg Peurbach, 1423-1461) Opus algorismi jocundissimi ("En roligaste uppsats om algoritmen").

Gradvis utökades betydelsen av ordet. Forskare började tillämpa det inte bara på rent beräkningstekniska, utan också på andra matematiska procedurer. Till exempel, runt 1360, skrev den franske filosofen Nicolaus Oresme (1323/25-1382) den matematiska avhandlingen Algorismus proportionum (“Proportionsberäkning”), där han först använde potenser med bråkexponenter och faktiskt kom nära tanken på logaritmer. När kulramen ersattes av den så kallade räkningen på linjerna, började många manualer på den att kallas Algorithmus linealis , det vill säga reglerna för att räkna på linjerna.

Du kan vara uppmärksam på det faktum att efter en tid förlorade den ursprungliga formen algorismi den sista bokstaven, och ordet fick en mer bekväm form för europeisk uttalsalgoritm . Senare genomgick den i sin tur en förvrängning, troligen förknippad med ordet aritmetik .

År 1684 använde Gottfried Leibniz , i Nova Methodvs pro maximis et minimis, itemque tangentibus... , först ordet "algoritm" ( Algorithmo ) i en ännu vidare mening: som ett systematiskt sätt att lösa problem i differentialkalkyl.

1700-talet , i en av de tyska matematiska ordböckerna, Vollstandiges mathematisches Lexicon (publicerad i Leipzig 1747 )  , förklaras termen algoritm fortfarande som begreppet fyra aritmetiska operationer. Men denna betydelse var inte den enda, eftersom den matematiska vetenskapens terminologi på den tiden fortfarande bildades. I synnerhet användes uttrycket algorithmus infinitesimalis på sätt att utföra operationer på infinitesimala värden. Ordet algoritm användes också av Leonard Euler , vars ett verk heter "Using a new algorithm to solve the Pell problem" ( De usu novi algorithmi in problemate Pelliano solvendo ). Vi ser att Eulers förståelse av algoritmen som en synonym för metoden att lösa problemet redan ligger mycket nära den moderna.

Det tog dock nästan två århundraden till innan alla gamla betydelser av ordet försvann. Denna process kan spåras av exemplet på penetrationen av ordet "algoritm" i det ryska språket.

Historiker daterar en av listorna i den gamla ryska aritmetikläroboken, känd som "Räknevisdom", till 1691 . Detta verk är känt i många versioner (de tidigaste av dem är nästan hundra år äldre) och går tillbaka till ännu äldre manuskript från 1500  -talet. Enligt dem kan man spåra hur kunskapen om arabiska siffror och reglerna för att hantera dem gradvis spreds i Ryssland. Den fullständiga titeln på den här läroboken är "Denna bok, talad i grekisk och grekisk aritmetik, och i tysk algoritm, och i rysk sifferräkningsvisdom."

Således förstod de första ryska matematikerna ordet "algoritm" på samma sätt som i Västeuropa. Det fanns dock inte i V. I. Dahls berömda ordbok , inte heller hundra år senare i Förklarande ordbok för det ryska språket, redigerad av D. N. Ushakov (1935). Men ordet "algoritm" finns i den populära förrevolutionära Encyclopedic Dictionary of the Granat brothers och i den första upplagan av Great Soviet Encyclopedia (BSE), publicerad 1926. Både där och där tolkas det i samma sätt: som regel, enligt vilken detta eller det av fyra aritmetiska operationer i decimaltalssystemet. Men i början av 1900-talet. för matematiker betydde ordet "algoritm" redan varje aritmetisk eller algebraisk process utförd enligt strikt definierade regler, och denna förklaring ges också i efterföljande utgåvor av TSB.

Algoritmer blev föremål för ökande uppmärksamhet av forskare, och gradvis tog detta koncept en av de centrala platserna i modern matematik. När det gäller människor som är långt ifrån matematik, i början av fyrtiotalet kunde de bara höra detta ord när de studerade i skolan, i kombinationen "Euklids algoritm". Trots detta uppfattades algoritmen fortfarande som en rent teknisk term, vilket bekräftas av frånvaron av relevanta artiklar i mindre voluminösa publikationer. I synnerhet finns det inte ens i den tiodelade Small Soviet Encyclopedia (1957), för att inte tala om encyklopediska ordböcker i en volym. Men tio år senare, i den tredje upplagan av Great Soviet Encyclopedia (1969), karakteriseras algoritmen redan som en av matematikens huvudkategorier, "som inte har en formell definition i termer av enklare begrepp, och abstraherad direkt från erfarenhet. " Som vi kan se är skillnaden till och med från tolkningen av den första upplagan av TSB slående! I fyrtio år har algoritmen blivit ett av matematikens nyckelbegrepp, och införandet av ordet fanns inte längre i uppslagsverk, utan i ordböcker. Till exempel finns det i den akademiska ordboken för det ryska språket (1981) precis som en term från matematikområdet.

Samtidigt med utvecklingen av begreppet en algoritm, skedde gradvis dess expansion från ren matematik till andra områden. Och det började med tillkomsten av datorer, tack vare vilket ordet "algoritm" kom in 1985 i alla skolböcker i datavetenskap och fick ett nytt liv. I allmänhet kan vi säga att hans nuvarande berömmelse är direkt relaterad till graden av distribution av datorer. Till exempel i tredje volymen av "Barnens uppslagsverk" (1959) sägs det mycket om datorer, men de har ännu inte blivit något bekant och uppfattas snarare som ett slags attribut för en ljus, men ganska avlägsen framtid. Följaktligen nämns aldrig algoritmerna på dess sidor. Men redan i början av 70-talet. av förra seklet, när datorer upphörde att vara en exotisk kuriosa, börjar ordet "algoritm" snabbt användas. Detta är känsligt registrerat av encyklopediska publikationer. I " Encyclopedia of Cybernetics " (1974) i artikeln "Algorithm" är det redan förknippat med implementering på datorer, och i "Sovjet Military Encyclopedia" (1976) till och med en separat artikel "Algorithm för att lösa ett problem på en dator " visas.

Under de senaste ett och ett halvt till två decennier har datorn blivit en integrerad egenskap i vårt liv, datorvokabulär blir mer och mer bekant. Ordet "algoritm" är förmodligen känt för alla nuförtiden. Det klev självsäkert även in i vardagligt tal, och idag träffas vi ofta i tidningarna och hör i politikertal uttryck som "beteendealgoritm", "framgångsalgoritm" eller till och med "svekalgoritm". Akademiker N. N. Moiseev kallade sin bok "Utvecklingsalgoritmer", och den berömda läkaren N. M. Amosov kallade den  "Hälsoalgoritm" och "Mind Algorithms". Och detta betyder att ordet lever, berikar sig med nya betydelser och semantiska nyanser.

Algoritmdefinitioner

Egenskaper för algoritmer

Olika definitioner av algoritmen, explicit eller implicit, innehåller följande uppsättning allmänna krav:

Formell definition

Olika teoretiska problem inom matematik och accelerationen av utvecklingen av fysik och teknik satte på agendan en exakt definition av begreppet en algoritm.

De första försöken att klargöra begreppet en algoritm och dess forskning utfördes under första hälften av 1900-talet av Alan Turing , Emil Post , Jacques Herbrand , Kurt Gödel , A. A. Markov , Alonzo Church . Flera definitioner av begreppet en algoritm utvecklades, men det visade sig senare att de alla definierar samma begrepp (se Church-Turing-avhandlingen ) [6]

Den ryske matematikern, grundaren av strukturell lingvistik i Sovjetunionen V. A. Uspensky trodde att begreppet en algoritm först dök upp i Emil Borel 1912, i en artikel om en bestämd integral. Där skrev han om "beräkningar som faktiskt kan genomföras", samtidigt som han betonade: "Jag lämnar medvetet mer eller mindre praktisk verksamhet åt sidan; kärnan här är att var och en av dessa operationer är genomförbara på en begränsad tid med hjälp av en pålitlig och entydig metod” [7] .

Turingmaskin

Grundidén bakom Turing-maskinen är väldigt enkel. En Turingmaskin är en abstrakt maskin (automat) som arbetar med ett band av enskilda celler där tecken skrivs. Maskinen har även ett huvud för att skriva och läsa tecken från cellerna, som kan röra sig längs bandet. Vid varje steg läser maskinen ett tecken från cellen som huvudet pekar på och tar, baserat på det lästa tecknet och det interna tillståndet, nästa steg. I det här fallet kan maskinen ändra sitt tillstånd, skriva ett annat tecken till cellen eller flytta huvudet en cell till höger eller vänster. [åtta]

Baserat på studiet av dessa maskiner lades Turings tes (huvudhypotesen för algoritmer) fram:

Någon algoritm för att hitta värdena för en funktion som ges i något alfabet finns om och bara om funktionen är Turing-utvärderbar, det vill säga när den kan beräknas på en Turing-maskin.

Denna tes är ett axiom, ett postulat och kan inte bevisas med matematiska metoder, eftersom algoritmen inte är ett exakt matematiskt begrepp.

Rekursiva funktioner

Varje algoritm kan associeras med en funktion som den beräknar. Frågan uppstår dock om det är möjligt att associera en Turing-maskin med en godtycklig funktion, och om inte, för vilka funktioner finns det en algoritm? Forskning om dessa frågor ledde till skapandet på 1930-talet av teorin om rekursiva funktioner [9] .

Klassen av beräkningsbara funktioner skrevs i en bild som liknar konstruktionen av någon axiomatisk teori baserad på ett system av axiom. Först valdes de enklaste funktionerna, vars beräkning är uppenbar. Därefter formulerades reglerna (operatörerna) för att konstruera nya funktioner utifrån befintliga. Den nödvändiga klassen av funktioner består av alla funktioner som kan erhållas från den enklaste tillämpningen av operatörer.

I likhet med Turings avhandling i teorin om beräkningsbara funktioner, framfördes en gissning, som kallas kyrkans avhandling :

En numerisk funktion är algoritmiskt utvärderbar om och endast om den är delvis rekursiv.

Beviset på att klassen av beräkningsbara funktioner sammanfaller med Turing-beräknbara funktioner sker i två steg: först bevisas beräkningen av de enklaste funktionerna på en Turing-maskin, och sedan beräkningen av funktioner som erhålls som ett resultat av att tillämpa operatorer.

Således kan en algoritm informellt definieras som ett tydligt system av instruktioner som definierar en diskret deterministisk process som leder från initialdata (vid ingången) till det önskade resultatet (vid utgången), om den finns, i ett ändligt antal steg; om det önskade resultatet inte existerar, slutar algoritmen antingen aldrig eller når en återvändsgränd.

Normal algoritm (algoritm) Markov

En normal algoritm (algoritm i författarens skrift) av Markov är ett system av successiva tillämpningar av substitutioner som implementerar vissa procedurer för att erhålla nya ord från basen, byggda från tecknen i ett visst alfabet. Som en Turing-maskin utför normala algoritmer inte beräkningarna själva: de utför bara ordtransformationer genom att ersätta bokstäver enligt givna regler [10] .

En normalt beräkningsbar funktion är en funktion som kan implementeras med en normal algoritm. Det vill säga en algoritm som omvandlar varje ord från uppsättningen av giltiga data för funktionen till dess initiala värden [11] ..

Skaparen av teorin om normala algoritmer A. A. Markov lade fram en hypotes, som kallades Markovs normaliseringsprincip:

För att hitta värdena för en funktion som ges i något alfabet, om och bara om det finns någon algoritm, när funktionen normalt är uppräknad.

Liksom teserna om Turing och kyrkan kan Markovs normaliseringsprincip inte bevisas med matematiska medel.

Stokastiska algoritmer

Ovanstående formella definition av algoritmen kan dock vara för strikt i vissa fall. Ibland finns det behov av att använda slumpvariabler [12] . En algoritm vars funktion inte bara bestäms av initialdata utan också av värden som erhålls från slumptalsgeneratorn kallas stokastisk (eller randomiserad, från den engelska  randomiserade algoritmen ) [13] . Stokastiska algoritmer är ofta mer effektiva än deterministiska, och i vissa fall det enda sättet att lösa ett problem [12] .

I praktiken, istället för en slumptalsgenerator , används en pseudoslumptalsgenerator .

Man bör dock skilja på stokastiska algoritmer och metoder som ger ett korrekt resultat med hög sannolikhet. Till skillnad från metoden ger algoritmen korrekta resultat även efter en lång löpning.

Vissa forskare medger möjligheten att den stokastiska algoritmen ger ett felaktigt resultat med en viss förutbestämd sannolikhet. Då kan stokastiska algoritmer delas in i två typer [14] :

Andra formaliseringar

För vissa uppgifter kan ovan nämnda formaliseringar göra det svårt att hitta lösningar och bedriva forskning. För att övervinna hinder utvecklades båda modifieringarna av de "klassiska" systemen, och nya modeller av algoritmen skapades. I synnerhet kan man nämna:

Typer av algoritmer

Typerna av algoritmer som logiska och matematiska medel återspeglar de angivna komponenterna i mänsklig aktivitet och trender, och själva algoritmerna, beroende på målet, initiala förutsättningar för problemet och sätt att lösa det. Det bör betonas den grundläggande skillnaden mellan algoritmer av beräkningskaraktär som omvandlar en del indata till utdata (det är deras formalisering att de ovan nämnda Turing-, Post-, PAM-maskinerna, normala Markov-algoritmer och rekursiva funktioner) och interaktiva algoritmer (Turing har redan en C-maskin, från engelska  val  - ett val som väntar på extern påverkan, till skillnad från den klassiska A-maskinen, där alla initiala data ges innan beräkningens start och utdata inte är tillgängliga förrän i slutet av uträkningen). De senare är utformade för att interagera med något kontrollobjekt och är utformade för att säkerställa korrekt utfärdande av kontrollåtgärder beroende på den aktuella situationen, reflekterad av signalerna som kommer från kontrollobjektet [15] [16] . I vissa fall ger kontrollalgoritmen inte fullbordandet av arbetet alls (till exempel upprätthåller den en oändlig cykel av väntan på händelser som en lämplig reaktion utfärdas), trots detta, är den helt korrekt.

Algoritmer kan också särskiljas:

  • Mekaniska algoritmer , eller på annat sätt deterministiska , stela (till exempel algoritmen för driften av en maskin, motor, etc.) - ställ in vissa åtgärder, beteckna dem i en enda och tillförlitlig sekvens, vilket ger ett otvetydigt nödvändigt eller önskat resultat om de processvillkor är uppfyllda uppgifter som algoritmen är utvecklad för.
  • Flexibla algoritmer , såsom stokastiska, d.v.s. probabilistiska och heuristiska.
  • En probabilistisk (stokastisk) algoritm ger ett program för att lösa ett problem på flera sätt eller sätt som leder till troligt resultat.
  • Heuristisk algoritm (från det grekiska ordet " eureka ") - en algoritm som använder olika rimliga överväganden utan strikta motiveringar [17] .
  • En linjär algoritm  är en uppsättning kommandon (instruktioner) som exekveras sekventiellt i tid efter varandra.
  • En grenalgoritm  är en algoritm som innehåller minst ett villkor, vilket gör att en uppdelning i flera alternativa grenar av algoritmen kan utföras.
  • En cyklisk algoritm  är en algoritm som involverar upprepad upprepning av samma åtgärd (samma operationer). De flesta av beräkningsmetoderna och uppräkningen av alternativ reduceras till cykliska algoritmer. En programcykel är en sekvens av kommandon (serier, cykelkropp) som kan utföras flera gånger.
  • En extra ( underordnad ) algoritm ( procedur ) är en algoritm som tidigare utvecklats och helt användes vid algoritmiseringen av ett specifikt problem. I vissa fall, om det finns identiska sekvenser av instruktioner (kommandon) för olika data, urskiljs också en hjälpalgoritm för att förkorta posten. I alla stadier av förberedelserna för algoritmiseringen av problemet används den strukturella representationen av algoritmen i stor utsträckning.
  • Strukturellt blockdiagram , grafdiagram av algoritmen  - en grafisk representation av algoritmen i form av ett diagram av block sammankopplade med pilar (övergångslinjer) - grafiska symboler, som var och en motsvarar ett steg i algoritmen. Inuti blocket ges en beskrivning av motsvarande åtgärd. Den grafiska representationen av algoritmen används ofta före programmering av uppgiften på grund av dess tydlighet, eftersom visuell uppfattning vanligtvis underlättar processen att skriva ett program, korrigera det i händelse av eventuella fel och förstå informationsbearbetningsprocessen. Du kan till och med stöta på ett sådant uttalande: "Utåt är algoritmen ett schema - en uppsättning rektanglar och andra symboler, inuti vilka det är skrivet, vad som beräknas, vad som matas in i maskinen och vad som utfärdas för utskrift och annat sätt att visa information."

Algoritmnumrering

Numreringen av algoritmer spelar en viktig roll i deras studier och analys [18] . Eftersom vilken algoritm som helst kan specificeras som ett ändligt ord (representerat som en ändlig sekvens av symboler i något alfabet), och mängden av alla ändliga ord i ett ändligt alfabet kan räknas , är mängden av alla algoritmer också räknebar. Detta innebär att det finns en en-till-en-mappning mellan mängden naturliga tal och mängden algoritmer, det vill säga möjligheten att tilldela varje algoritm ett nummer.

Numreringen av algoritmer är samtidigt numreringen av alla algoritmiskt beräknade funktioner, och vilken funktion som helst kan ha ett oändligt antal siffror.

Förekomsten av numrering gör det möjligt att arbeta med algoritmer på samma sätt som med siffror. Numrering är särskilt användbart vid studiet av algoritmer som fungerar med andra algoritmer.

Algoritmiskt olösliga problem

Formaliseringen av begreppet en algoritm gjorde det möjligt att undersöka förekomsten av problem som det inte finns några algoritmer för att hitta lösningar på. Därefter bevisades omöjligheten av algoritmisk beräkning av lösningar på ett antal problem, vilket gör det omöjligt att lösa dem på någon datorenhet. En funktion kallas beräkningsbar om det finns en Turing-maskin som beräknar värdet för alla element i funktionsdefinitionsuppsättningen. Om en sådan maskin inte finns, sägs funktionen vara icke-beräknbar. Funktionen kommer att anses vara icke-beräknbar även om det finns Turing-maskiner som kan beräkna ett värde för en delmängd av hela uppsättningen av ingångar [19] .  

Det fall då resultatet av utvärderingen av en funktion är det logiska uttrycket "sant" eller "falskt" (eller mängden {0, 1}) kallas ett problem som kan vara lösbart eller olösligt, beroende på funktionens beräkningsbarhet [19] .

Det är viktigt att exakt specificera den tillåtna uppsättningen av indata, eftersom ett problem kan vara lösbart för en uppsättning och olösligt för en annan.

Ett av de första problemen för vilka olöslighet bevisades är det stoppande problemet . Den är formulerad enligt följande:

Givet en beskrivning av programmet för en Turing-maskin, krävs det att avgöra om programmet avslutas inom en begränsad tid eller körs på obestämd tid givet viss input. [tjugo]

Beviset på olösligheten av det stoppande problemet är viktigt eftersom andra problem kan reduceras till det. Till exempel kan ett enkelt stoppproblem reduceras till ett stoppproblem på en tom linje (när du behöver bestämma för en given Turing-maskin om den kommer att stanna när den startas på en tom linje), och därigenom bevisa den senares oavgörbarhet. [19] .

Analys av algoritmer

Tillsammans med informationsteknologins spridning har risken för mjukvarufel ökat. Ett av sätten att undvika fel i algoritmer och deras implementeringar är att bevisa systemens korrekthet med matematiska medel.

Användningen av matematiska apparater för analys av algoritmer och deras implementeringar kallas formella metoder. Formella metoder innebär användning av formella specifikationer och vanligtvis en uppsättning verktyg för att analysera och bevisa specifikationernas egenskaper. Abstraktion från implementeringsdetaljer låter dig ställa in egenskaperna för systemet oberoende av dess implementering. Dessutom gör noggrannheten och unikheten hos matematiska påståenden det möjligt att undvika tvetydigheten och felaktigheten hos naturliga språk [21] .

Enligt Richard Maces hypotes är "fel undvikande bättre än feleliminering" [22] . Enligt Hoares gissning löser "bevis på program problemet med korrekthet, dokumentation och kompatibilitet" [23] . Beviset på riktigheten av program gör att vi kan avslöja deras egenskaper i förhållande till hela utbudet av indata. För att göra detta var begreppet korrekthet uppdelat i två typer:

  • Delvis korrekt  - programmet ger rätt resultat för de fall det avslutas.
  • Fullständig korrekthet  - programmet avslutas och ger rätt resultat för alla element från indataområdet.

Under bevis på korrekthet jämförs programmets text med specifikationen av det önskade förhållandet mellan in- och utdata. För bevis av Hoare-typ tar specifikationen formen av påståenden, som kallas förvillkor och eftervillkor. Tillsammans med själva programmet kallas de även för Hoare-trippeln . Dessa uttalanden är skrivna som

{P}F{S}

där P  är de förutsättningar som måste vara sanna innan programmet Q körs och S är de eftervillkor som är sanna efter att programmet avslutats.

Formella metoder har framgångsrikt tillämpats på en lång rad problem, särskilt: utveckling av elektroniska kretsar, artificiell intelligens, automatiska system på järnvägen, verifiering av mikroprocessorer , specifikation av standarder och specifikation och verifiering av program [24] .

Öppettider

Ett vanligt kriterium för att utvärdera algoritmer är körtiden och i vilken ordning körtiden växer beroende på mängden indata. [25]

För varje specifik uppgift utgör de ett visst antal, som kallas dess storlek. Till exempel kan storleken på uppgiften att beräkna produkten av matriser vara den största storleken på matrisfaktorer, för uppgifter på grafer kan storleken vara antalet grafkanter.

Den tid en algoritm spenderar som en funktion av uppgiftens storlek kallas tidskomplexiteten för den algoritmen T ( n ). Asymptotiken för beteendet hos denna funktion när problemets storlek ökar kallas asymptotisk tidskomplexitet, och notationen "O" stor används för att beteckna det . Till exempel, om en algoritm bearbetar indata i tiden cn² , där c  är någon konstant , då sägs tidskomplexiteten för en sådan algoritm vara O ( n² ).

Den asymptotiska komplexiteten är viktig eftersom den är en egenskap hos algoritmen och inte för dess speciella implementering: genom att "optimera" operationerna, utan att ändra algoritmen, kan endast den multiplikativa koefficienten c ändras , men inte asymptotiken. Som regel är det den asymptotiska komplexiteten som är huvudfaktorn som avgör storleken på de uppgifter som algoritmen klarar av att bearbeta.

Under utvecklingen av en algoritm försöker man ofta minska den asymptotiska tidskomplexiteten för de värsta fallen. I praktiken finns det fall då det räcker med en algoritm som "vanligtvis" går snabbt.

Grovt sett kan analysen av den genomsnittliga asymptotiska tidskomplexiteten delas in i två typer: analytisk och statistisk. Analysmetoden ger mer exakta resultat, men är svår att använda i praktiken. Men den statistiska metoden låter dig snabbt analysera komplexa problem [26] .

Följande tabell listar vanliga asymptotiska komplexiteter med kommentarer [27] .

Komplexitet Kommentar Exempel
O (1) Hållbar körtid beror inte på uppgiftens storlek Förväntad uppslagstid i en hashtabell
O ( logga in ) Mycket långsam tillväxt av erforderlig tid Förväntad körtid för en interpolerande sökning efter n element
O ( logga in ) Logaritmisk tillväxt - Fördubbling av storleken på en uppgift ökar löptiden med ett konstant belopp Beräkning x n ; Binär sökning i en uppsättning av n element
O ( n ) Linjär tillväxt – en fördubbling av storleken på uppgiften kommer att fördubbla tiden som krävs Addition/subtraktion av tal från n siffror; Linjär sökning i en matris med n element
O ( n log n ) Linjär tillväxt - En fördubbling av uppgiftsstorleken kommer att fördubbla den tid som krävs Sortera efter sammanfogning eller ett gäng n element; sortera nedre gräns genom att matcha n element
O ( n² ) Quadratic Growth - Fördubbling av uppgiftsstorleken fyrdubblar tiden som krävs Elementära sorteringsalgoritmer
O ( n³ ) Cubic Growth - Fördubbling av uppgiftsstorleken ökar den nödvändiga tiden med åtta gånger Vanlig matrismultiplikation
O ( c n ) Exponentiell tillväxt - att öka storleken på uppgiften med 1 leder till en c -faldig ökning av den nödvändiga tiden; dubbla uppgiftsstorleken kvadrerar den tid som krävs Vissa resande säljare problem , brute-force sökalgoritmer

Närvaro av initiala data och visst resultat

En algoritm är en exakt definierad instruktion, genom att tillämpa den sekventiellt på de initiala data, kan du få en lösning på problemet. För varje algoritm finns det en viss uppsättning objekt som kan användas som indata. Till exempel, i algoritmen för att dividera reella tal, kan utdelningen vara vad som helst, och divisorn kan inte vara lika med noll.

Algoritmen tjänar som regel inte till att lösa ett specifikt problem, utan en viss klass av problem. Så additionsalgoritmen är tillämplig på alla naturliga talpar. Detta uttrycker dess massegenskap, det vill säga förmågan att upprepade gånger tillämpa samma algoritm för alla uppgifter i samma klass.

För utveckling av algoritmer och program används algoritmisering  - processen för systematisk sammanställning av algoritmer för att lösa tillämpade problem. Algoritmisering anses vara ett obligatoriskt steg i processen att utveckla program och lösa problem på en dator. Det är för tillämpade algoritmer och program som determinism, effektivitet och masskaraktär, såväl som riktigheten av resultaten av att lösa de uppsatta uppgifterna, är fundamentalt viktiga.

En algoritm är en tydlig och exakt instruktion till utföraren att utföra en sekvens av åtgärder som syftar till att uppnå målet.

Representation av algoritmer

Algoritmnotationsformer:

Vanligtvis, till en början (på idénivå), beskrivs algoritmen i ord, men när den närmar sig implementering får den mer och mer formella konturer och formuleringar på ett språk som är förståeligt för utföraren (till exempel maskinkod ).

Algoritmers effektivitet

Även om definitionen av algoritmen bara kräver ett ändligt antal steg som krävs för att uppnå ett resultat, leder implementeringen av ett stort antal steg i praktiken till långvarig exekvering av program, och det finns vanligtvis andra begränsningar (på storleken på programmet, om tillåtna åtgärder). I detta avseende introduceras sådana begrepp som komplexiteten hos algoritmen ( tid , programstorlek, beräkningsteknik och andra).

För varje uppgift kan det finnas många algoritmer som leder till målet. Att öka effektiviteten av algoritmer är ett av datavetenskapens problem , sedan 1940-talet har man i samband med detta byggt ett antal mer asymptotiskt effektiva algoritmer för traditionella problem (till exempel snabba multiplikationsalgoritmer , Chudnovskys algoritm för beräknar antalet ).

Exempel

Euklids algoritm  är en effektiv metod för att beräkna den största gemensamma divisorn (gcd). Uppkallad efter den grekiske matematikern Euklid; en av de äldsta algoritmerna som fortfarande används [28] .

Beskrivs i "Början" av Euklid (cirka 300 f.Kr.), nämligen i böckerna VII och X. I den sjunde boken beskrivs en algoritm för heltal, och i den tionde - för segmentens längder.

Det finns flera varianter av algoritmen, nedan är en rekursiv version skriven i pseudokod :

funktionsnod (a, b) om b = 0 returnerar en annars returnod (b, a mod b)

GCD för nummer 1599 och 650:

Steg 1 1599 = 650*2 + 299
Steg 2 650 = 299*2 + 52
Steg 3 299 = 52*5 + 39
Steg 4 52 = 39*1 + 13
Steg 5 39 = 13*3 + 0

Se även

Anteckningar

  1. Semenov A. L. ALGORITHM . Stora ryska encyklopedin. Elektronisk version (2016). Hämtad 29 oktober 2018. Arkiverad från originalet 30 oktober 2018.
  2. Kleene 1943 i Davis 1965: 274
  3. Rosser 1939 i Davis 1965: 225
  4. Knuth, 2006 , 1.1. Algoritmer.
  5. Robert Andrew Wilson, Frank C. Keil. MIT Encyclopedia of the Cognitive Sciences . - MIT Press, 2001. - S. 11. - 1106 sid. — ISBN 9780262731447 . Arkiverad 17 november 2021 på Wayback Machine
  6. (Igoshin, s. 317)
  7. V. A. Uspensky: "Matematik är en humanitär vetenskap"  // Trinity Variant. - 2014. - 28 januari ( nr 2 (146) ). - S. 4-6 . Arkiverad från originalet den 27 november 2018.
  8. Grunderna: Turingmaskinen (med en tolk!) . Good Math, Bad Math (9 februari 2007). Arkiverad från originalet den 2 februari 2012.
  9. (Igoshin, avsnitt 33)
  10. Encyclopedia of Cybernetics , volym 2 , sid. 90-91.
  11. (Igoshin, avsnitt 34)
  12. 1 2 "Probabilistiska algoritmer ska inte förväxlas med metoder (som jag vägrar kalla algoritmer), som ger ett resultat som har stor sannolikhet att vara korrekt. Det är viktigt att en algoritm ger korrekta resultat (rabatterar mänskliga eller datorfel), även om detta händer efter mycket lång tid.” Henri Cohen. En kurs i beräkningsalgebraisk talteori  . - Springer-Verlag , 1996. - P.  2 . — ISBN 3-540-55640-0 .
  13. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rives't, Clifford Stein. Introduktion till  algoritmer . - 2:a. - MIT Press , 2001. - P. 531. - ISBN 0-262-03293-7 .
  14. (Avsnitt 12, s. 12-22 i Atallah, 2010)
  15. Dina Goldin, Peter Wegner. Ursprunget till Turing Thesis Myth , CS-04-14, oktober 2004
  16. Interaktiv beräkning är mer kraftfull än icke-interaktiv Arkiverad 19 november 2015 på Wayback Machine , c2.com
  17. M. Gary, D. Johnson, Datormaskiner och svåra problem, M .: Mir, 1982, C. 155.
  18. (Igoshin, avsnitt 36)
  19. 1 2 3 Peter Linz. En introduktion till formella språk och automater  . – Jones och Bartlett Publishers, 2000. - ISBN 0-7637-1422-4 .
  20. beräkningsbarhet och komplexitet, Encyclopedia of data Science and Technology , Facts On File, 2009, ISBN 978-0-8160-6382-6 . 
  21. (O'Regan, avsnitt 4.5)
  22. (avsnitt 5.3.6 i Enders, 2003)
  23. (avsnitt 5.3.7 i Enders, 2003)
  24. (O'Regan, s. 119)
  25. A. Aho , J. Hopcroft , J. Ullman . Konstruktion och analys av beräkningsalgoritmer = The Design and Analysis of Computer Algorithms . - M . : "Mir", 1979.
  26. (avsnitt 11 i Atallah, 2010)
  27. (avsnitt 1 i Atallah, 2010)
  28. Knuth D. Konsten att programmera , volym 2 : Seminumeriska algoritmer  . — 3:a. — Addison–Wesley , 1997. — ISBN 0201896842 .

Litteratur

  • Thomas H. Cormen, Charles I. Leiserson, Ronald L. Rivest, Clifford Stein. Algoritmer: Konstruktion och analys = Introduktion till algoritmer, tredje upplagan. - 3:a. - M. : "Williams" , 2013. - 1328 sid. - ISBN 978-5-8459-1794-2 .
  • Donald Knuth . The Art of Computer Programming = The Art of Computer Programming, vol. 1. Grundläggande algoritmer. - 3:e upplagan - M . : "Williams" , 2006. - V. 1. Grundläggande algoritmer. - S. 720. - ISBN 0-201-89683-4 .
  • Thomas H. Cormen. Algoritmer: Introduktionskurs = Algoritmer olåsta. - M. : "Williams" , 2014. - 208 sid. — ISBN 978-5-8459-1868-0 .
  • Igoshin VI Matematisk logik och teori för algoritmer. - 2:a uppl., raderad .. - M . : Informationscentrum "Academy", 2008. - 448 sid. — ISBN 5-7695-1363-2 .

Länkar

  • " Ordet "algoritm": ursprung och utveckling ", V. V. Shilov, Potential magazine  - en källa till historisk information.
  • Om algoritmen  (otillgänglig länk från 2013-05-22 [3452 dagar] - historia ,  kopia ) i uppslagsverket "Jorden runt"