5000 DAN 'stor' ELIF NÅR "befolkning"> 1500 T ..." /> 5000 DAN 'stor' ELIF NÅR "befolkning"> 1500 T ..." />
Mer

Mange ELSE-uttalelser i uttrykk i QGIS (2.6)


er det mulig å ha mer enn en ELSE iSAK NÅRuttalelse i Expression builder i QGIS?

For eksempel:

CASE NÅR "befolkning"> 5000 DAN 'stor' ELIF NÅR "befolkning"> 1500 DAN 'medium' ELSE 'liten' SLUTT

Jeg vet at denne koden er helt feil, men jeg kan ikke finne en ekvivalent avELIF

Noen ideer? Ser jeg på problemet på feil måte ?!


Ok gutter, jeg beklager ...

TilsvarendeELIFerNÅR.

Dette spørsmålet er allerede besvart her.

Beklager støyen.


Nestede saksuttalelser kontra flere kriterier saksuttalelser [avsluttet]

Vil du forbedre dette spørsmålet? Oppdater spørsmålet slik at det er tema for databaseadministratorer å stable Exchange.

Hadde en interessant diskusjon med en kollega i dag om å optimalisere saksuttalelser og om det er bedre å legge igjen en saksuttalelse som har overlappende kriterier som individuelle når klausuler, eller komme med en nestet saksuttalelse for hver av de overlappende uttalelsene.

Som et eksempel, si at vi hadde en tabell med to heltallfelt, kolonne a og kolonne b. Hvilke av de to spørsmålene ville være mer prosessorvennlige? Siden vi bare vurderer om a = 1 eller a = 0 en gang bruker de nestede setningene, ville dette være mer effektivt for prosessoren, eller ville det å skape en nestet setning spise opp den optimaliseringen?

Flere kriterier for saksuttalelsen:


Kontrollbegrensninger kan bare brukes til å verifisere om dataene faller innenfor et gitt sett med parametere. CHECK (.) -Klausulen valideres i hovedsak som en boolsk tilstand hvis resultatet er 1, raden settes inn, hvis resultatet er 0, blir ikke raden satt inn, og en feil returneres til klienten.

For å teste dette opprettet jeg tabellen din, sammen med den foreslåtte sjekkbegrensningen, og la inn flere rader med testdata:

Dette resulterer i flere feil og gjør det mulig å sette inn to rader:

Når du prøver å sette inn 2 og 3 (eller faktisk noe annet enn 1 eller & gt4), vil begrensningen returnere falsk, noe som indikerer at SQL Server ikke utfører innsettingen, og returnerer feilmeldingene vist ovenfor.

Her er et eksempel på hvordan du kan oppnå dette ved å bruke en utløser:

Forsikre deg om at du fjerner begrensningen fra tabellen før du prøver å sette inn data, siden det kan komme i konflikt med utløserkoden:


Hfrhyu

Kreves et hovedkort hvis siden av huset mitt er av tre?

Hva var det første språket som brukte betingede søkeord?

Kan en ny spiller bli med i en gruppe bare når en ny kampanje starter?

Hvorfor bruker AVR GCC-kompilatoren en full `CALL` selv om jeg har satt flagget` -mshort-calls`?

Er det rettferdig for en professor å gi oss karakter av tidligere papirer?

SF-bok om mennesker fanget i en serie verdener de forestiller seg

Hvordan fungerer matematikken når du kjøper flyselskapsmil?

Hvordan ville en musefelle til bruk i verdensrommet fungere?

Ta 2! Er denne hjemmebryggede Lady of Pain warlock-skyter balansert?

Disembodied hånd voksende fangs

Bør jeg bruke et kredittkort uten renter for et stort engangskjøp?

Ulovlig oppgave fra sObject til Id

Hvorfor bøyer vi en bok for å holde den rett?

Tegning uten erstatning: hvorfor er rekkefølgen på tegningen ikke relevant?

Krysser grensen mellom USA og Canada i mindre enn 24 timer

Er administrerende direktør det "yrket" med flest psykopater?

Et adverb for når du ikke overdriver

ArcGIS Pro Python arcpy.CreatePersonalGDB_management

Hvor stor skade ville en kopp med nøytronstjerner ha betydning for jorden?

Hvordan skriver jeg dette matematiske begrepet? med saker fungerer det ikke

Hvordan ble bilder omgjort fra film til et stort bilde i en bilderamme før digital skanning?

Hvorfor skal jeg stemme og godta svar?

Sumbokstaver er ikke to forskjellige

Gjør du automatisk oppdatert dato og klokkeslettfelt i QGIS?

Unicorn Meta Zoo # 1: Hvorfor en annen podcast? Er det mulig å legge til redigeringstidspunktet i tabellen til en shapefile? Hvordan lage i QGIS shapefile et felt som automatisk returnerer gjeldende dato Hva gjør du for å holde Python-koden permanent i QGIS 2.14 .2? Lage automatisk oppdatert dato- og tidsfelt i QGISHow for å sette NULL som standardverdi for et datofelt i QGIS 2.4? Beregn datofelt i ArcPyHvordan oppdatere et DATE-felt når du flytter PostGIS-geometri i QGIS? QGIS Server når du bygger UPDATE-spørringen til postgis setter datofelt = '' i stedet for = null som reiser en feil i DBQGIS-datofeltwidgeten - kan ikke velge dagens dato? Bruker karttips og styrt uttrykk i QGIS? Time Manager-datoformat uten tid Viser tid i datofeltet Er det mulig å legge til redigeringstidspunktet i tabellen til en shapefile? Gjør automatisk oppdatert dato og klokkeslettfelt i QGIS

Jeg vil lage et dato og klokkeslett oppdatert felt når jeg redigerer et attributtfelt i dette formatet åååå-mm-dd 00:00:00 (= 08.05.2016 11:04:00) - min lokale dato / tid. Dataene er i en QGIS 2.14 shapefile og Vector linjer som skjermbilde nedenfor.

Når en funksjon som NULL i 'navn' -feltet, vil jeg skrive inn et navn på veien, og mod-feltet må motta de modified dato / klokkeslett som '2016-05-08 15:16:00'.

Jeg har allerede prøvd noen alternativer og mislyktes.
Jeg trenger hjelp til å starte fra begynnelsen.

  1. Jeg oppretter et nytt felt, dato / tidstype, men holder seg med NULL-verdien etter at jeg redigerte, i "navn" -feltet eller funksjonen den selv.
  2. Jeg brukte også, uttrykket nå (), men holder seg med NULL-verdien etter at jeg redigerte.

Merk: datoen sett der, 2016-04-14 er den første verdien som er opprettet med "Field Calculator".


Innhold

I programmeringsspråk med en innebygd boolsk datatype, som for eksempel Pascal og Java, er vanligvis sammenligningsoperatorene som & gt og ≠ definert for å returnere en boolsk verdi. Betingede og iterative kommandoer kan defineres for å teste boolske verdsatte uttrykk.

Språk uten eksplisitt boolsk datatype, som C90 og Lisp, kan fremdeles representere sannhetsverdier av en annen datatype. Vanlig Lisp bruker en tom liste for falsk, og enhver annen verdi for sann. C-programmeringsspråket bruker en heltallstype, der relasjonsuttrykk som i & gt j og logiske uttrykk forbundet med & amp & amp og || er definert til å ha verdi 1 hvis sant og 0 hvis usant, mens testdelene av hvis, mens, for, etc., behandler en verdi som ikke er null som sant. [1] [2] En boolsk variabel kan faktisk betraktes (og implementeres) som en numerisk variabel med ett binært siffer (bit), som bare kan lagre to verdier. Implementeringen av Booleans i datamaskiner er mest sannsynlig representert som et fullstendig ord, snarere enn litt, dette skyldes vanligvis måtene datamaskiner overfører informasjonsblokker.

De fleste programmeringsspråk, selv de uten eksplisitt boolsk type, har støtte for boolske algebraiske operasjoner som konjunktjon (AND, & amp, *), disjunksjon (OR, |, +), ekvivalens (EQV, =, ==), eksklusiv eller / ikke-ekvivalens (XOR, NEQV, ^,! =), og negasjon (IKKE,

På noen språk, som Ruby, Smalltalk og Alice the ekte og falsk verdier tilhører separate klasser, dvs. henholdsvis sant og usant, så det er ingen boolsk type.

I SQL, som bruker en tredelt logikk for eksplisitte sammenligninger på grunn av sin spesielle behandling av Nulls, er den boolske datatypen (introdusert i SQL: 1999) også definert til å inkludere mer enn to sannhetsverdier, slik at SQL Boolere kan lagre alle logiske verdier som følge av evaluering av predikater i SQL. En kolonne av boolsk type kan være begrenset til bare SANT og FALSK.

Et av de tidligste programmeringsspråkene som gir et eksplisitt boolsk datatypen er ALGOL 60 (1960) med verdier ekte og falsk og logiske operatorer betegnet med symbolene '∧ < displaystyle wedge>' (og), '∨ < displaystyle vee>' (eller), '⊃ < displaystyle supset>' (antyder), '≡ < displaystyle equiv> '(ekvivalens) og' ¬ < displaystyle neg> '(ikke). På grunn av inngangsenheter og tegnsettgrenser på mange datidens datamaskiner, brukte de fleste kompilatorer imidlertid alternative representasjoner for mange av operatørene, for eksempel AND eller 'AND'.

Denne tilnærmingen med boolsk som en innebygd (enten primitiv eller på annen måte forhåndsdefinert) datatype ble adoptert av mange senere programmeringsspråk, som Simula 67 (1967), ALGOL 68 (1970), [3] Pascal (1970), Ada (1980), Java (1995), og C # (2000), blant andre.

Den første versjonen av FORTRAN (1957) og dens etterfølger FORTRAN II (1958) har ingen logiske verdier eller operasjoner, selv den betingede IF-setningen tar et aritmetisk uttrykk og forgrener seg til en av tre steder i henhold til tegnet, se aritmetisk IF. FORTRAN IV (1962) følger imidlertid ALGOL 60-eksemplet ved å tilveiebringe en boolsk datatype (LOGISK), sannhetsbokstaver (.TRUE. Og FALSE.), Booleske verdsatte numeriske sammenligningsoperatorer (.EQ., .GT., osv.), og logiske operatører (.NOT., .AND., .OR.). I FORMAT-setninger er det gitt en spesifikk formatbeskrivelse ('L') for parsing eller formatering av logiske verdier. [4]

Språket Lisp (1958) hadde aldri en innebygd boolsk datatype. I stedet antar betingede konstruksjoner som kond at den logiske verdien falsk representeres av den tomme listen (), som er definert til å være den samme som det spesielle atom null eller NIL mens ethvert annet s-uttrykk tolkes som ekte. For enkelhets skyld definerer de fleste moderne dialekter av Lisp atomet t har verdi t, slik at t kan brukes som en mnemonisk notasjon for ekte.

Denne tilnærmingen (hvilken som helst verdi kan brukes som en boolsk verdi) ble beholdt i de fleste Lisp-dialekter (Common Lisp, Scheme, Emacs Lisp), og lignende modeller ble vedtatt av mange skriptspråk, til og med de som hadde en tydelig boolsk type eller boolske verdier, selv om hvilke verdier tolkes som falsk og som er ekte varierer fra språk til språk. I ordningen, for eksempel, falsk verdi er et atom som er forskjellig fra den tomme listen, så sistnevnte tolkes som ekte. Common Lisp, derimot, gir også den dedikerte boolske typen, avledet som en spesialisering av symbolet. [5]

Språket Pascal (1970) introduserte konseptet med programmererdefinerte oppregnede typer. En innebygd boolsk datatype ble deretter gitt som en forhåndsdefinert nummerert type med verdier FALSE og SANT. Per definisjon ga alle sammenligninger, logiske operasjoner og betingede utsagn som ble brukt til og / eller boolske verdier. Ellers hadde den boolske typen alle fasiliteter som var tilgjengelige for oppregnede typer generelt, for eksempel bestilling og bruk som indekser. I kontrast, konvertering mellom boolske og heltall (eller andre typer) krevde fremdeles eksplisitte tester eller funksjonsanrop, som i ALGOL 60. Denne tilnærmingen (Boolsk er en oppregnet type) ble adoptert av de fleste senere språk som hadde opplistede typer, som Modula, Ada og Haskell.

Første implementeringer av språket C (1972) ga ingen boolsk type, og den dag i dag er boolske verdier ofte representert med heltall (int) i C-programmer. Sammenligningsoperatørene (& gt, ==, etc.) er definert for å returnere et signert heltall (int) -resultat, enten 0 (for usant) eller 1 (for sant). Logiske operatorer (& amp & amp, ||,!, Osv.) Og tilstandstestingsuttalelser (hvis, mens) antar at null er usant og alle andre verdier er sanne.

Etter at opplistede typer (numre) ble lagt til American National Standards Institute-versjonen av C, ANSI C (1989), ble mange C-programmerere vant til å definere sine egne boolske typer som sådan, av lesbarhetsgrunner. Oppregnede typer tilsvarer imidlertid heltall i henhold til språkstandardene, så den effektive identiteten mellom boolere og heltall er fortsatt gyldig for C-programmer.

Standard C (siden C99) gir en boolsk type, kalt _Bool. Ved å inkludere overskriften stdbool.h, kan man bruke det mer intuitive navnet bool og konstantene sanne og falske. Språket garanterer at to sanne verdier vil sammenligne like (som det var umulig å oppnå før introduksjonen av typen). Boolske verdier oppfører seg fortsatt som heltall, kan lagres i heltallvariabler, og brukes hvor som helst, heltall vil være gyldige, inkludert i indeksering, aritmetikk, parsing og formatering. Denne tilnærmingen (Boolske verdier er bare heltall) har blitt beholdt i alle senere versjoner av C. Merk at dette ikke betyr at noen heltall kan lagres i en boolsk variabel.

C ++ har en egen boolsk datatype bool, men med automatiske konverteringer fra skalar- og pekerverdier som ligner veldig på C. Denne tilnærmingen ble tatt i bruk av mange senere språk, spesielt av noen skriptspråk som AWK.

Objective-C har også en egen boolsk datatype BOOL, med mulige verdier som JA eller NEI, ekvivalenter henholdsvis sant og usant. [6] Også i Objective-C-kompilatorer som støtter C99, kan Cs _Bool-type brukes, siden Objective-C er et supersett av C.

I Java kan verdien av den boolske datatypen bare være sant eller usant. [7]

Perl har ingen boolsk datatype. I stedet kan enhver verdi oppføre seg som boolsk i boolsk sammenheng (tilstand av hvis eller mens utsagn, argument av & amp & amp eller ||, etc.). Tallet 0, strengene "0" og "", den tomme listen () og spesialverdien undef evalueres til usann. [8] Alt annet vurderes til sant.

Lua har en boolsk datatype, men ikke-boolske verdier kan også oppføre seg som booleanske. Ikke-verdien null vurderes til falsk, mens hver annen datatypeverdi evalueres til sann. Dette inkluderer den tomme strengen "" og tallet 0, som ofte betraktes som sant på andre språk.

Tcl har ingen separat boolsk type. I likhet med C brukes heltallene 0 (false) og 1 (true - faktisk ethvert helt nulltall). [9]

Ovennevnte vil vise "V er 1 eller sant" siden uttrykket evalueres til 1.

Ovennevnte vil gjengi en feil som variabel v kan ikke vurderes som 0 eller 1.

Python, fra versjon 2.3 fremover, har en bool-type som er en underklasse av int, standard heltallstype. [10] Den har to mulige verdier: Sann og usann, som er spesielle versjoner på henholdsvis 1 og 0 og oppføre seg slik i aritmetiske sammenhenger. Også en numerisk verdi på null (heltall eller brøk), nullverdien (Ingen), den tomme strengen og tomme beholdere (lister, sett osv.) Blir betraktet som boolsk falsk. Alle andre verdier anses som boolske som standard. [11] Klasser kan definere hvordan deres forekomster blir behandlet i en boolsk sammenheng gjennom den spesielle metoden __nonzero__ (Python 2) eller __bool__ (Python 3). For containere brukes __len__ (den spesielle metoden for å bestemme lengden på containere) hvis den eksplisitte boolske konverteringsmetoden ikke er definert.

I Ruby er derimot bare null (Rubys nullverdi) og et spesielt falskt objekt falsk alt annet (inkludert heltall 0 og tomme matriser) er ekte.

I JavaScript kalles den tomme strengen (""), null, udefinert, NaN, +0, −0 og false [12] noen ganger falske (som komplementet er sant) for å skille mellom strengt typekontrollerte og tvungne boolere. [13] I motsetning til Python anses tomme containere (matriser, kart, sett) å være sanne. Språk som PHP bruker også denne tilnærmingen.

Next Generation Shell har en Bool-type. Den har to mulige verdier: sant og usant. Bool kan ikke byttes ut med Int og må konverteres eksplisitt om nødvendig. Når en boolsk verdi av et uttrykk er nødvendig (for eksempel i en if-setning), kalles Bool-metoden. Bool-metoden for innebygde typer er definert slik at den returnerer falsk for en numerisk verdi på null, nullverdien, den tomme strengen, tomme beholdere (lister, sett osv.), Eksterne prosesser som avsluttes med utgangskode som ikke er null for andre verdier returnerer Bool true. Typer som Bool-metoden er definert for, kan brukes i boolsk sammenheng. Når man vurderer et uttrykk i boolsk sammenheng, kastes et unntak hvis det ikke er definert en passende Bool-metode.

Booleaner vises i SQL når det er behov for en tilstand, for eksempel WHERE-ledd, i form av predikat som produseres ved å bruke operatorer som sammenligningsoperatorer, IN-operator, IS (NOT) NULL etc. Imidlertid, bortsett fra SANT og FALSK, er disse operatørene kan også gi en tredje stat, kalt Ukjent, når sammenligning med NULL gjøres.

Behandlingen av boolske verdier er forskjellig mellom SQL-systemer.

I Microsoft SQL Server støttes for eksempel ikke boolsk verdi i det hele tatt, verken som en frittstående datatype eller kan representeres som et heltall. Det viser feilmeldingen "Et uttrykk av ikke-boolsk type spesifisert i en kontekst der en tilstand forventes" hvis en kolonne brukes direkte i WHERE-setningen, f.eks. VELG en FRA t HVOR a, mens en påstand som VELG kolonne IKKE ER NULL FRA t gir en syntaksfeil. BIT-datatypen, som bare kan lagre heltall 0 og 1 bortsett fra NULL, brukes ofte som en løsning for å lagre boolske verdier, men løsninger må brukes, for eksempel UPDATE t SET flag = IIF (col IS NOT NULL, 1, 0) WHERE flag = 0 for å konvertere mellom heltall og boolsk uttrykk.

PostgreSQL har en distinkt BOOLEAN-type som i standarden, [14] som gjør at predikater kan lagres direkte i en BOOLEAN-kolonne, og tillater bruk av en BOOLEAN-kolonne direkte som et predikat i en WHERE-ledd.

I MySQL behandles BOOLEAN som et alias for TINYINT (1) [15] SANT er det samme som heltall 1 og FALSE er det samme er heltall 0. [16] Ethvert heltall som ikke er null, er sant under forhold.

SQL92-standarden introduserte IS (NOT) TRUE, IS (NOT) FALSE, og IS (NOT) UNKNOWN-operatører som evaluerer et predikat, som foregikk innføringen av boolsk type i SQL: 1999.

SQL: 1999-standarden introduserte en BOOLEAN-datatype som en valgfri funksjon (T031). Når det er begrenset av en IKKE NULL-begrensning, oppfører en SQL BOOLEAN seg som boolere på andre språk, som bare kan lagre SANNE og FALSE verdier. Imidlertid, hvis den er nullbar, som er standard som alle andre SQL-datatyper, kan den også ha den spesielle nullverdien. Selv om SQL-standarden definerer tre bokstaver for BOOLEAN-typen - SANT, FALSE og Ukjent - står det også at NULL BOOLEAN og Ukjent "kan brukes om hverandre for å bety nøyaktig det samme". [17] [18] Dette har forårsaket en del kontrovers fordi identifikasjonen underkaster seg Ukjent regler for sammenligning av likhet for NULL. Mer presist Ukjent = Ukjent er ikke SANN, men Ukjent / NULL.[19] Fra 2012 implementerer få store SQL-systemer T031-funksjonen. [20] Firebird og PostgreSQL er bemerkelsesverdige unntak, selv om PostgreSQL implementerer ingen ukjent bokstavelig NULL kan brukes i stedet. [21]

Microsoft Access, som bruker Microsoft Jet Database Engine, [22] har heller ikke en boolsk datatype. I likhet med MS SQL Server bruker den en BIT-datatype. [23] I Access er det kjent som en Ja / Nei datatype [24] som kan ha to verdier Ja (True) eller No (False). BIT-datatypen i Access kan også representeres numerisk True er -1 og False er 0. [25] Dette skiller seg fra MS SQL Server på to måter, selv om begge er Microsoft-produkter:

  1. Access representerer SANT som -1, mens det er 1 i SQL Server
  2. Access støtter ikke Null tri-state, støttet av SQL Server

Tableau Software har en BOOLEAN-datatype. [26] Bokstavene til en boolsk verdi er sant eller usant. [27]

Tableau INT () -funksjonen konverterer en boolsk til et tall, og returnerer 1 for True og 0 for False. [28]


Informasjonsvitenskap

Forfatterinstruksjoner

Nyttige lenker

Sjekk innsendt papir

Spor akseptert papir

Når produksjonen av artikkelen din har startet, kan du spore statusen til artikkelen din via Track Your Accepted Article.

  • Sitatscore: 12.1Sitatscore:
    2020: 12.1
    CiteScore måler gjennomsnittlige siteringer mottatt per fagfellevurdert dokument publisert i denne tittelen. CiteScore-verdier er basert på siteringstall i en periode på fire år (f.eks. 2017-20) til fagfellevurderte dokumenter (artikler, anmeldelser, konferansepapirer, datapapirer og bokkapitler) publisert i de samme fire kalenderår, delt på antall av disse dokumentene i de samme fire årene (f.eks. 2017 - 20): Scopus kildedata, 2021
  • Påvirkningsfaktor: 5.910Påvirkningsfaktor:
    2019: 5.910
    Impact Factor måler gjennomsnittlig antall siteringer mottatt i et bestemt år av papirer publisert i tidsskriftet i løpet av de to foregående årene.
    Journal Citation Reports (Clarivate Analytics, 2020)
  • 5-års virkningsfaktor: 5.563Fem års virkningsfaktor:
    2019: 5.563
    For å beregne den femårige virkningsfaktoren telles sitater i 2019 til de foregående fem årene og divideres med kildepostene som ble publisert de fem foregående årene.
    Journal Citation Reports (Clarivate Analytics, 2020)
  • Kilde Normalisert innvirkning per papir (SNIP): 2.585Kilde Normalisert innvirkning per papir (SNIP):
    2020: 2.585
    SNIP måler kontekstuell siteringseffekt ved å vekte sitater basert på det totale antallet sitater i et emnefelt.
  • SCImago Journal Rank (SJR): 1.524SCImago Journal Rank (SJR):
    2020: 1.524
    SJR er en prestisje beregning basert på ideen om at ikke alle sitater er de samme. SJR bruker en lignende algoritme som Googles siderangering. Den gir et kvantitativt og et kvalitativt mål på tidsskriftets innvirkning.
  • Se mer om Journal Insights

  • 6% kvinne
  • 78% mann
  • 0% ikke-binært eller kjønnsdivers
  • 16% foretrekker å ikke avsløre
  • 13% kvinne
  • 72% mann
  • 0% ikke-binært eller mangfold på kjønn
  • 15% foretrekker å ikke avsløre

En internasjonal journal

Informasjonsvitenskap vil publisere originale, innovative og kreative forskningsresultater. Et mindre antall tidsbaserte opplærings- og oppmålingsbidrag vil bli publisert fra tid til annen.

Tidsskriftet er designet for å betjene forskere, utviklere, ledere, strategiske planleggere, studenter og andre.

Informasjonsvitenskap vil publisere originale, innovative og kreative forskningsresultater. Et mindre antall tidsbaserte opplærings- og undersøkelsesbidrag vil bli publisert fra tid til annen.

Tidsskriftet er designet for å betjene forskere, utviklere, ledere, strategiske planleggere, studenter og andre som er interessert i toppmoderne forskningsaktiviteter i informasjon, kunnskapsteknikk og intelligente systemer. Lesere antas å ha en felles interesse i informasjonsvitenskap, men med ulik bakgrunn innen felt som ingeniørfag, matematikk, statistikk, fysikk, informatikk, cellebiologi, molekylærbiologi, ledelsesvitenskap, kognitiv vitenskap, nevrobiologi, atferdsvitenskap og biokjemi.

Tidsskriftet publiserer refererte artikler av høy kvalitet. Det vektlegger en balansert dekning av både teori og praksis. Det anerkjenner og fremmer fullt ut en bredde av disiplinen informasjonsvitenskap.

Grunnlaget for informasjonsvitenskap:
Informasjonsteori, matematisk lingvistikk, automatateori, kognitiv vitenskap, teorier om kvalitativ atferd, kunstig intelligens, beregningsintelligens, myk databehandling, semiotikk, beregningsbiologi og bioinformatikk.

Implementeringer og informasjonsteknologi:
Intelligente systemer, genetiske algoritmer og modellering, uklar logikk og tilnærmet resonnement, kunstige nevrale nettverk, ekspert- og beslutningsstøttesystemer, læring og evolusjonær databehandling, ekspert- og beslutningsstøttesystemer, læring og evolusjonær databehandling, biometri, molekyloid nanocomputing, selvtilpasning og selvtillit -organisasjonssystemer, datateknikk, datafusjon, informasjon og kunnskap, adaptiv ad tilsynskontroll, diskrete hendelsessystemer, symbolske / numeriske og statistiske teknikker, persepsjoner og mønstergjenkjenning, design av algoritmer, programvaredesign, datasystemer og arkitekturevalueringer og verktøy, Menneske-datamaskingrensesnitt, datamaskinkommunikasjonsnettverk og modellering og databehandling med ord

Applikasjoner:
Produksjon, automatisering og mobilroboter, virtuell virkelighet, bildebehandling og datasynssystemer, fotonikknettverk, genomikk og bioinformatikk, hjernekartlegging, språk- og søkemotordesign, brukervennlig maskingrensesnitt for menn, datakompresjon og tekstabstraksjon og oppsummering, virtuell virkelighet , Økonomi og økonomi Modellering og optimalisering


1 Svar 1

1. Feil

Det er en uendelig løkke i løse:

Selvfølgelig er inngangen 'AB' ugyldig, men jeg forventer å få en SyntaxError i stedet for en uendelig løkke.

Andre innganger som inneholder syntaksfeil, resulterer i unntak som er vanskelig å forstå. For eksempel:

Noen feil innganger lykkes, men gir meningsløse resultater:

Når det oppstår ugyldige inndata, er det en god ide å heve en SyntaxError med en forklaring på problemet.

2. Alternativ tilnærming

Jeg kommer ikke til å gjennomgå koden i detalj, fordi tilnærmingen som tas her (gjentatt strengutskiftning) er treg og skjør og vanskelig å få gode feilmeldinger ut av.

Så i stedet skal jeg demonstrere den vanlige måten å takle denne typen problemer på. Ideen er å kombinere tre behandlingsfaser:

Tokenisering. På dette stadiet blir inngangsstrengen omgjort til en sekvens med tokens. For eksempel gitt denne inngangen:

tokenizer kan avgi denne sekvensen av tokens:

Analyse. I dette stadiet blir sekvensen av tokens omgjort til et parse-tre, en datastruktur som tilsvarer den syntaktiske strukturen til inngangen. For eksempel, gitt inngangen ovenfor, kan parseren konstruere følgende datastruktur:

Uttrykk evaluering. Denne fasen tar et parse-tre for et uttrykk, sammen med et miljø (en datastruktur som tilordner variabler til deres verdier), og returnerer verdien av uttrykket.

Det er flere gode grunner til å løse problemet ved hjelp av denne tilnærmingen:

Det er standard tilnærming, slik at andre programmerere lett vil forstå hvordan det fungerer.

Det er effektivt: hvert trinn må overføre inputene sine nøyaktig en gang, og dermed unngå gjentatte strengutskiftninger av koden i innlegget.

Å dele arbeidet opp i trinn med klart definerte innganger og utganger gjør det lettere å teste.

Tilnærmingen strekker seg til mer kompliserte applikasjoner, for eksempel tolkning av programmeringsspråk.

3. Tokenisering

Tokenisering implementeres ofte ved hjelp av en endelig maskin, men det er også ofte praktisk å bruke et vanlig uttrykk.

4. Analyse

Før du kan skrive en parser, må du lage en formell grammatikk. Dette er sannsynligvis den vanskeligste biten av det hele. Her er grammatikken jeg skal bruke, skrevet i Backus – Naur-form:

〈Variabel〉 :: | "B" | ... | "Z" | "a" | "b" | . | "z"

〈Term〉 :: = 〈Variabel〉 | 〈Konstant〉 | " ( " " ) "

〈UnaryExpr〉 :: 〈UnaryExpr〉 |

〈Implikasjon〉 :: = 〈UnaryExpr〉 (("→" | "↔") 〈Implikasjon〉)?

〈Konjunktjon〉 :: = 〈Implikasjon〉 ("∧" onKonjunktjon〉)?

〈Forskjell〉 :: = 〈Forbindelse〉 ("∨" isForskjell〉)?

For å konstruere parse-treet trenger vi datastrukturer for hver type node i treet, lettest definert ved hjelp av samlinger. Namedtuple:

Det er mange forskjellige teknikker for å skrive analysatorer. Jeg kunne bruke en parsergenerator som pyparsing, som konstruerer parseren fra en representasjon av den formelle grammatikken, men jeg synes det er mer illustrativt å skrive en rekursiv nedstigningsparser for hånd.

Vi begynner med noen globale konstanter:

Merk at jeg har brukt de innebygde funksjonene operator.eq, operator.and_, operator.or_ og operator.not_, i stedet for henholdsvis biconditional, and_func, eller_func og negate.

Nå for den rekursive nedstigningsparseren:

5. Evaluering

Evaluering av et parse-tre kan gjøres ved å rekursivt evaluere undertrærne og deretter kombinere resultatene:

6. Sannhetstabell

Det skal være klart nå hvordan man kan bygge sannhetstabellen for et uttrykk ved hjelp av den nye tilnærmingen:

Ring parse for å analysere uttrykket, få et parse-tre.

Beregn settet med variabler i treet. (Dette trinnet vil følge samme type implementeringsmønster som evaluert ovenfor.)

Iterer over radene i sannhetstabellen, for eksempel ved å bruke itertools.product.

For hver rad, bygg en ordbok som tilordner hver variabel til verdien i raden, og ring deretter evaluere for å få resultatet for raden.


Innhold

Ordet 'algoritme' har sine røtter i å latinisere nisba, noe som indikerer hans geografiske opprinnelse, med navnet til den persiske matematikeren Muhammad ibn Musa al-Khwarizmi til algorismus. [19] [20] Al-Khwārizmī (arabisert persisk الخوارزمی ca. 780–850) var en matematiker, astronom, geograf og lærd i visdomshuset i Bagdad, [13] hvis navn betyr 'den innfødte i Khwarazm', en region som var en del av det store Iran og nå er i Usbekistan. [21] [22] Omkring 825 skrev al-Khwarizmi en arabisk avhandling om det hindu-arabiske tallsystemet, som ble oversatt til latin i løpet av 1100-tallet. Manuskriptet starter med frasen Dixit Algorizmi ('Således sa Al-Khwarizmi'), der "Algorizmi" var oversetterens latinisering av Al-Khwarizmis navn. [23] Al-Khwarizmi var den mest leste matematikeren i Europa på slutten av middelalderen, først og fremst gjennom en annen av bøkene hans, Algebra. [24] På senmiddelalderens latin, algorismus, Engelsk 'algorisme', korrupsjonen av navnet hans, betydde ganske enkelt "desimaltallsystemet". [25] På 1400-tallet, under påvirkning av det greske ordet ἀριθμός (aritmos), 'Nummer' (jfr. 'aritmetikk'), ble det latinske ordet endret til algoritmus, og det tilsvarende engelske begrepet 'algoritme' ble først bekreftet på 1600-tallet, den moderne forstand ble introdusert på 1800-tallet. [26]

På engelsk ble den først brukt rundt 1230 og deretter av Chaucer i 1391. Engelsk adopterte det franske begrepet, men det var først på slutten av 1800-tallet at "algoritme" fikk den betydningen den har på moderne engelsk. [27]

En annen tidlig bruk av ordet er fra 1240, i en manual med tittelen Carmen de Algorismo komponert av Alexandre de Villedieu. Det begynner med:

Haec algorismus ars praesens dicitur, in qua / Talibus Indorum fruimur bis quinque figuris.

Algorisme er kunsten som vi for tiden bruker de indiske figurene, som nummer to ganger fem.

Diktet er noen få hundre linjer langt og oppsummerer kunsten å beregne med de nye stylede indiske terningene (Tali Indorum), eller hinduistall. [28]

En uformell definisjon kan være "et sett med regler som presist definerer en sekvens av operasjoner", [29] [ trenger tilbud for å verifisere ] som vil omfatte alle dataprogrammer (inkludert programmer som ikke utfører numeriske beregninger), og (for eksempel) enhver foreskrevet byråkratisk prosedyre [30] eller kokebokoppskrift. [31]

Generelt sett er et program bare en algoritme hvis det til slutt stopper [32] - selv om uendelige sløyfer noen ganger kan vise seg å være ønskelige.

Et prototypisk eksempel på en algoritme er den euklidiske algoritmen, som brukes til å bestemme den maksimale fellesdeleren for to heltall. Et eksempel (det er andre) er beskrevet av flytskjemaet ovenfor og som et eksempel i et senere avsnitt.

Boolos, Jeffrey & amp 1974, 1999 tilbyr en uformell betydning av ordet "algoritme" i følgende sitat:

Intet menneske kan skrive raskt nok, eller lenge nok, eller liten nok † († "mindre og mindre uten grense ... du vil prøve å skrive på molekyler, på atomer, på elektroner") for å liste alle medlemmer av en utallige uendelig angitt ved å skrive ut navnene, den ene etter den andre, i en eller annen notasjon. Men mennesker kan gjøre noe som er like nyttig, når det gjelder visse utallige sett: De kan gi eksplisitte instruksjoner for å bestemme nth medlem av settet, for vilkårlig endelig n. Slike instruksjoner skal gis ganske eksplisitt, i en form der de kunne følges av en datamaskin, eller av en menneske som bare er i stand til å utføre veldig elementære operasjoner på symboler. [33]

Et "utallig uendelig sett" er et element hvis elementer kan settes i en-til-en korrespondanse med heltallene. Dermed sier Boolos og Jeffrey at en algoritme innebærer instruksjoner for en prosess som "skaper" utdata heltall fra en vilkårlig "input" heltall eller heltall som i teorien kan være vilkårlig store. For eksempel kan en algoritme være en algebraisk ligning som f.eks y = m + n (dvs. to vilkårlige "inputvariabler" m og n som produserer en produksjon y), men forskjellige forfatteres forsøk på å definere forestillingen indikerer at ordet innebærer mye mer enn dette, noe i størrelsesorden (for tilleggseksemplet):

Nøyaktige instruksjoner (på et språk forstått av "datamaskinen") [34] for en rask, effektiv, "god" [35] prosess som spesifiserer "trekkene" til "datamaskinen" (maskin eller menneske, utstyrt med det nødvendige internt inneholdt informasjon og evner) [36] for å finne, dekode og deretter behandle vilkårlige inngangs heltall / symboler m og n, symboler + og = ... og "effektivt" [37] produserer, på en "rimelig" tid, [38] output-heltall y på et spesifisert sted og i et spesifisert format.

Konseptet av algoritme brukes også til å definere forestillingen om avgjørbarhet - en forestilling som er sentral for å forklare hvordan formelle systemer blir til med utgangspunkt i et lite sett med aksiomer og regler. I logikken kan ikke tiden som en algoritme krever å fullføre måles, da den tilsynelatende ikke er relatert til den vanlige fysiske dimensjonen. Fra slike usikkerheter, som kjennetegner pågående arbeid, stammer den utilgjengeligheten av en definisjon av algoritme som passer både konkret (i noen forstand) og abstrakt bruk av begrepet.

Algoritmer er avgjørende for måten datamaskiner behandler data på. Mange dataprogrammer inneholder algoritmer som beskriver de spesifikke instruksjonene en datamaskin skal utføre - i en bestemt rekkefølge - for å utføre en spesifisert oppgave, for eksempel beregning av ansattes lønnsslipp eller utskrift av studenters rapportkort. En algoritme kan således betraktes som en hvilken som helst sekvens av operasjoner som kan simuleres av et Turing-komplett system. Forfattere som hevder denne oppgaven inkluderer Minsky (1967), Savage (1987) og Gurevich (2000):

Minsky: "Men vi vil også sammen med Turing fastholde at enhver prosedyre som" naturlig "kan kalles effektiv, faktisk kan realiseres av en (enkel) maskin. Selv om dette kan virke ekstremt, er argumentene ... til fordel for den er vanskelig å tilbakevise ". [39]

Gurevich: "... Turing's uformelle argument til fordel for sin avhandling rettferdiggjør en sterkere avhandling: hver algoritme kan simuleres av en Turing-maskin ... ifølge Savage [1987] er en algoritme en beregningsprosess definert av en Turing-maskin". [40]

Turing-maskiner kan definere beregningsprosesser som ikke avsluttes. De uformelle definisjonene av algoritmer krever generelt at algoritmen alltid avsluttes. Dette kravet gjør oppgaven med å avgjøre om en formell prosedyre er en algoritme i det generelle tilfellet umulig - på grunn av en viktig teorem om beregningsteori kjent som det stoppende problemet.

Når en algoritme er assosiert med prosesseringsinformasjon, kan data vanligvis leses fra en inngangskilde, skrives til en utgangsenhet og lagres for videre behandling. Lagrede data blir sett på som en del av den interne tilstanden til enheten som utfører algoritmen. I praksis er staten lagret i en eller flere datastrukturer.

For noen av disse beregningsprosessene må algoritmen defineres nøye: spesifisert på den måten den gjelder under alle mulige omstendigheter som kan oppstå. Dette betyr at alle betingede trinn må behandles systematisk, fra sak til sak må kriteriene for hvert tilfelle være klare (og beregningsbare).

Fordi en algoritme er en presis liste over nøyaktige trinn, er beregningsrekkefølgen alltid avgjørende for at algoritmen skal fungere. Instruksjoner antas vanligvis å være oppført eksplisitt, og blir beskrevet som å starte "fra toppen" og gå "ned til bunnen" - en idé som blir beskrevet mer formelt av strøm av kontroll.

Så langt har diskusjonen om formalisering av en algoritme antatt premissene for tvingende programmering. Dette er den vanligste forestillingen - en som prøver å beskrive en oppgave på diskrete, "mekaniske" måter. Unikt for denne oppfatningen av formaliserte algoritmer er tildelingsoperasjonen, som setter verdien til en variabel. Det stammer fra intuisjonen til "minne" som en kladdeplate. Et eksempel på en slik oppgave finner du nedenfor.

For noen alternative forestillinger om hva som utgjør en algoritme, se funksjonell programmering og logisk programmering.

Uttrykkende algoritmer Rediger

Algoritmer kan uttrykkes i mange typer notasjoner, inkludert naturlige språk, pseudokode, flytskjemaer, drakon-diagrammer, programmeringsspråk eller kontrolltabeller (behandlet av tolker). Naturlige språkuttrykk for algoritmer har en tendens til å være uttalt og tvetydig, og brukes sjelden til komplekse eller tekniske algoritmer.Pseudokode, flytskjemaer, drakon-diagrammer og kontrolltabeller er strukturerte måter å uttrykke algoritmer som unngår mange uklarheter som er vanlige i utsagnene basert på naturlig språk. Programmeringsspråk er primært ment for å uttrykke algoritmer i en form som kan kjøres av en datamaskin, men brukes også ofte som en måte å definere eller dokumentere algoritmer på.

Det er et bredt utvalg av representasjoner mulig, og man kan uttrykke et gitt Turing-maskinprogram som en sekvens av maskintabeller (se maskin med endelig tilstand, tilstandsovergangstabell og kontrolltabell for mer), som flytskjemaer og drakon-diagrammer (se tilstandsdiagram for mer), eller som en form for rudimentær maskinkode eller monteringskode kalt "sett med firdobler" (se Turing-maskin for mer).

Representasjoner av algoritmer kan deles inn i tre aksepterte nivåer av Turing-maskinbeskrivelsen, som følger: [41]

1 Beskrivelse på høyt nivå "... prosa for å beskrive en algoritme, ignorere implementeringsdetaljene. På dette nivået trenger vi ikke å nevne hvordan maskinen administrerer båndet eller hodet." 2 Implementeringsbeskrivelse "... prosa brukes til å definere måten Turing-maskinen bruker hodet på og måten den lagrer data på båndet sitt. På dette nivået gir vi ikke detaljer om tilstander eller overgangsfunksjon." 3 Formell beskrivelse Mest detaljert, "laveste nivå", gir Turing-maskinens "tilstandstabell".

For et eksempel på den enkle algoritmen "Add m + n" beskrevet i alle tre nivåene, se Algoritme # Eksempler.

Algoritmedesign refererer til en metode eller en matematisk prosess for problemløsning og engineering algoritmer. Utformingen av algoritmer er en del av mange løsningsteorier for operasjonsforskning, for eksempel dynamisk programmering og deling og erobring. Teknikker for å designe og implementere algoritmedesign kalles også algoritmedesignmønstre, [42] med eksempler som inkluderer malemetodemønsteret og dekoratormønsteret.

En av de viktigste aspektene ved algoritmedesign er ressurseffektivitet (kjøretid, minnebruk), den store O-notasjonen brukes til å beskrive f.eks. en algoritmes vekst i løpetid når størrelsen på inngangen øker.

Typiske trinn i utviklingen av algoritmer:

  1. Problemdefinisjon
  2. Utvikling av en modell
  3. Spesifikasjon av algoritmen
  4. Designe en algoritme
  5. Kontrollerer korrektheten av algoritmen
  6. Analyse av algoritme
  7. Implementering av algoritme
  8. Programtesting
  9. Dokumentasjonsforberedelse [avklaring nødvendig]

De fleste algoritmer er ment å implementeres som dataprogrammer. Imidlertid implementeres algoritmer også på andre måter, for eksempel i et biologisk nevralt nettverk (for eksempel den menneskelige hjerne som implementerer aritmetikk eller et insekt som leter etter mat), i en elektrisk krets eller i en mekanisk enhet.

I datasystemer er en algoritme i utgangspunktet en forekomst av logikk skrevet i programvare av programvareutviklere, for å være effektiv for den eller de tiltenkte "måldatamaskinene" å produsere produksjon fra gitt (kanskje null) inngang. En optimal algoritme, selv om den kjører i gammel maskinvare, vil gi raskere resultater enn en ikke-optimal (høyere tidskompleksitet) algoritme for samme formål, og kjøre i mer effektiv maskinvare. Derfor blir algoritmer, som datamaskinvare, ansett som teknologi.

"Elegante" (kompakte) programmer, "gode" (raske) programmer : Begrepet "enkelhet og eleganse" dukker opp uformelt i Knuth og nettopp i Chaitin:

Knuth: "... vi vil ha god algoritmer i noen løst definerte estetiske forstand. Et kriterium ... er hvor lang tid det tar å utføre algoritmen .... Andre kriterier er algoritmens tilpasningsevne til datamaskiner, dens enkelhet og eleganse, osv. "[43] Chaitin:" ... et program er "elegant", som jeg mener at det er det minste mulige programmet for å produsere utdata som det gjør "[ 44]

Chaitin går foran sin definisjon med: "Jeg skal vise at du ikke kan bevise at et program er" elegant "" - slik et bevis vil løse Halting-problemet (ibid).

Algoritme versus funksjon kan beregnes av en algoritme: For en gitt funksjon kan det eksistere flere algoritmer. Dette er sant, selv uten å utvide det tilgjengelige instruksjonssettet som er tilgjengelig for programmereren. Rogers bemerker at "Det er viktig å skille mellom forestillingen om algoritme, dvs. prosedyre og forestillingen om funksjon som kan beregnes etter algoritme, dvs. kartlegging gitt etter fremgangsmåte. Den samme funksjonen kan ha flere forskjellige algoritmer ". [45]

Dessverre kan det være en kompromiss mellom godhet (hastighet) og eleganse (kompaktitet) - et elegant program kan ta flere skritt for å fullføre en beregning enn en mindre elegant. Et eksempel som bruker Euclids algoritme vises nedenfor.

Datamaskiner (og datamaskiner), modeller for beregning: En datamaskin (eller menneskelig "datamaskin" [46]) er en begrenset type maskin, en "diskret deterministisk mekanisk enhet" [47] som blindt følger instruksjonene. [48] ​​Melzaks og Lambeks primitive modeller [49] reduserte denne forestillingen til fire elementer: (i) diskret, skillebar lokasjoner, (ii) diskret, skiller seg ikke tellere [50] (iii) en agent, og (iv) en liste over instruksjoner som er effektiv i forhold til agentens evne. [51]

Minsky beskriver en mer behagelig variasjon av Lambeks "abacus" -modell i sin "Very Simple Bases for Computability". [52] Minskys maskin fortsetter sekvensielt gjennom sine fem (eller seks, avhengig av hvordan man teller) instruksjoner, med mindre enten en betinget IF-THEN GOTO eller en ubetinget GOTO endrer programflyten ut av sekvensen. Foruten HALT, inneholder Minskys maskin tre oppdrag (erstatning, erstatning) [53] operasjoner: NULL (f.eks. innholdet på stedet erstattet av 0: L ← 0), SUCCESSOR (f.eks. L ← L + 1) og AVSLAG (f.eks. L ← L - 1). [54] Sjelden må en programmerer skrive "kode" med et så begrenset instruksjonssett. Men Minsky viser (som Melzak og Lambek gjør) at maskinen hans er Turing komplett med bare fire generelle typer av instruksjonene: betinget GOTO, ubetinget GOTO, tildeling / erstatning / erstatning og HALT. Imidlertid er det også nødvendig med noen forskjellige oppdragsinstruksjoner (f.eks. DECREMENT, INCREMENT og ZERO / CLEAR / EMPTY for en Minsky-maskin) for Turing-fullstendighet. Den eksakte spesifikasjonen er noe opp til designeren. Den ubetingede GOTO er en bekvemmelighet den kan konstrueres ved å initialisere en dedikert plassering til null, f.eks. instruksjonen "Z ← 0" deretter er instruksjonen IF Z = 0 DAN GOTO xxx ubetinget.

Simulering av en algoritme: datamaskinspråk: Knuth råder leseren til at "den beste måten å lære seg en algoritme er å prøve den ... ta umiddelbart penn og papir og arbeid gjennom et eksempel". [55] Men hva med en simulering eller gjennomføring av den virkelige tingen? Programmereren må oversette algoritmen til et språk som simulatoren / datamaskinen / databehandleren kan effektivt henrette. Stone gir et eksempel på dette: når man beregner røttene til en kvadratisk ligning, må databehandleren vite hvordan man tar en kvadratrot. Hvis de ikke gjør det, må algoritmen, for å være effektiv, gi et sett med regler for å trekke ut en kvadratrot. [56]

Dette betyr at programmereren må kunne et "språk" som er effektivt i forhold til målberegningsagenten (datamaskin / datamaskin).

Men hvilken modell skal brukes til simuleringen? Van Emde Boas bemerker at "selv om vi baserer kompleksitetsteorien på abstrakt i stedet for betongmaskiner, forblir vilkårlighet om valg av modell. Det er på dette tidspunktet forestillingen om simulering kommer inn ". [57] Når hastighet måles, betyr instruksjons-settet noe. For eksempel vil underprogrammet i Euclids algoritme for å beregne resten utføre mye raskere hvis programmereren hadde en" modulus "-instruksjon tilgjengelig i stedet for bare subtraksjon (eller verre). : bare Minskys "dekrement").

Strukturert programmering, kanoniske strukturer: I følge Church-Turing-avhandlingen kan en hvilken som helst algoritme beregnes etter en modell som er kjent for å være Turing fullført, og ifølge Minskys demonstrasjoner krever Turing-fullstendighet bare fire instruksjonstyper - betinget GOTO, ubetinget GOTO, oppgave, HALT. Kemeny og Kurtz bemerker at mens "udisiplinert" bruk av ubetingede GOTO-er og betingede IF-THEN GOTO-er kan resultere i "spaghetti-kode", kan en programmerer skrive strukturerte programmer ved å bruke bare disse instruksjonene på den annen side. " for vanskelig, til å skrive dårlig strukturerte programmer på et strukturert språk ". [58] Tausworthe utvider de tre Böhm-Jacopini-kanoniske strukturene: [59] SEKVENS, IF-THEN-ELSE, og WHILE-DO, med to til: DO-WHILE og CASE. [60] En ekstra fordel med et strukturert program er at det egner seg til bevis på korrekthet ved bruk av matematisk induksjon. [61]

Kanoniske flytskjema-symboler [62] : Den grafiske assistenten kalt et flytdiagram, gir en måte å beskrive og dokumentere en algoritme (og et dataprogram på en). I likhet med programflyten til en Minsky-maskin starter et flytskjema alltid øverst på siden og fortsetter nedover. Dens primære symboler er bare fire: den dirigerte pilen som viser programflyten, rektangelet (SEKVENS, GOTO), diamanten (IF-THEN-ELSE) og prikken (OR-tie). De kanoniske strukturene Böhm – Jacopini er laget av disse primitive formene. Underkonstruksjoner kan "hekke" i rektangler, men bare hvis en enkelt utgang oppstår fra overbygningen. Symbolene, og deres bruk for å bygge de kanoniske strukturene, er vist i diagrammet.

Algoritmeeksempel Rediger

En av de enkleste algoritmene er å finne det største tallet i en liste over tall i tilfeldig rekkefølge. Å finne løsningen krever å se på hvert tall i listen. Fra dette følger en enkel algoritme, som kan angis i en beskrivelse på høyt nivå i engelsk prosa, som:

Beskrivelse på høyt nivå:

  1. Hvis det ikke er noen tall i settet, er det ikke noe høyeste tall.
  2. Anta at det første tallet i settet er det største tallet i settet.
  3. For hvert gjenværende nummer i settet: hvis dette tallet er større enn det nåværende største tallet, anser dette tallet for å være det største tallet i settet.
  4. Når det ikke er noen tall igjen i settet som skal gjentas, bør du vurdere det nåværende antallet som det største antallet i settet.

(Quasi-) formell beskrivelse: Skrevet i prosa, men mye nærmere det høye nivået i et dataprogram, er følgende den mer formelle kodingen av algoritmen i pseudokode eller pidgin-kode:

  • "←" betegner oppdrag. For eksempel, "størstepunkt"betyr at verdien av største endringer i verdien av punkt.
  • "komme tilbake"avslutter algoritmen og sender ut følgende verdi.

Euclids algoritme Rediger

Euclids algoritme for å beregne den største fellesdeleren (GCD) til to tall vises som proposisjon II i bok VII ("Elementary Number Theory") av hans Elementer. [63] Euclid stiller problemet slik: "Gitt to tall som ikke er prime for hverandre, for å finne deres største felles mål". Han definerer "Et tall [å være] et mangfold sammensatt av enheter": et tellende tall, et positivt heltall som ikke inkluderer null. Å "måle" er å plassere en kortere målelengde s suksessivt (q ganger) langs lengre lengde l til den gjenværende delen r er mindre enn den kortere lengden s. [64] I moderne ord, resten r = lq×s, q å være kvotienten, eller resten r er "modulus", den helt-brøkdel som er igjen etter divisjonen. [65]

For at Euclids metode skal lykkes, må startlengdene tilfredsstille to krav: (i) lengdene må ikke være null, OG (ii) subtraksjonen må være "riktig", dvs. en test må garantere at det minste av de to tallene blir trukket fra det større (eller de to kan være like, så deres subtraksjon gir null).

Euclids originale bevis legger til et tredje krav: de to lengdene må ikke være primære for hverandre. Euclid fastslo dette slik at han kunne konstruere et reductio ad absurdum bevis på at de to tallene har et felles mål faktisk størst. [66] Mens Nicomachus 'algoritme er den samme som Euklides, gir tallene "1" for deres vanlige mål når tallene er primtall for hverandre. Så, for å være presis, er følgende virkelig Nicomachus 'algoritme.

Dataspråk for Euclids algoritme Edit

Bare noen få instruksjoner typer kreves for å utføre Euclids algoritme - noen logiske tester (betinget GOTO), ubetinget GOTO, tildeling (erstatning) og subtraksjon.

  • EN plassering symboliseres med store bokstaver, f.eks. S, A, etc.
  • Den varierende mengden (tallet) på en plassering er skrevet med små bokstaver og (vanligvis) assosiert med stedets navn. For eksempel kan plassering L i starten inneholde nummeret l = 3009.

Et uelegant program for Euclids algoritme Edit

Følgende algoritme er innrammet som Knuths firetrinnsversjon av Euclid og Nicomachus ', men i stedet for å bruke divisjon for å finne resten, bruker den suksessive subtraksjoner av kortere lengde s fra gjenværende lengde r før r er mindre enn s. Beskrivelsen på høyt nivå, vist med fet skrift, er tilpasset Knuth 1973: 2–4:

E0: [Forsikre deg rs.]

E1: [Finn resten]: Inntil gjenværende lengde r i R er mindre enn den kortere lengden s i S, trekk målingstallet gjentatte ganger s i S fra gjenværende lengde r i R.

E2: [Er resten null?]: HVER (i) det siste målet var nøyaktig, resten i R er null, og programmet kan stoppe, ELLER (ii) algoritmen må fortsette: det siste målet etterlot en rest i R mindre enn målingstallet i S.

E3: [Utveksling s og r]: Mutteren til Euclids algoritme. Bruk resten r å måle det som tidligere var mindre antall s L fungerer som et midlertidig sted.

Et elegant program for Euclids algoritme Edit

Den følgende versjonen av Euclids algoritme krever bare seks kjerneinstruksjoner for å gjøre det tretten kreves av "Inelegant" verre, "Inelegant" krever mer typer av instruksjonene. [ avklare Flytskjemaet for "Elegant" finner du øverst i denne artikkelen. I det (ustrukturerte) grunnleggende språket er trinnene nummerert, og instruksjonen LET [] = [] er oppdragsinstruksjonen symbolisert med ←.

Hvordan "Elegant" fungerer: I stedet for en ytre "Euklidsløyfe" skifter "Elegant" frem og tilbake mellom to "ko-sløyfer", en A & gt B-sløyfe som beregner A ← A - B, og en B ≤ A sløyfe som beregner B ← B - A. Dette fungerer fordi, når endelig minuend M er mindre enn eller lik subtrahend S (Difference = Minuend - Subtrahend), kan minuend bli s (den nye målelengden) og subtrahend kan bli den nye r (lengden som skal måles) med andre ord "følelsen" av subtraksjonen snur.

Følgende versjon kan brukes med programmeringsspråk fra C-familien:

Testing av euklide algoritmer Edit

Gjør en algoritme det forfatteren vil at den skal gjøre? Noen få testtilfeller gir vanligvis litt tillit til kjernefunksjonaliteten. Men tester er ikke nok. For testsaker bruker en kilde [67] 3009 og 884. Knuth foreslo 40902, 24140. Et annet interessant tilfelle er de to relativt primtallene 14157 og 5950.

Men "unntakstilfeller" [68] må identifiseres og testes. Vil "Inelegant" fungere ordentlig når R & gt S, S & gt R, R = S? Ditto for "Elegant": B & gt A, A & gt B, A = B? (Ja til alt). Hva skjer når ett tall er null, begge tall er null? ("Inelegant" beregner for alltid i alle tilfeller "Elegant" beregner for alltid når A = 0.) Hva skjer hvis negativ tall er angitt? Brøktal? Hvis inngangstallene, dvs. domenet til funksjonen beregnet av algoritmen / programmet, bare skal inkludere positive heltall inkludert null, indikerer feilene ved null at algoritmen (og programmet som instantierer det) er en delvis funksjon i stedet for en totalfunksjon. En bemerkelsesverdig feil på grunn av unntak er rakettfeil Ariane 5 Flight 501 (4. juni 1996).

Bevis på programkorrekthet ved bruk av matematisk induksjon: Knuth demonstrerer anvendelsen av matematisk induksjon i en "utvidet" versjon av Euclids algoritme, og han foreslår "en generell metode som kan brukes til å bevise gyldigheten av enhver algoritme". [69] Tausworthe foreslår at et mål på kompleksiteten til et program er lengden på korrekthetssikkerheten. [70]

Måling og forbedring av Euclid-algoritmene Edit

Eleganse (kompakthet) kontra godhet (hastighet): Med bare seks kjerneinstruksjoner er "Elegant" den klare vinneren, sammenlignet med "Inelegant" med tretten instruksjoner. Imidlertid er "Inelegant" det raskere (den ankommer HALT i færre trinn). Algoritmeanalyse [71] indikerer hvorfor dette er tilfellet: "Elegant" gjør det to betingede tester i hver subtraksjonssløyfe, mens "Inelegant" bare gjør en. Ettersom algoritmen (vanligvis) krever mange gjennomløp, gjennomsnittlig mye tid er bortkastet med å gjøre et "B = 0?" test som bare er nødvendig etter at resten er beregnet.

Kan algoritmene forbedres?: Når programmereren vurderer et program "passe" og "effektivt" - det vil si at det beregner funksjonen som forfatteren har ment - så blir spørsmålet, kan det forbedres?

Kompaktiteten til "Inelegant" kan forbedres ved å eliminere fem trinn. Men Chaitin beviste at komprimering av en algoritme ikke kan automatiseres av en generalisert algoritme [72] snarere, det kan bare gjøres heuristisk, dvs. ved uttømmende søk (eksempler som finnes på Busy beaver), prøving og feiling, kløkt, innsikt, anvendelse av induktiv resonnement osv. Observer at trinn 4, 5 og 6 gjentas i trinn 11, 12 og 13. Sammenligning med "Elegant" gir et hint om at disse trinnene, sammen med trinn 2 og 3, kan elimineres. Dette reduserer antall kjerneinstruksjoner fra tretten til åtte, noe som gjør den "mer elegant" enn "Elegant", i ni trinn.

Hastigheten på "Elegant" kan forbedres ved å flytte "B = 0?" test utenfor de to subtraksjonssløyfene. Denne endringen krever tillegg av tre instruksjoner (B = 0 ?, A = 0 ?, GOTO). Nå beregner "Elegant" eksempeltallene raskere om dette alltid er tilfelle for en gitt A, B og R, S vil kreve en detaljert analyse.

Det er ofte viktig å vite hvor mye av en bestemt ressurs (som tid eller lagring) som teoretisk sett kreves for en gitt algoritme. Metoder er utviklet for analyse av algoritmer for å oppnå slike kvantitative svar (estimater), for eksempel har sorteringsalgoritmen ovenfor et tidskrav på O (n), ved hjelp av den store O-notasjonen med n som lengden på listen.Algoritmen trenger til enhver tid bare å huske to verdier: det største tallet som er funnet hittil, og den nåværende posisjonen i inngangslisten. Derfor sies det å ha et plassbehov på O (1), hvis plassen som kreves for å lagre inngangstallene ikke telles, eller O (n) hvis det telles.

Ulike algoritmer kan fullføre den samme oppgaven med et annet sett med instruksjoner på mindre eller mer tid, plass eller 'innsats' enn andre. For eksempel overgår en binær søkealgoritme (med kostnad O (log n)) et sekvensielt søk (kostnad O (n)) når den brukes til tabelloppslag på sorterte lister eller matriser.

Formell versus empirisk redigering

Analysen og studiet av algoritmer er en disiplin innen informatikk, og praktiseres ofte abstrakt uten bruk av et spesifikt programmeringsspråk eller implementering. I denne forstand ligner algoritmeanalyse andre matematiske disipliner ved at den fokuserer på algoritmens underliggende egenskaper og ikke på detaljene til en bestemt implementering. Vanligvis brukes pseudokode til analyse, da det er den enkleste og mest generelle representasjonen. Til slutt implementeres de fleste algoritmer vanligvis på bestemte maskinvare / programvareplattformer, og deres algoritmiske effektivitet blir til slutt satt på prøve ved hjelp av ekte kode. For løsningen av et "engangsproblem", kan effektiviteten til en bestemt algoritme ikke ha vesentlige konsekvenser (med mindre n er ekstremt stor), men for algoritmer designet for rask interaktiv, kommersiell eller vitenskapelig bruk med lang levetid, kan det være kritisk. Å skalere fra liten n til stor n avslører ofte ineffektive algoritmer som ellers er godartede.

Empirisk testing er nyttig fordi den kan avdekke uventede interaksjoner som påvirker ytelsen. Benchmarks kan brukes til å sammenligne før / etter potensielle forbedringer til en algoritme etter programoptimalisering. Empiriske tester kan imidlertid ikke erstatte formell analyse og er ikke trivielle å utføre på en rettferdig måte. [73]

Utførelseseffektivitet Rediger

For å illustrere de potensielle forbedringene som er mulige selv i veletablerte algoritmer, kan en nylig viktig innovasjon, relatert til FFT-algoritmer (brukt mye innen bildebehandling), redusere behandlingstiden opptil 1000 ganger for applikasjoner som medisinsk bildebehandling. [74] Generelt avhenger hastighetsforbedringer av spesielle egenskaper ved problemet, som er veldig vanlig i praktiske anvendelser. [75] Hastigheter av denne størrelsen gjør at databehandlingsenheter som bruker omfattende bildebehandling (som digitale kameraer og medisinsk utstyr), bruker mindre strøm.

Det er forskjellige måter å klassifisere algoritmer, hver med sine egne fordeler.

Ved implementering Rediger

En måte å klassifisere algoritmer på er implementeringsmåter.

Etter designparadigme Rediger

En annen måte å klassifisere algoritmer på er deres designmetodikk eller paradigme. Det er et visst antall paradigmer, hver forskjellig fra den andre. Videre inneholder hver av disse kategoriene mange forskjellige typer algoritmer. Noen vanlige paradigmer er:

    returner et riktig svar med stor sannsynlighet. F.eks. RP er underklassen til disse som kjører i polynomisk tid. returner alltid riktig svar, men kjøretiden deres er bare sannsynlig bundet, f.eks. ZPP.

Optimaliseringsproblemer Rediger

For optimaliseringsproblemer er det en mer spesifikk klassifisering av algoritmer, en algoritme for slike problemer kan falle inn i en eller flere av de generelle kategoriene som er beskrevet ovenfor, samt i en av følgende:

Lineær programmering Når du søker etter optimale løsninger på en lineær funksjon bundet til lineære likestillings- og ulikhetsbegrensninger, kan problemets begrensninger brukes direkte til å produsere de optimale løsningene. Det er algoritmer som kan løse ethvert problem i denne kategorien, for eksempel den populære simpleksalgoritmen. [80] Problemer som kan løses med lineær programmering inkluderer maksimalt strømningsproblem for dirigerte grafer. Hvis et problem i tillegg krever at en eller flere av de ukjente må være et heltall, klassifiseres det i heltallsprogrammering. En lineær programmeringsalgoritme kan løse et slikt problem hvis det kan bevises at alle begrensninger for heltallverdier er overfladiske, dvs. løsningene tilfredsstiller uansett disse begrensningene. Generelt sett brukes en spesialisert algoritme eller en algoritme som finner omtrentlige løsninger, avhengig av problemets problemer. Dynamisk programmering Når et problem viser optimale underkonstruksjoner - det vil si at den optimale løsningen på et problem kan konstrueres fra optimale løsninger til delproblemer - og overlappende delproblemer, noe som betyr at de samme delproblemene brukes til å løse mange forskjellige problemforekomster. dynamisk programmering unngår å beregne løsninger som allerede er beregnet. For eksempel kan Floyd-Warshall-algoritmen, den korteste veien til et mål fra et toppunkt i en vektet graf, bli funnet ved å bruke den korteste veien til målet fra alle tilstøtende hjørner. Dynamisk programmering og memoisering går sammen. Hovedforskjellen mellom dynamisk programmering og deling og erobring er at delproblemer er mer eller mindre uavhengige i deling og erobring, mens delproblemer overlapper i dynamisk programmering. Forskjellen mellom dynamisk programmering og grei rekursjon ligger i hurtigbufring eller memoisering av rekursive samtaler. Når underproblemer er uavhengige og det ikke er noen gjentakelse, hjelper ikke memoisering, derfor er ikke dynamisk programmering en løsning for alle komplekse problemer. Ved å bruke memoisering eller vedlikeholde en tabell med allerede løste problemer, reduserer dynamisk programmering den eksponentielle naturen til mange problemer til polynomskompleksitet. Den grådige metoden En grådig algoritme ligner på en dynamisk programmeringsalgoritme ved at den fungerer ved å undersøke underkonstruksjoner, i dette tilfellet ikke av problemet, men av en gitt løsning. Slike algoritmer starter med en løsning, som kan bli gitt eller blitt konstruert på en eller annen måte, og forbedrer den ved å gjøre små modifikasjoner. For noen problemer kan de finne den optimale løsningen mens de for andre stopper ved lokal optima, det vil si løsninger som ikke kan forbedres av algoritmen, men som ikke er optimale. Den mest populære bruken av grådige algoritmer er å finne det minimale spennende treet der det er mulig å finne den optimale løsningen med denne metoden. Huffman Tree, Kruskal, Prim, Sollin er grådige algoritmer som kan løse dette optimaliseringsproblemet. Den heuristiske metoden I optimaliseringsproblemer kan heuristiske algoritmer brukes til å finne en løsning nær den optimale løsningen i tilfeller der det er upraktisk å finne den optimale løsningen. Disse algoritmene fungerer ved å komme nærmere og nærmere den optimale løsningen når de utvikler seg. I prinsippet, hvis de kjøres i uendelig lang tid, vil de finne den optimale løsningen. Fordelene deres er at de kan finne en løsning veldig nær den optimale løsningen på relativt kort tid. Slike algoritmer inkluderer lokalt søk, tabusøk, simulert annealing og genetiske algoritmer. Noen av dem, som simulert annealing, er ikke-deterministiske algoritmer, mens andre, som tabu-søk, er deterministiske. Når en bundet til feilen i den ikke-optimale løsningen er kjent, blir algoritmen videre kategorisert som en tilnærmelsesalgoritme.

Etter studieretning Rediger

Felt har en tendens til å overlappe hverandre, og fremgang i algoritmer i ett felt kan forbedre andre felt, noen ganger helt ubeslektede. For eksempel ble dynamisk programmering oppfunnet for optimalisering av ressursforbruk i industrien, men brukes nå til å løse et bredt spekter av problemer innen mange felt.

Etter kompleksitet Rediger

Algoritmer kan klassifiseres etter hvor lang tid de trenger å fullføre i forhold til inngangsstørrelsen:

  • Konstant tid: hvis tiden som trengs av algoritmen, er den samme, uavhengig av inngangsstørrelsen. F.eks. en tilgang til et matriseelement.
  • Logaritmisk tid: hvis tiden er en logaritmisk funksjon av inngangsstørrelsen. F.eks. binær søkealgoritme.
  • Lineær tid: hvis tiden er proporsjonal med inngangsstørrelsen. F.eks. gjennomgangen av en liste.
  • Polynomtid: hvis tiden er en effekt av inngangsstørrelsen. F.eks. algoritmen for boblesortering har kvadratisk tidskompleksitet.
  • Eksponentiell tid: hvis tiden er en eksponentiell funksjon av inngangsstørrelsen. F.eks. Brute-force-søk.

Noen problemer kan ha flere algoritmer med forskjellig kompleksitet, mens andre problemer kan ha ingen algoritmer eller ingen kjente effektive algoritmer. Det er også kartlegginger fra noen problemer til andre problemer. På grunn av dette ble det funnet mer passende å klassifisere problemene i stedet for algoritmene i ekvivalensklasser basert på kompleksiteten til best mulige algoritmer for dem.

Adjektivet "kontinuerlig" når det brukes på ordet "algoritme" kan bety:

  • En algoritme som opererer på data som representerer kontinuerlige størrelser, selv om disse dataene er representert ved diskrete tilnærminger - slike algoritmer studeres i numerisk analyse eller
  • En algoritme i form av en differensialligning som fungerer kontinuerlig på dataene, som kjører på en analog datamaskin. [81]

Algoritmer er i seg selv vanligvis ikke patenterbare. I USA utgjør et krav som utelukkende består av enkle manipulasjoner av abstrakte konsepter, tall eller signaler ikke "prosesser" (USPTO 2006), og algoritmer er derfor ikke patenterbare (som i Gottschalk mot Benson). Imidlertid er praktiske anvendelser av algoritmer noen ganger patenterbare. For eksempel, i Diamond v. Diehr, ble anvendelsen av en enkel tilbakemeldingsalgoritme for å hjelpe til med herding av syntetisk gummi ansett som patenterbar. Patentering av programvare er svært kontroversiell, og det er sterkt kritiserte patenter som involverer algoritmer, spesielt datakomprimeringsalgoritmer, slik som Unisys 'LZW-patent.

I tillegg har noen kryptografiske algoritmer eksportrestriksjoner (se eksport av kryptografi).

Ancient Near East Rediger

De tidligste bevisene på algoritmer finnes i den babyloniske matematikken i det gamle Mesopotamia (det moderne Irak). En sumerisk leirtavle funnet i Shuruppak nær Bagdad og datert til rundt 2500 f.Kr., beskrev den tidligste divisjonsalgoritmen. [12] Under Hammurabi-dynastiet rundt 1800-1600 f.Kr. beskrev babylonske leirtabletter algoritmer for beregningsformler. [82] Algoritmer ble også brukt i babylonsk astronomi. Babylonske leirtavler beskriver og bruker algoritmiske prosedyrer for å beregne tid og sted for betydelige astronomiske hendelser. [83]

Algoritmer for aritmetikk finnes også i gammel egyptisk matematikk, som dateres tilbake til Rhind Mathematical Papyrus ca 1550 f.Kr. [12] Algoritmer ble senere brukt i gammel hellenistisk matematikk. To eksempler er Sikten av Eratosthenes, som ble beskrevet i Introduksjon til aritmetikk av Nicomachus, [84] [14]: Ch 9.2 og den euklidiske algoritmen, som først ble beskrevet i Euclids elementer (ca. 300 f.Kr.). [14]: Ch 9.1

Diskrete og skillebare symboler Rediger

Tally-merker: For å holde styr på flokkene sine, sekkene sine med korn og pengene sine, brukte de eldgamle telleringen: å samle steiner eller merker som var riper på pinner eller lage diskrete symboler i leire. Gjennom den babyloniske og egyptiske bruken av merker og symboler utviklet de romerske tallene og kulerammen seg (Dilson, s. 16–41). Tallymerker fremtrer tydelig i aritmetiske tallsystemaritmetikker som brukes i Turing-maskin og Post-Turing-maskinberegninger.

Manipulering av symboler som "plassholdere" for tall: algebra Edit

Muhammad ibn Mūsā al-Khwārizmī, en persisk matematiker, skrev Al-jabr på 800-tallet. Begrepene "algorisme" og "algoritme" er avledet av navnet al-Khwārizmī, mens begrepet "algebra" er avledet fra boka Al-jabr. I Europa ble ordet "algoritme" opprinnelig brukt for å referere til sett med regler og teknikker som ble brukt av Al-Khwarizmi for å løse algebraiske ligninger, før de senere ble generalisert til å referere til ethvert sett med regler eller teknikker. [85] Dette endte til slutt med Leibnizs forestilling om calculus ratiocinator (ca 1680):

Et godt halvannet århundre foran sin tid foreslo Leibniz en algebra av logikk, en algebra som ville spesifisere reglene for å manipulere logiske begreper på den måten som vanlig algebra spesifiserer reglene for å manipulere tall. [86]

Kryptografiske algoritmer Rediger

Den første kryptografiske algoritmen for å dechiffrere kryptert kode ble utviklet av Al-Kindi, en arabisk matematiker fra 800-tallet, i Et manuskript om dekryptering av kryptografiske meldinger. Han ga den første beskrivelsen av kryptanalyse ved frekvensanalyse, den tidligste kodebrytingsalgoritmen. [15]

Mekaniske konstruksjoner med diskrete tilstander Rediger

Klokken: Bolter krediterer oppfinnelsen av den vektdrevne klokken som "Nøkkeloppfinnelsen [av Europa i middelalderen]", spesielt randen av rømningen [87] som gir oss en mekanisk klokke. "Den nøyaktige automatiske maskinen" [88] førte umiddelbart til "mekanisk automat" som begynte på 1200-tallet og til slutt til "beregningsmaskiner" - forskjellen mellom motorer og analysemotorer fra Charles Babbage og grevinne Ada Lovelace, midt på 1800-tallet. [89] Lovelace er kreditert den første opprettelsen av en algoritme beregnet for prosessering på en datamaskin - Babbages analytiske motor, den første enheten betraktet som en ekte Turing-komplett datamaskin i stedet for bare en kalkulator - og kalles noen ganger "historiens første programmerer" som et resultat, selv om en full implementering av Babbages andre enhet ikke ville bli realisert før tiår etter hennes levetid.

Logiske maskiner 1870 - Stanley Jevons '"logiske kuleramme" og "logiske maskin": Det tekniske problemet var å redusere boolske ligninger når de ble presentert i en form som ligner på det som nå er kjent som Karnaugh-kart. Jevons (1880) beskriver først en enkel "kuleramme" av "sklir av tre møblert med pinner, konstruert slik at en hvilken som helst del eller klasse av [logiske] kombinasjoner kan plukkes ut mekanisk. Mer nylig har jeg imidlertid redusert systemet til en helt mekanisk form, og har dermed legemliggjort hele den indirekte prosessen med slutning i det som kan kalles a Logisk maskin"Hans maskin var utstyrt med" visse bevegelige trestenger "og" ved foten er 21 tangenter som for et piano [etc]. ". Med denne maskinen kunne han analysere en" syllogisme eller ethvert annet enkelt logisk argument ". [90]

Denne maskinen viste han i 1870 før Fellows of the Royal Society. [91] En annen logiker John Venn imidlertid i sin 1881 Symbolsk logikk, vendte et gult øye mot denne innsatsen: "Jeg har ikke noe høyt estimat på interessen eller viktigheten av det som noen ganger kalles logiske maskiner. Det virker ikke for meg at noen forutsetninger som for tiden er kjent eller sannsynlig vil bli oppdaget virkelig fortjener navnet av logiske maskiner "se mer ved algoritmekarakteriseringer. Men for ikke å bli overgått presenterte han også "en plan som er noe analog, oppfatter jeg, til prof. Jevons kuleramme . [Og] [a] gevinst, tilsvarende prof. Jevons logiske maskin, kan følgende konstruksjon beskrives. Jeg foretrekker å kalle det bare en maskin med logisk diagram. men jeg antar at det kan gjøre veldig fullstendig alt som rasjonelt kan forventes av en hvilken som helst logisk maskin. "[92]

Jacquard vevstol, Hollerith stansekort, telegrafi og telefoni - det elektromekaniske stafett: Bell og Newell (1971) indikerer at Jacquard-vevstolen (1801), forløperen til Hollerith-kort (stikkort, 1887), og "telefonvekslingsteknologier" var røttene til et tre som førte til utviklingen av de første datamaskinene. [93] Ved midten av 1800-tallet var telegrafen, forløperen til telefonen, i bruk over hele verden, og dens diskrete og skillebare koding av bokstaver som "prikker og bindestreker" var en vanlig lyd. På slutten av 1800-tallet var tickerbåndet (ca 1870-tallet) i bruk, i likhet med bruken av Hollerith-kort i den amerikanske folketellingen i 1890. Så kom teleskriveren (ca. 1910) med stanset papirbruk av Baudot-kode på bånd.

Telefonskiftende nettverk av elektromekaniske reléer (oppfunnet 1835) sto bak arbeidet til George Stibitz (1937), oppfinneren av den digitale tilleggsenheten. Da han jobbet i Bell Laboratories, observerte han den "belastende bruken av mekaniske kalkulatorer med tannhjul." Han dro hjem en kveld i 1937 og hadde til hensikt å teste ideen sin. Da tinkingen var over, hadde Stibitz konstruert en binær tilleggsenhet ". [94]

Davis (2000) observerer den spesielle betydningen av det elektromekaniske reléet (med sine to "binære tilstander") åpen og lukket):

Det var først med utviklingen, begynnelsen på 1930-tallet, av elektromekaniske kalkulatorer som brukte elektriske releer, at maskiner ble bygget med det omfanget Babbage hadde sett for seg. "[95]

Matematikk i løpet av 1800-tallet fram til midten av 1900-tallet Edit

Symboler og regler: I rask rekkefølge reduserte matematikken til George Boole (1847, 1854), Gottlob Frege (1879) og Giuseppe Peano (1888–1889) aritmetikk til en sekvens av symboler som ble manipulert av regler. Peanos Prinsippene for regning, presentert av en ny metode (1888) var "det første forsøket på en aksiomatisering av matematikk på et symbolsk språk". [96]

Men Heijenoort gir Frege (1879) denne kudos: Freges er "kanskje det viktigste enkeltverket som noensinne er skrevet i logikk ... der vi ser et" "formelspråk", det er en lingua characterica, et språk skrevet med spesielle symboler, "for ren tanke", det vil si uten retoriske utsmykninger. konstruert av spesifikke symboler som er manipulert i henhold til bestemte regler ". [97] Frege ble ytterligere forenklet og forsterket av Alfred North Whitehead og Bertrand Russell i deres Principia Mathematica (1910–1913).

Paradoksene: Samtidig dukket det opp en rekke urovekkende paradokser i litteraturen, spesielt Burali-Forti-paradokset (1897), Russell-paradokset (1902–03) og Richard Paradox. [98] De resulterende betraktningene førte til Kurt Gödels avis (1931) - han siterer spesifikt løgnerens paradoks - som fullstendig reduserer regler for rekursjon til tall.

Effektiv beregning: I et forsøk på å løse Entscheidungsproblemet som ble definert nøyaktig av Hilbert i 1928, begynte matematikere først å definere hva som var ment med en "effektiv metode" eller "effektiv beregning" eller "effektiv beregning" (dvs. en beregning som ville lykkes). I rask rekkefølge dukket følgende opp: Alonzo Church, Stephen Kleene og JB Rossers λ-calculus [99] en finpusset definisjon av "general recursion" fra arbeidet til Gödel som handlet etter forslag fra Jacques Herbrand (jf. Gödel's Princeton-foredrag fra 1934) og påfølgende forenklinger av Kleene.[100] Kirkens bevis [101] på at Entscheidungsproblemet var uløselig, Emil Posts definisjon av effektiv beregning som arbeider uten tanker etter en liste over instruksjoner for å bevege seg til venstre eller høyre gjennom en sekvens av rom og mens det enten er merket eller slettet et papir eller observert papiret og ta en ja-nei beslutning om neste instruksjon. [102] Alan Turing's bevis på at Entscheidungsproblemet var uløselig ved bruk av hans "a- [automat-] maskin" [103] - i virkeligheten nesten identisk med Posts "formulering", J. Barkley Rossers definisjon av "effektiv metode" i uttrykk for "en maskin". [104] Kleenes forslag til en forløper til "Church thesis" som han kalte "Thesis I", [105] og noen år senere omdøpte Kleene sin avhandling til "Church's Thesis" [106] og foreslo "Turing's Thesis". [107]

Emil Post (1936) og Alan Turing (1936–37, 1939) Rediger

Emil Post (1936) beskrev handlingene til en "datamaskin" (menneske) slik:

". to begreper er involvert: a symbol plass der arbeidet som fører fra problem til svar skal utføres, og et fast, uforanderlig sett med retninger.

Hans symbolrom ville være

"en toveis uendelig rekkefølge av mellomrom eller bokser. Problemløseren eller arbeideren er å bevege seg og jobbe i dette symbolrommet, være i stand til å være i, og operere i bare en boks om gangen. en boks er å innrømme men to mulige forhold, dvs. å være tom eller umerket, og ha et enkelt merke i seg, si et loddrett strek. "En boks skal trekkes frem og kalles utgangspunktet. . et spesifikt problem skal gis i symbolsk form ved at et endelig antall bokser [dvs. INNGANG] markeres med et strek. Likeledes skal svaret [dvs. UTGANG] gis i symbolsk form ved en slik konfigurasjon av merkede ruter. "Et sett med retninger som gjelder for et generelt problem, setter opp en deterministisk prosess når den brukes på hvert spesifikt problem. Denne prosessen avsluttes bare når det gjelder retning av type (C) [dvs. STOPP"). [108] Se mer på Post – Turing-maskinen

Alan Turings arbeid [109] gikk foran Stibitz (1937). Det er ukjent om Stibitz visste om arbeidet til Turing. Turings biograf mente at Turing bruk av en skrivemaskinlignende modell avledet av en ungdommelig interesse: "Alan hadde drømt om å oppfinne skrivemaskiner som en gutt. Fru Turing hadde en skrivemaskin, og han kunne godt ha begynt med å spørre seg selv hva det var meningen med å kalle en skrivemaskin 'mekanisk' ". [110] Gitt utbredelsen av morsekode og telegrafi, ticker-båndmaskiner og teletypemaskiner, har vi [ WHO? ] kan gjette at alle var påvirkninger.

Turing - hans beregningsmodell kalles nå en Turing-maskin - begynner, i likhet med Post, med en analyse av en menneskelig datamaskin som han gir ned til et enkelt sett med grunnleggende bevegelser og "sinnstilstander". Men han fortsetter et skritt videre og lager en maskin som en modell for beregning av tall. [111]

"Databehandling gjøres normalt ved å skrive visse symboler på papir. Vi kan anta at dette papiret er delt inn i firkanter som et barns aritmetiske bok. Jeg antar da at beregningen utføres på endimensjonalt papir, dvs. på et bånd delt i firkanter. Jeg vil også anta at antall symboler som kan skrives ut er begrenset. "Datamaskinens oppførsel til enhver tid bestemmes av symbolene han observerer, og hans" sinnstilstand "i det øyeblikket. Vi kan anta at det er en bundet B til antall symboler eller firkanter som datamaskinen kan observere i et øyeblikk. Hvis han ønsker å observere mer, må han bruke påfølgende observasjoner. Vi vil også anta at antallet sinnstilstander som må tas i betraktning er endelig. "La oss forestille oss at operasjonene som utføres av datamaskinen deles opp i" enkle operasjoner "som er så grunnleggende at det ikke er lett å forestille seg at de er delt videre." [112]

Turings reduksjon gir følgende:

"De enkle operasjonene må derfor omfatte:" (a) Endringer av symbolet på en av de observerte rutene "(b) Endringer av en av rutene som er observert til en annen firkant innenfor L-firkanter på en av de tidligere observerte rutene.

"Det kan være at noen av disse endringene nødvendigvis påberoper seg en forandring i sinnstilstanden. Den mest generelle enkeltoperasjonen må derfor anses å være en av følgende:

"(A) En mulig endring (a) av symbol sammen med en mulig forandring av sinnstilstand." (B) En mulig endring (b) av observerte firkanter, sammen med en mulig forandring av sinnstilstand "" Vi kan nå konstruer en maskin for å utføre arbeidet med denne datamaskinen. "[112]

Noen år senere utvidet Turing sin analyse (avhandling, definisjon) med dette kraftige uttrykket for det:

"En funksjon sies å være" effektivt kalkulerbar "hvis dens verdier kan bli funnet ved en ren mekanisk prosess. Selv om det er ganske enkelt å få en intuitiv forståelse av denne ideen, er det likevel ønskelig å ha en mer bestemt, matematisk uttrykkelig definisjon. . [han diskuterer historien til definisjonen ganske mye som presentert ovenfor med hensyn til Gödel, Herbrand, Kleene, Church, Turing og Post]. Vi kan ta denne uttalelsen bokstavelig, forståelse av en rent mekanisk prosess som kan utføres av en maskin. Det er mulig å gi en matematisk beskrivelse, i en viss normal form, av strukturene til disse maskinene. Utviklingen av disse ideene fører til forfatterens definisjon av en beregningsbar funksjon, og til en identifisering av beregningsevne † med effektiv kalkulerbarhet. "† Vi skal bruke uttrykket" beregningsbar funksjon "for å bety en funksjon som kan beregnes av en maskin, og vi lar" effektivt kalkulerbar "referere til den intuitive ideen uten del kularidentifikasjon med en av disse definisjonene ". [113]

J.B. Rosser (1939) og S.C. Kleene (1943) Rediger

J. Barkley Rosser definerte en 'effektiv [matematisk] metode' på følgende måte (kursivering lagt til):

"" Effektiv metode "brukes her i den ganske spesielle betydningen av en metode som hvert trinn er nøyaktig bestemt og som med sikkerhet vil gi svaret i et endelig antall trinn. Med denne spesielle betydningen har tre forskjellige presise definisjoner blitt gitt til dags dato. [fotnote nr. 5 se diskusjonen rett nedenfor]. Den enkleste av disse å oppgi (på grunn av Post og Turing) sier i hovedsak at en effektiv metode for å løse visse sett med problemer eksisterer hvis man kan bygge en maskin som deretter løser ethvert problem med settet uten menneskelig inngripen utover å sette inn spørsmålet og (senere) lese svaret. Alle tre definisjonene er likeverdige, så det spiller ingen rolle hvilken som brukes. Dessuten er det faktum at alle tre er ekvivalente et veldig sterkt argument for at noen er riktige. "(Rosser 1939: 225–226)

Rossers fotnote 5 refererer til arbeidet med (1) Church og Kleene og deres definisjon av λ-definierbarhet, spesielt Kirkens bruk av det i sin Et uløselig problem med elementær tallteori (1936) (2) Herbrand og Gödel og deres bruk av rekursjon, spesielt Gödel bruk i hans berømte papir På formelt ubesluttsomme forslag fra Principia Mathematica og relaterte systemer I (1931) og (3) Post (1936) og Turing (1936–37) i deres mekanismemodeller for beregning.

Stephen C. Kleene definerte som sin nå berømte "Thesis I" kjent som Church-Turing-avhandlingen. Men han gjorde dette i følgende sammenheng (fet skrift i original):

"12. Algoritmiske teorier. Når vi setter opp en komplett algoritmisk teori, er det vi beskriver en prosedyre, som kan utføres for hvert verdisett av de uavhengige variablene, hvilken prosedyre nødvendigvis avsluttes og på en slik måte at vi fra resultatet kan lese et bestemt svar, "ja" eller "nei", til spørsmålet "er predikatverdien sant?" "(Kleene 1943: 273)

Historie etter 1950 Rediger

En rekke anstrengelser har blitt rettet mot ytterligere foredling av definisjonen av "algoritme", og aktivitet pågår på grunn av problemstillinger rundt, særlig grunnlaget for matematikk (spesielt Church-Turing-avhandlingen) og sinnsfilosofi (spesielt argumenter) om kunstig intelligens). For mer, se karakteriseringer av algoritmer.


digitalWrite (ledPin1 = HIGH) skal være digitalWrite (ledPin1, HIGH)

PS if ((x = LOW) & amp & amp (y = LOW) & amp & amp (z = LOW)) bør være hvis ((x == LOW) & amp & amp (y == LOW) & amp & amp (z == LOW)). = er til oppgave, == er til sammenligning.

Bortsett fra problemet med å trenge == i stedet for = du er aldri lesning de pinnene. Faktisk sammenligner du nålen tall (som aldri vil endre seg), ikke dataene på disse pinnene.

Dette er også feil, jeg er overrasket over at den er samlet:

når jeg bruker digital skriving får jeg en feilkode som sier at det er for få argumenter. . Jeg vet bare ikke hvorfor simuleringsprogrammet fremdeles ikke tenner LED

Å jeg skjønner, det gjorde det ikke kompilere. Ikke rart at LED-lampene ikke tennes.

Her er et lite tips til deg (det har ingenting å gjøre med problemet ditt, det er bare en god programmeringsmetode). Dette vil redusere størrelsen på programmet ditt massivt.

Du har tre boolske tilstandsvariabler, og du sammenligner tilstanden til alle kombinasjoner - det er 8 kombinasjoner. Hvis du tar hver boolske verdi som 1 bit av en verdi mellom 0 og 7 - det vil si verdier (som binær) 000, 001, 010, 011, 100, 101, 110 og 111 - så kan du bruke mye enklere metoder for å kontrollere lysdiodene dine.

For eksempel vil denne (uprøvde) koden gjøre tre digitale avlesninger til et enkelt tall mellom 0 og 7:

x er den minst signifikante biten, og z er den mest betydningsfulle. Så verdien vil nå være en verdi mellom 0 og 7 som representerer tilstanden til de tre pinnene.

Nå kan du bruke den verdivariabelen til å bestemme hvilken pin du vil slå på. Her er et annet triks: Lagre LED-pinner som en matrise. Det betyr at i stedet for å ha ledPin1, ledPin2 osv., Har du bare en liste over pin-tall kjent som ledPin [x]:

Nå kan du bruke en for-løkke til å gjenta om den listen og slå på LED-lampen du vil ha:

Faktisk kan det komprimeres ytterligere, siden HIGH og LOW i utgangspunktet er sannhetsverdier (HIGH er 1, eller true, og LOW er 0, eller false):

Så hele programmet ditt kan se slik ut:

Sparer enormt mye skriving og ender opp med å bruke betydelig mindre Flash-minne.


Til slutt, for pakkeskribenter (egentlig ikke dokumentforfattere): expl3 som en del av LaTeX3 gir booleanere som kan brukes på alle slags interessante måter. For grunnleggende bruk ser de slik ut:

Du kan bruke boolsk logikk som følger:

Alt er utvidbart og lat evaluering brukes til å unngå å utføre tester som ikke trenger å bli sjekket.

Du kan også kombinere boolske variabler ovenfor med betingede funksjoner som cs_if_eq_p: NN (‘er to kontrollsekvenser like?’) Som kan testes på nøyaktig samme måte:

Overlappingen mellom etoolbox og expl3 her er ganske uttalt. Jeg tenker på forskjellen mellom de to som skillet mellom dokumentforfattere (for etoolbox) og pakkeforfattere (for expl3). Men det er bare et spørsmål om smak når det kommer til det.


Se videoen: QGIS 2 - step by Step No. 9. Field calculator (Oktober 2021).