Algoritme

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 25. januar 2022; checks kræver 10 redigeringer .

Algoritme ( lat.  algorithmi  - på vegne af den centralasiatiske matematiker Al-Khwarizmi [1] ) er et begrænset sæt af præcist definerede regler til løsning af en bestemt klasse af problemer eller et sæt instruktioner, der beskriver proceduren for udøveren til at løse en specifik problem. I den gamle fortolkning blev ordet "sekvens" brugt i stedet for ordet "orden", men efterhånden som parallelismen i computerarbejdet udviklede sig, begyndte ordet "sekvens" at blive erstattet af det mere generelle ord "orden". Uafhængige instruktioner kan udføres i en vilkårlig rækkefølge, parallelt, hvis de anvendte eksekutører tillader det.

Tidligere på russisk skrev de "algori f m", nu bruges denne stavemåde sjældent, men ikke desto mindre er der en undtagelse ( normal Markov- algoritme ).

Ofte fungerer en computer som eksekutør, men begrebet en algoritme refererer ikke nødvendigvis til computerprogrammer  - for eksempel er en klart beskrevet opskrift på tilberedning af en ret også en algoritme, i hvilket tilfælde eksekveren er en person (eller måske nogle mekanisme, for eksempel en vævning eller drejebænk med numerisk kontrol ).

Det er muligt at udskille beregningsalgoritmer ( derudover taler vi hovedsageligt om dem) og kontrollere dem . Beregningsalgoritmer omdanner faktisk nogle indledende data til output og realiserer beregningen af ​​en eller anden funktion. Semantikken for kontrolalgoritmer kan variere betydeligt og kommer ned til at udstede de nødvendige kontrolhandlinger enten på givne tidspunkter eller som et svar på eksterne hændelser (i dette tilfælde, i modsætning til en beregningsalgoritme, kan kontrolalgoritmen forblive korrekt til uendelig udførelse).

Begrebet en algoritme refererer til de oprindelige, grundlæggende, grundlæggende begreber i matematik. Beregningsprocesser af algoritmisk karakter (aritmetiske operationer på heltal, at finde den største fælles divisor af to tal osv.) har været kendt af menneskeheden siden oldtiden. Men i en eksplicit form blev begrebet en algoritme først dannet i begyndelsen af ​​det 20. århundrede.

Delvis formalisering af begrebet en algoritme begyndte med forsøg på at løse opløsningsproblemet ( tysk:  Entscheidungsproblem ), som blev formuleret af David Hilbert i 1928 . Følgende formaliseringstrin var nødvendige for at definere effektiv beregning [2] eller "effektiv metode" [3] ; sådanne formaliseringer omfatter Gödel  - Herbran-  Kleene rekursive funktioner fra 1930 , 1934 og 1935  , Alonzo Churchs λ-regning fra 1936  , Emil Posts formulering 1 fra 1936 og Turing -maskinen .

Historien om udtrykket

Den moderne formelle definition af en beregningsalgoritme blev givet i 30-50'erne af det XX århundrede i værkerne af Turing , Post , Church ( Kirke-Turing-afhandling ), N. Wiener , A. A. Markov .

Selve ordet "algoritme" kommer fra navnet på den persiske ( Khorezm og Maverannakhr ) videnskabsmand al-Khorezmi . Omkring 825 skrev han værket Kitab al-jabr wal-muqabala ("Bogen om tilføjelse og subtraktion"), fra hvis originale titel kommer ordet " algebra " (al-jabr - afslutning). I denne bog gav han for første gang en beskrivelse af det positionelle decimaltalssystem opfundet i Indien. Den persiske original af bogen har ikke overlevet. Al-Khwarizmi formulerede reglerne for beregning i det nye system og brugte sandsynligvis for første gang tallet 0 til at angive en manglende position i notationen af ​​et tal (araberne oversatte dets indiske navn til as-sifr eller blot sifr , deraf ord såsom "ciffer" og "cipher"). Omtrent på samme tid begyndte andre arabiske lærde at bruge indiske tal.

I første halvdel af det 12. århundrede trængte bogen om al-Khwarizmi i latinsk oversættelse ind i Europa. Oversætteren, hvis navn ikke er kommet ned til os, gav den navnet Algoritmi de numero Indorum ("Algorithmer om den indiske konto") - således blev det latiniserede navn på den centralasiatiske videnskabsmand placeret i bogens titel. I dag menes det, at ordet "algoritme" kom til europæiske sprog netop på grund af denne oversættelse. I løbet af de næste par århundreder dukkede mange andre værker op om det samme emne - undervisning i kunsten at tælle med tal, og alle havde ordet algoritmi eller algorismi i titlen .

Senere forfattere vidste ikke noget om al-Khwarizmi, men da den første oversættelse af bogen begynder med ordene: "Dixit algorizmi: ..." ("Al-Khwarizmi sagde: ..."), associerede de stadig dette ord med navnet på en bestemt person. Versionen om bogens græske oprindelse var meget almindelig. I et anglo-normannisk manuskript fra det 13. århundrede , skrevet på vers, læser vi:

Algorismen blev opfundet i Grækenland .

Dette er en del af regnestykket . Det blev opfundet af en mester ved navn Algorism, som gav ham sit navn. Og da han hed Algorism,

Han kaldte sin bog Algorism.

Omkring 1250 skrev den engelske astronom og matematiker John of Sacrobosco Algorismus vulgaris om aritmetik , som blev den vigtigste lærebog om beregninger i decimalpositionsnotation på mange europæiske universiteter i århundreder. I introduktionen udnævnte Sacrobosco en klog mand ved navn Algus som forfatter til videnskaben om at tælle . Og i det populære middelalderdigt " Rosens romantik " (1275-1280) af Jean de Meun sættes den "græske filosof Algus" på lige fod med Platon , Aristoteles , Euklid og Ptolemæus ! Der var også en stavemåde af navnet Argus ( Argus ). Og selvom Argo- skibet ifølge oldgræsk mytologi blev bygget af Jason , blev konstruktionen af ​​skibet tilskrevet denne Argo.

"Mester Algus" (eller Argus) blev personificeringen af ​​tællekunst i middelalderlitteraturen. Og i den allerede nævnte "Roman of the Rose" og i det berømte italienske digt "The Flower", skrevet af Durante , er der fragmenter, der siger, at selv "mestre Argus" ikke vil være i stand til at tælle, hvor mange gange elskere skændes og slutte fred. Den engelske digter Geoffrey Chaucer i digtet " The Book of the Duchess " ( 1369  ) skriver, at selv "the glorious counter Argus" (adle countour Argu) ikke vil være i stand til at tælle de monstre, der dukkede op i mareridtsagtige visioner for helten.

Men med tiden var matematikere mindre og mindre interesserede i sådanne forklaringer, og ordet algoritme (eller algorismus ), som uvægerligt var til stede i titlerne på matematiske værker, fik betydningen af ​​en måde at udføre aritmetiske operationer ved hjælp af arabiske tal, dvs. er på papiret uden at bruge en kuleramme . Det er i denne forstand, at det kom ind på mange europæiske sprog . For eksempel markeret "forældet". den findes i den repræsentative ordbog for den engelsksprogede Webster's New World Dictionary , udgivet i 1957.  The Encyclopedic Dictionary of Brockhaus and Efron tilbyder følgende fortolkning: algoritmen (i øvrigt før revolutionen blev stavemåden brugt algoritme , v.h.t. fita ) er fremstillet "fra det arabiske ord Al-Goremm, det vil sige rod".

Algoritme er kunsten at tælle med tal, men i første omgang refererede ordet "tal" kun til nul. Den berømte franske truver Gautier de Coincy (Gautier de Coincy, 1177-1236) brugte i et af sine digte ordene algorismus-cipher (som betød tallet 0) som en metafor for at karakterisere en absolut ubrugelig person. Det er klart, at forståelsen af ​​et sådant billede krævede den passende forberedelse af lytterne, hvilket betyder, at det nye nummersystem allerede var ret godt kendt for dem.

I mange århundreder var abacus faktisk det eneste middel til praktiske beregninger; det blev brugt af købmænd, pengevekslere og videnskabsmænd. Fordelene ved beregninger på en tælleplade blev forklaret i hans skrifter af en så fremragende tænker som Herbert af Avrilaksky (938-1003), der blev pave i 999 under navnet Sylvester II. Det nye gjorde sin vej med stort besvær, og matematikkens historie omfattede en stædig modsætning mellem lejrene af algoritmister og abacister (nogle gange kaldet herbekister), som gik ind for brugen af ​​kuleramme i stedet for arabiske tal til beregninger. Interessant nok blev den berømte franske matematiker Nicolas Chuquet (Nicolas Chuquet, 1445-1488) opført i registret over skatteydere i byen Lyon som en algoritme (algoritme). Men der gik mere end et århundrede, før den nye optællingsmetode endelig blev etableret, så meget tid krævedes til at udvikle almindeligt anerkendte notationer, forbedre og tilpasse regnemetoder til at skrive på papir. I Vesteuropa blev regnelærere ved med at blive kaldt "mestre i kulrammen" indtil det 17. århundrede , som for eksempel matematikeren Niccolò Tartaglia (1500-1557).

Så skrifter om kunsten at tælle blev kaldt Algoritmer . Af de mange hundrede kan man fremhæve sådanne usædvanlige som afhandlingen Carmen de Algorismo (latin carmen og betyder poesi) skrevet på vers af Alexander de Villa Dei (d. 1240) eller lærebogen af ​​den wienske astronom og matematiker George Purbach ( Georg Peurbach, 1423-1461) Opus algorismi jocundissimi ("Et sjoveste essay om algoritmen").

Efterhånden udvidedes ordets betydning. Forskere begyndte at anvende det ikke kun til rent beregningsmæssige, men også til andre matematiske procedurer. For eksempel skrev den franske filosof Nicolaus Oresme (1323/25-1382) omkring 1360 den matematiske afhandling Algorismus proportionum ("Beregning af proportioner"), hvor han først brugte potenser med brøkeksponenter og faktisk kom tæt på ideen om logaritmer. Da abacus blev erstattet af den såkaldte optælling på linjerne, begyndte adskillige manualer på den at blive kaldt Algorithmus linealis , det vil sige reglerne for at tælle på linjerne.

Du kan være opmærksom på, at efter nogen tid mistede den oprindelige form algorismi det sidste bogstav, og ordet fik en mere bekvem form for europæisk udtalealgoritme . Senere gennemgik det til gengæld en forvrængning, højst sandsynligt forbundet med ordet aritmetik .

I 1684 brugte Gottfried Leibniz , i Nova Methodvs pro maximis et minimis, itemque tangentibus... , først ordet "algoritme" ( Algorithmo ) i en endnu bredere betydning: som en systematisk måde at løse problemer i differentialregning.

I det 18. århundrede , i en af ​​de tyske matematiske ordbøger, Vollstandiges mathematisches Lexicon (udgivet i Leipzig i 1747  ), forklares begrebet algoritme stadig som begrebet fire aritmetiske operationer. Men denne betydning var ikke den eneste, for den matematiske videnskabs terminologi var stadig ved at blive dannet. Især blev udtrykket algorithmus infinitesimalis anvendt på måder at udføre operationer på uendeligt små værdier. Ordet algoritme blev også brugt af Leonard Euler , et af hvis værker hedder "Using a new algorithm to solve the Pell problem" ( De usu novi algorithmi in problemate Pelliano solvendo ). Vi ser, at Eulers forståelse af algoritmen som et synonym for metoden til at løse problemet allerede ligger meget tæt på den moderne.

Det tog dog næsten to århundreder mere, før alle de gamle betydninger af ordet faldt i ubrug. Denne proces kan spores af eksemplet på indtrængen af ​​ordet "algoritme" i det russiske sprog.

Historikere daterer en af ​​listerne i den gamle russiske aritmetiske lærebog, kendt som "Tællevisdom", til 1691 . Dette værk er kendt i mange versioner (de tidligste af dem er næsten hundrede år ældre) og går tilbage til endnu mere antikke manuskripter fra det 16.  århundrede. Ifølge dem kan man spore, hvordan kendskabet til arabiske tal og reglerne for håndtering af dem gradvist spredte sig i Rus'. Den fulde titel på denne lærebog er "Denne bog, talt i hellensk og græsk aritmetik, og i tysk algoritme, og i russisk tal tællevisdom."

Ordet "algoritme" blev således forstået af de første russiske matematikere på samme måde som i Vesteuropa. Det var dog ikke i V. I. Dahls berømte ordbog , og heller ikke hundrede år senere i Forklarende Ordbog over det russiske sprog, redigeret af D. N. Ushakov (1935). Men ordet "algoritme" kan findes i den populære førrevolutionære Encyclopedic Dictionary of the Granat-brødrene og i den første udgave af Great Soviet Encyclopedia (BSE), udgivet i 1926. Både der og der er det fortolket i samme måde: som regel, ifølge hvilken denne eller den af ​​fire regneoperationer i decimaltalsystemet. Dog i begyndelsen af ​​det 20. århundrede. for matematikere betød ordet "algoritme" allerede enhver aritmetisk eller algebraisk proces udført i henhold til strengt definerede regler, og denne forklaring er også givet i efterfølgende udgaver af TSB.

Algoritmer blev genstand for stigende opmærksomhed fra videnskabsmænd, og efterhånden indtog dette koncept et af de centrale steder i moderne matematik. Hvad angår folk, der er langt fra matematik, kunne de i begyndelsen af ​​fyrrerne kun høre dette ord, mens de studerede i skolen, i kombinationen "Euklids algoritme". På trods af dette blev algoritmen stadig opfattet som et rent teknisk udtryk, hvilket bekræftes af fraværet af relevante artikler i mindre omfangsrige publikationer. Især er det ikke engang i ti-binds Small Soviet Encyclopedia (1957), for ikke at nævne et-binds encyklopædiske ordbøger. Men ti år senere, i den tredje udgave af Great Soviet Encyclopedia (1969), er algoritmen allerede karakteriseret som en af ​​matematikkens hovedkategorier, "der ikke har en formel definition i form af enklere begreber og abstraheret direkte fra erfaring. " Som vi kan se, er forskellen selv fra fortolkningen af ​​den første udgave af TSB slående! I fyrre år er algoritmen blevet et af matematikkens nøglebegreber, og optagelsen af ​​ordet var ikke længere i encyklopædier, men i ordbøger. For eksempel er det til stede i den akademiske ordbog over det russiske sprog (1981) netop som et udtryk fra matematikområdet.

Samtidig med udviklingen af ​​begrebet en algoritme, skete dens ekspansion fra ren matematik til andre områder gradvist. Og det begyndte med fremkomsten af ​​computere, takket være hvilket ordet "algoritme" kom ind i 1985 i alle skolelærebøger i datalogi og fik et nyt liv. Generelt kan vi sige, at hans nuværende berømmelse er direkte relateret til graden af ​​distribution af computere. For eksempel i tredje bind af "Children's Encyclopedia" (1959) siges der meget om computere, men de er endnu ikke blevet noget bekendt og opfattes snarere som en slags egenskab for en lys, men ret fjern fremtid. Derfor er algoritmerne aldrig nævnt på dens sider. Men allerede i begyndelsen af ​​70'erne. i forrige århundrede, hvor computere holdt op med at være en eksotisk kuriosum, er ordet "algoritme" hurtigt ved at blive brugt. Dette er følsomt registreret af encyklopædiske publikationer. I " Encyclopedia of Cybernetics " (1974) i artiklen "Algorithm" er det allerede forbundet med implementering på computere, og i "Soviet Military Encyclopedia" (1976) endda en separat artikel "Algorithm for løsning af et problem på en computer " kommer til syne.

I løbet af de sidste halvandet til to årtier er computeren blevet en integreret egenskab i vores liv, computerordforråd bliver mere og mere velkendt. Ordet "algoritme" er sikkert kendt af alle i disse dage. Det trådte selvsikkert ind i daglig tale, og i dag mødes vi ofte i aviserne og hører i politikernes taler udtryk som "adfærdsalgoritme", "succesalgoritme" eller endda "forræderialgoritme". Akademiker N. N. Moiseev kaldte sin bog "Udviklingsalgoritmer", og den berømte læge N. M. Amosov kaldte den  "Health Algorithm" og "Mind Algorithms". Og det betyder, at ordet lever og beriger sig selv med nye betydninger og semantiske nuancer.

Algoritmedefinitioner

Egenskaber for algoritmer

Forskellige definitioner af algoritmen, eksplicit eller implicit, indeholder følgende sæt generelle krav:

Formel definition

Forskellige teoretiske problemer inden for matematik og accelerationen af ​​udviklingen af ​​fysik og teknologi satte en præcis definition af begrebet en algoritme på dagsordenen.

De første forsøg på at afklare begrebet en algoritme og dens forskning blev udført i første halvdel af det 20. århundrede af Alan Turing , Emil Post , Jacques Herbrand , Kurt Gödel , A. A. Markov , Alonzo Church . Der blev udviklet flere definitioner af begrebet en algoritme, men det viste sig efterfølgende, at de alle definerer det samme begreb (se Church-Turing-afhandlingen ) [6]

Den russiske matematiker, grundlæggeren af ​​strukturel lingvistik i Sovjetunionen V. A. Uspensky mente, at begrebet en algoritme først dukkede op i Emil Borel i 1912, i en artikel om et bestemt integral. Der skrev han om "beregninger, der faktisk kan udføres", mens han understregede: "Jeg lader bevidst mere eller mindre praktisk aktivitet til side; essensen her er, at hver af disse operationer er gennemførlige på en begrænset tid ved hjælp af en pålidelig og utvetydig metode” [7] .

Turing maskine

Grundideen bag Turing-maskinen er meget enkel. En Turing-maskine er en abstrakt maskine (automat), der arbejder med et bånd af individuelle celler, hvori tegn er skrevet. Maskinen har også et hoved til at skrive og læse tegn fra cellerne, som kan bevæge sig langs båndet. Ved hvert trin læser maskinen et tegn fra cellen, som hovedet peger på, og tager, baseret på det læste tegn og den interne tilstand, det næste trin. I dette tilfælde kan maskinen ændre sin tilstand, skrive et andet tegn til cellen eller flytte hovedet en celle til højre eller venstre. [otte]

Baseret på undersøgelsen af ​​disse maskiner blev Turings tese (algoritmernes hovedhypotese) fremsat:

En eller anden algoritme til at finde værdierne af en funktion givet i et eller andet alfabet eksisterer, hvis og kun hvis funktionen er Turing-evaluerbar, det vil sige når den kan beregnes på en Turing-maskine.

Denne afhandling er et aksiom, et postulat og kan ikke bevises med matematiske metoder, da algoritmen ikke er et eksakt matematisk begreb.

Rekursive funktioner

Hver algoritme kan associeres med en funktion, som den beregner. Spørgsmålet opstår dog, om det er muligt at associere en Turing-maskine med en vilkårlig funktion, og hvis ikke, for hvilke funktioner findes der en algoritme? Forskning i disse spørgsmål førte til skabelsen i 1930'erne af teorien om rekursive funktioner [9] .

Klassen af ​​beregnelige funktioner blev skrevet i et billede, der ligner konstruktionen af ​​en eller anden aksiomatisk teori baseret på et system af aksiomer. Først blev de enkleste funktioner valgt, hvis beregning er indlysende. Derefter blev reglerne (operatører) for at konstruere nye funktioner baseret på eksisterende formuleret. Den nødvendige klasse af funktioner består af alle de funktioner, der kan opnås ved den enkleste anvendelse af operatører.

I lighed med Turings afhandling i teorien om beregnbare funktioner, blev der fremsat en formodning, som kaldes Kirkens afhandling :

En numerisk funktion er algoritmisk evaluerbar, hvis og kun hvis den er delvist rekursiv.

Beviset for, at klassen af ​​beregnelige funktioner falder sammen med Turing-beregnbare funktioner, foregår i to trin: For det første bevises beregningen af ​​de enkleste funktioner på en Turing-maskine, og derefter beregningen af ​​funktioner opnået som et resultat af at anvende operatorer.

Uformelt kan en algoritme således defineres som et klart system af instruktioner, der definerer en diskret deterministisk proces, der fører fra de initiale data (ved input) til det ønskede resultat (ved output), hvis det findes, i et endeligt antal af trin; hvis det ønskede resultat ikke eksisterer, afsluttes algoritmen enten aldrig eller når en blindgyde.

Normal algoritme (algoritme) Markov

En normal algoritme (algoritme i forfatterens skrift) af Markov er et system af successive anvendelser af substitutioner, der implementerer visse procedurer til at opnå nye ord fra de grundlæggende, bygget ud fra tegnene i et bestemt alfabet. Som en Turing-maskine udfører normale algoritmer ikke selve beregningerne: de udfører kun ordtransformationer ved at erstatte bogstaver efter givne regler [10] .

En normalt beregnelig funktion er en funktion, der kan implementeres af en normal algoritme. Det vil sige en algoritme, der omdanner hvert ord fra funktionens gyldige datasæt til dets begyndelsesværdier [11] ..

Skaberen af ​​teorien om normale algoritmer A. A. Markov fremsatte en hypotese, som blev kaldt Markov-normaliseringsprincippet:

At finde værdierne af en funktion givet i et eller andet alfabet, hvis og kun hvis der er en eller anden algoritme, når funktionen normalt er talbar.

Ligesom teserne fra Turing og Church kan Markov-normaliseringsprincippet ikke bevises med matematiske midler.

Stokastiske algoritmer

Ovenstående formelle definition af algoritmen kan dog være for streng i nogle tilfælde. Nogle gange er der behov for at bruge stokastiske variable [12] . En algoritme, hvis drift bestemmes ikke kun af de indledende data, men også af værdierne opnået fra tilfældig talgeneratoren kaldes stokastisk (eller randomiseret, fra den engelske  randomiseret algoritme ) [13] . Stokastiske algoritmer er ofte mere effektive end deterministiske, og i nogle tilfælde den eneste måde at løse et problem på [12] .

I praksis bruges en pseudo-tilfældig talgenerator i stedet for en tilfældig talgenerator .

Man bør dog skelne mellem stokastiske algoritmer og metoder, der giver et korrekt resultat med stor sandsynlighed. I modsætning til metoden giver algoritmen korrekte resultater selv efter en lang løbetur.

Nogle forskere indrømmer muligheden for, at den stokastiske algoritme vil give et forkert resultat med en forudbestemt sandsynlighed. Derefter kan stokastiske algoritmer opdeles i to typer [14] :

Andre formaliseringer

For nogle opgaver kan ovennævnte formaliseringer gøre det svært at finde løsninger og udføre research. For at overvinde forhindringer blev begge modifikationer af de "klassiske" ordninger udviklet, og nye modeller af algoritmen blev skabt. Man kan især nævne:

Typer af algoritmer

Typerne af algoritmer som logiske og matematiske midler afspejler de angivne komponenter af menneskelig aktivitet og tendenser, og selve algoritmerne, afhængigt af målet, indledende betingelser for problemet og måder at løse det på. Det skal understreges den grundlæggende forskel mellem algoritmer af beregningsmæssig karakter, der konverterer nogle inputdata til outputdata (det er deres formalisering, at de ovennævnte Turing-, Post-, PAM-maskiner, normale Markov-algoritmer og rekursive funktioner) og interaktive algoritmer (Turing har i forvejen en C-maskine, fra engelsk  valg  - et valg der afventer ekstern påvirkning, i modsætning til den klassiske A-maskine, hvor alle indledende data er givet før start af beregningen og udgangsdataene først er tilgængelige i slutningen af regnestykket). Sidstnævnte er designet til at interagere med et kontrolobjekt og er designet til at sikre den korrekte udstedelse af kontrolhandlinger afhængigt af den aktuelle situation, reflekteret af de signaler, der kommer fra kontrolobjektet [15] [16] . I nogle tilfælde sørger kontrolalgoritmen slet ikke for færdiggørelsen af ​​arbejdet (for eksempel opretholder den en endeløs cyklus af at vente på begivenheder, hvorpå der udstedes en passende reaktion), på trods af dette, er den fuldstændig korrekt.

Algoritmer kan også skelnes:

  • Mekaniske algoritmer , eller på anden måde deterministiske , stive (f.eks. algoritmen til drift af en maskine, motor osv.) - indstiller bestemte handlinger, angiver dem i en enkelt og pålidelig rækkefølge, og giver derved et utvetydigt påkrævet eller ønsket resultat, hvis de procesbetingelser er opfyldt opgaver, som algoritmen er udviklet til.
  • Fleksible algoritmer , såsom stokastiske, dvs. probabilistiske og heuristiske.
  • En probabilistisk (stokastisk) algoritme giver et program til at løse et problem på flere måder eller måder, der fører til den sandsynlige opnåelse af et resultat.
  • Heuristisk algoritme (fra det græske ord " eureka ") - en algoritme, der bruger forskellige rimelige overvejelser uden strenge begrundelser [17] .
  • En lineær algoritme  er et sæt kommandoer (instruktioner), der udføres sekventielt i tid efter hinanden.
  • En forgreningsalgoritme  er en algoritme, der indeholder mindst én betingelse, som resulterer i, at en opdeling i flere alternative grene af algoritmen kan udføres.
  • En cyklisk algoritme  er en algoritme, der involverer gentagen gentagelse af den samme handling (samme operationer). De fleste af beregningsmetoderne og opremsningen af ​​muligheder er reduceret til cykliske algoritmer. En programcyklus er en sekvens af kommandoer (serier, cykluslegeme), der kan udføres flere gange.
  • En hjælpe ( underordnet ) algoritme ( procedure ) er en algoritme, der tidligere er udviklet og udelukkende brugt til algoritmisering af et specifikt problem. I nogle tilfælde, hvis der er identiske sekvenser af instruktioner (kommandoer) for forskellige data, skelnes der også en hjælpealgoritme for at forkorte posten. På alle stadier af forberedelsen til algoritmiseringen af ​​problemet er den strukturelle repræsentation af algoritmen meget brugt.
  • Strukturelt blokdiagram , grafdiagram af algoritmen  - en grafisk repræsentation af algoritmen i form af et diagram af blokke forbundet med pile (overgangslinjer) - grafiske symboler, som hver svarer til et trin i algoritmen. Inde i blokken gives en beskrivelse af den tilsvarende handling. Den grafiske repræsentation af algoritmen er meget brugt før programmering af opgaven på grund af dens klarhed, da visuel perception normalt letter processen med at skrive et program, rette det i tilfælde af mulige fejl og forstå informationsbehandlingsprocessen. Du kan endda støde på en sådan erklæring: "Udvendigt er algoritmen et skema - et sæt rektangler og andre symboler, indeni hvilke det er skrevet, hvad der beregnes, hvad der indtastes i maskinen, og hvad der udstedes til udskrivning og andre midler til at vise information."

Algoritmenummerering

Nummereringen af ​​algoritmer spiller en vigtig rolle i deres undersøgelse og analyse [18] . Da enhver algoritme kan specificeres som et endeligt ord (repræsenteret som en finit sekvens af symboler i et eller andet alfabet), og mængden af ​​alle finite ord i et endeligt alfabet kan tælles , så kan sættet af alle algoritmer også tælles. Dette betyder eksistensen af ​​en en-til-en mapping mellem sættet af naturlige tal og sættet af algoritmer, det vil sige muligheden for at tildele et tal til hver algoritme.

Nummereringen af ​​algoritmer er samtidig nummereringen af ​​alle algoritmisk beregnede funktioner, og enhver funktion kan have et uendeligt antal tal.

Eksistensen af ​​nummerering gør det muligt at arbejde med algoritmer på samme måde som med tal. Nummerering er især nyttig i studiet af algoritmer, der fungerer sammen med andre algoritmer.

Algoritmisk uløselige problemer

Formaliseringen af ​​begrebet en algoritme gjorde det muligt at undersøge eksistensen af ​​problemer, som der ikke er algoritmer til at finde løsninger på. Efterfølgende blev umuligheden af ​​algoritmisk beregning af løsninger på en række problemer bevist, hvilket gør det umuligt at løse dem på nogen computerenhed. En funktion kaldes beregnelig , hvis der er en Turing-maskine , der beregner værdien for alle elementer i funktionsdefinitionssættet. Hvis en sådan maskine ikke findes, siges funktionen at være ikke-beregnerlig. Funktionen vil blive betragtet som ikke-beregnelig, selvom der er Turing-maskiner, der er i stand til at beregne en værdi for en delmængde af hele sættet af input [19] .  

Tilfældet, hvor resultatet af evalueringen af ​​en funktion er det logiske udtryk "sand" eller "falsk" (eller mængden {0, 1}), kaldes et problem, der kan være løseligt eller uløseligt, afhængigt af funktionens beregnelighed [19] .

Det er vigtigt nøjagtigt at specificere det tilladte sæt af inputdata, da et problem kan være løseligt for et sæt og uløseligt for et andet.

Et af de første problemer, hvor uløselighed blev bevist, er det stoppende problem . Den er formuleret som følger:

Givet en beskrivelse af programmet for en Turing-maskine, er det nødvendigt at bestemme, om programmet afsluttes i en begrænset tid eller kører på ubestemt tid givet nogle input. [tyve]

Beviset for uløseligheden af ​​det stoppende problem er vigtigt, fordi andre problemer kan reduceres til det. For eksempel kan et simpelt standsningsproblem reduceres til et standsningsproblem på en tom linje (når du skal bestemme for en given Turing-maskine, om den vil stoppe, når den startes på en tom linje), og derved bevise sidstnævntes uafgørlighed. [19] .

Analyse af algoritmer

Sammen med udbredelsen af ​​informationsteknologi er risikoen for softwarefejl steget. En af måderne til at undgå fejl i algoritmer og deres implementeringer er at bevise korrektheden af ​​systemer med matematiske midler.

Brugen af ​​matematiske apparater til analyse af algoritmer og deres implementeringer kaldes formelle metoder. Formelle metoder involverer brugen af ​​formelle specifikationer og normalt et sæt værktøjer til at analysere og bevise specifikationernes egenskaber. Abstraktion fra implementeringsdetaljer giver dig mulighed for at indstille systemets egenskaber uafhængigt af dets implementering. Derudover gør nøjagtigheden og unikheden af ​​matematiske udsagn det muligt at undgå tvetydigheden og unøjagtigheden af ​​naturlige sprog [21] .

Ifølge Richard Maces hypotese er "fejlundgåelse bedre end fejleliminering" [22] . Ifølge Hoares formodning løser "bevis for programmer problemet med korrekthed, dokumentation og kompatibilitet" [23] . Beviset for rigtigheden af ​​programmer giver os mulighed for at afsløre deres egenskaber i forhold til hele rækken af ​​inputdata. For at gøre dette blev begrebet korrekthed opdelt i to typer:

  • Delvist korrekt  - programmet giver det korrekte resultat i de tilfælde, hvor det afsluttes.
  • Fuld korrekthed  - programmet afsluttes og producerer det korrekte resultat for alle elementer fra inputdataområdet.

Under bevis for korrekthed sammenlignes programmets tekst med specifikationen af ​​det ønskede forhold mellem input-outputdata. For beviser af Hoare-typen tager specifikationen form af udsagn, som kaldes forudsætninger og efterbetingelser. Sammen med selve programmet kaldes de også for Hoare-trippelen . Disse udsagn er skrevet som

{P}Q{S}

hvor P  er de forudsætninger, der skal være sande, før programmet Q køres , og S er de efterbetingelser, der er sande efter programmets afslutning.

Formelle metoder er med succes blevet anvendt på en lang række problemer, især: udvikling af elektroniske kredsløb, kunstig intelligens, automatiske systemer på jernbanen, verifikation af mikroprocessorer , specifikation af standarder og specifikation og verifikation af programmer [24] .

Åbningstider

Et almindeligt kriterium for evaluering af algoritmer er køretiden og rækkefølgen, hvori køretiden vokser afhængigt af mængden af ​​inputdata. [25]

For hver specifik opgave udgør de et bestemt tal, som kaldes dets størrelse. For eksempel kan størrelsen af ​​opgaven med at beregne produktet af matricer være den største størrelse af matrixfaktorer, for opgaver på grafer kan størrelsen være antallet af grafkanter.

Den tid en algoritme bruger som funktion af opgavestørrelsen kaldes tidskompleksiteten af ​​den algoritme T ( n ). Asymptotikken for denne funktions adfærd, når problemets størrelse øges, kaldes asymptotisk tidskompleksitet, og notationen "O" stor bruges til at betegne det . For eksempel, hvis en algoritme behandler inputdata i tiden cn² , hvor c  er en eller anden konstant , så siges tidskompleksiteten af ​​en sådan algoritme at være O ( n² ).

Den asymptotiske kompleksitet er vigtig, fordi den er en karakteristik af algoritmen, og ikke for dens særlige implementering: ved at "optimere" operationerne, uden at ændre algoritmen, kan kun den multiplikative koefficient c ændres , men ikke asymptotikken. Som regel er det den asymptotiske kompleksitet, der er hovedfaktoren, der bestemmer størrelsen af ​​de opgaver, som algoritmen er i stand til at bearbejde.

Under udviklingen af ​​en algoritme forsøger man ofte at reducere den asymptotiske tidskompleksitet i de værste tilfælde. I praksis er der tilfælde, hvor en algoritme, der "normalt" kører hurtigt, er tilstrækkelig.

Groft sagt kan analysen af ​​den gennemsnitlige asymptotiske tidskompleksitet opdeles i to typer: analytisk og statistisk. Analysemetoden giver mere præcise resultater, men er svær at bruge i praksis. Men den statistiske metode giver dig mulighed for hurtigt at analysere komplekse problemer [26] .

Følgende tabel viser almindelige asymptotiske kompleksiteter med kommentarer [27] .

Kompleksitet Kommentar Eksempler
O (1) Bæredygtig køretid afhænger ikke af opgavestørrelsen Forventet opslagstid i en hash-tabel
O ( loglogn ) Meget langsom vækst af påkrævet tid Forventet køretid for en interpolerende søgning efter n elementer
O ( logn ) Logaritmisk vækst - Fordobling af størrelsen af ​​en opgave øger køretiden med en konstant mængde Beregning x n ; Binær søgning i en række af n elementer
O ( n ) Lineær vækst – en fordobling af opgavens størrelse vil fordoble den nødvendige tid Addition/subtraktion af tal fra n cifre; Lineær søgning i et array af n elementer
O ( n log n ) Lineær vækst - Fordobling af opgavestørrelsen vil lidt mere end fordoble den nødvendige tid Sorter efter fletning eller en flok af n elementer; sorter nedre grænse ved at matche n elementer
O ( n² ) Kvadratisk vækst - Fordobling af opgavestørrelsen firdobler den krævede tid Elementære sorteringsalgoritmer
O ( n³ ) Kubisk vækst - Fordobling af opgavestørrelsen øger den nødvendige tid med otte gange Almindelig matrix multiplikation
O ( c n ) Eksponentiel vækst - forøgelse af opgavens størrelse med 1 fører til en c -fold stigning i den nødvendige tid; fordobling af opgavestørrelsen kvadrater den nødvendige tid Nogle rejsende sælger problemer , brute-force søgealgoritmer

Tilstedeværelse af indledende data og nogle resultater

En algoritme er en præcist defineret instruktion, anvender den sekventielt på de indledende data, kan du få en løsning på problemet. For hver algoritme er der et bestemt sæt af objekter, der kan bruges som inputdata. For eksempel i algoritmen til at dividere reelle tal kan udbyttet være hvad som helst, og divisoren kan ikke være lig med nul.

Algoritmen tjener som regel til at løse ikke et specifikt problem, men en bestemt klasse af problemer. Så additionsalgoritmen gælder for ethvert par naturlige tal. Dette udtrykker dens masseegenskab, det vil sige evnen til gentagne gange at anvende den samme algoritme til enhver opgave i samme klasse.

Til udvikling af algoritmer og programmer bruges algoritmisering  - processen med systematisk kompilering af algoritmer til løsning af anvendte problemer. Algoritmisering betragtes som et obligatorisk trin i processen med at udvikle programmer og løse problemer på en computer. Det er for anvendte algoritmer og programmer, at determinisme, effektivitet og massekarakter, såvel som rigtigheden af ​​resultaterne af løsningen af ​​de stillede opgaver, er fundamentalt vigtige.

En algoritme er en klar og præcis instruktion til udøveren om at udføre en sekvens af handlinger rettet mod at nå målet.

Repræsentation af algoritmer

Algoritme notationsformer:

Normalt er algoritmen først (på idéniveau) beskrevet i ord, men efterhånden som den nærmer sig implementering, får den flere og mere formelle konturer og formuleringer i et sprog, der er forståeligt for udføreren (for eksempel maskinkode ).

Algoritmers effektivitet

Selvom definitionen af ​​algoritmen kun kræver et begrænset antal trin, der kræves for at opnå et resultat, fører implementeringen af ​​et stort antal trin i praksis til langsigtet eksekvering af programmer, og der er normalt andre begrænsninger (på størrelsen af programmet, om tilladte handlinger). I denne henseende introduceres sådanne begreber som kompleksiteten af ​​algoritmen ( tid , programstørrelse, beregningsmæssig og andre).

For hver opgave kan der være mange algoritmer, der fører til målet. At øge effektiviteten af ​​algoritmer er et af computervidenskabens problemer , siden 1940'erne er der i forbindelse hermed bygget en række mere asymptotisk effektive algoritmer til traditionelle problemer (f.eks. hurtige multiplikationsalgoritmer , Chudnovskys algoritme for beregner antallet ).

Eksempel

Euklids algoritme  er en effektiv metode til at beregne den største fælles divisor (gcd). Opkaldt efter den græske matematiker Euklid; en af ​​de ældste algoritmer, der stadig er i brug [28] .

Beskrevet i "Begyndelsen" af Euklid (ca. 300 f.Kr.), nemlig i bog VII og X. I den syvende bog er en algoritme for heltal beskrevet, og i den tiende - for længderne af segmenter.

Der er flere varianter af algoritmen, nedenfor er en rekursiv version skrevet i pseudokode :

funktion node(a, b) hvis b = 0 returnerer en ellers returnode (b, a mod b)

GCD af numrene 1599 og 650:

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

Se også

Noter

  1. Semenov A. L. ALGORITHM . Stor russisk encyklopædi. Elektronisk version (2016). Hentet 29. oktober 2018. Arkiveret fra originalen 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 s. — ISBN 9780262731447 . Arkiveret 17. november 2021 på Wayback Machine
  6. (Igoshin, s. 317)
  7. V. A. Uspensky: "Matematik er en humanitær videnskab"  // Trinity Variant. - 2014. - 28. januar ( nr. 2 (146) ). - S. 4-6 . Arkiveret fra originalen den 27. november 2018.
  8. Grundlæggende: Turing-maskinen (med en tolk!) . God matematik, dårlig matematik (9. februar 2007). Arkiveret fra originalen den 2. februar 2012.
  9. (Igoshin, afsnit 33)
  10. Encyclopedia of Cybernetics , bind 2 , s. 90-91.
  11. (Igoshin, afsnit 34)
  12. 1 2 "Sandsynlighedsalgoritmer bør ikke forveksles med metoder (som jeg nægter at kalde algoritmer), som producerer et resultat, der har stor sandsynlighed for at være korrekt. Det er vigtigt, at en algoritme producerer korrekte resultater (der rabatterer menneskelige eller computerfejl), selvom dette sker efter meget lang tid." Henri Cohen. Et kursus i beregningsmæssig algebraisk talteori  . - Springer-Verlag , 1996. - S.  2 . — ISBN 3-540-55640-0 .
  13. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rives't, Clifford Stein. Introduktion til  algoritmer . - 2. - MIT Press , 2001. - S. 531. - ISBN 0-262-03293-7 .
  14. (Afsnit 12, s. 12-22 i Atallah, 2010)
  15. Dina Goldin, Peter Wegner. Oprindelsen af ​​Turing-afhandlingens myte , CS-04-14, oktober 2004
  16. Interaktiv beregning er mere kraftfuld end ikke-interaktiv Arkiveret 19. november 2015 på Wayback Machine , c2.com
  17. M. Gary, D. Johnson, Computermaskiner og vanskelige problemer, M .: Mir, 1982, C. 155.
  18. (Igoshin, afsnit 36)
  19. 1 2 3 Peter Linz. En introduktion til formelle sprog og automater  . - Jones og Bartlett Publishers, 2000. - ISBN 0-7637-1422-4 .
  20. beregnelighed og kompleksitet, Encyclopedia of Computer Science and Technology , Facts On File, 2009, ISBN 978-0-8160-6382-6 . 
  21. (O'Regan, afsnit 4.5)
  22. (afsnit 5.3.6 i Enders, 2003)
  23. (afsnit 5.3.7 i Enders, 2003)
  24. (O'Regan, s. 119)
  25. A. Aho , J. Hopcroft , J. Ullman . Konstruktion og analyse af beregningsalgoritmer = The Design and Analysis of Computer Algorithms . - M . : "Mir", 1979.
  26. (afsnit 11 i Atallah, 2010)
  27. (afsnit 1 i Atallah, 2010)
  28. Knuth D. Kunsten at programmere computer , bind 2 : Seminumeriske algoritmer  . — 3. — Addison–Wesley , 1997. — ISBN 0201896842 .

Litteratur

  • Thomas H. Cormen, Charles I. Leiserson, Ronald L. Rivest, Clifford Stein. Algoritmer: Konstruktion og analyse = Introduktion til algoritmer, tredje udgave. - 3. - M. : "Williams" , 2013. - 1328 s. - ISBN 978-5-8459-1794-2 .
  • Donald Knuth . The Art of Computer Programming = The Art of Computer Programming, vol. 1. Grundlæggende algoritmer. - 3. udgave - M . : "Williams" , 2006. - V. 1. Grundlæggende algoritmer. - S. 720. - ISBN 0-201-89683-4 .
  • Thomas H. Cormen. Algoritmer: Introduktionskursus = Algorithms Unlocked. - M. : "Williams" , 2014. - 208 s. — ISBN 978-5-8459-1868-0 .
  • Igoshin VI Matematisk logik og teori om algoritmer. - 2. udg., slettet .. - M . : Informationscenter "Academy", 2008. - 448 s. — ISBN 5-7695-1363-2 .

Links

  • " Ordet "algoritme": oprindelse og udvikling ", V. V. Shilov, Potential magazine  - en kilde til historisk information.
  • Om algoritmen  (utilgængeligt link fra 22-05-2013 [3452 dage] - historie ,  kopi ) i encyklopædien "Jorden rundt"