Coursera Learner working on a presentation with Coursera logo and
Coursera Learner working on a presentation with Coursera logo and

In de programmering, het algoritme is veel all-around gekarakteriseerd richtingen in ordening om het probleem aan te pakken.

Kenmerken van een fatsoenlijk algoritme

Informatie en opbrengst moeten ondubbelzinnig worden gekarakteriseerd.

Elke vooruitgang in de berekening zou duidelijk en ondubbelzinnig moeten zijn.

Het algoritme zou de beste moeten zijn onder een breed scala aan benaderingen om een probleem op te lossen.

Een algoritme zou geen PC-code moeten hebben. In plaats daarvan zou de berekening zo moeten worden geschreven dat deze in vergelijkbare programmeerdialecten wordt gebruikt.

Voorbeelden van algoritmen in de programmering

Schrijf een algoritme om twee getallen toe te voegen die door de gebruiker zijn ingevoerd.

Stap 1: Starten

Stap 2: Geef de variabelen num1, num2 en som op.

Stap 3: Lees de waarden num1 en num2 af.

Stap 4: Tel nummer 1 en nummer 2 op en wijs het resultaat toe aan de som.

sum←num1+num2

Stap 5: Weergave van de som

Stap 6: Stop

Schrijf een algoritme om de grootste van de drie verschillende getallen te vinden die door de gebruiker zijn ingevoerd.

Stap 1: Starten

Stap 2: Verklaar de variabelen a,b en c.

Stap 3: Lees de variabelen a,b en c.

Stap 4: Indien a>b

Indien a>c

Toon a is het grootste getal.

Anders

Weergave c is het grootste getal.

Anders

Indien b>c

Weergave b is het grootste getal.

Anders

Weergave c is het grootste getal.

Stap 5: Stop

Schrijf een algoritme om alle wortels van een kwadratische vergelijking ax2+bx+c=0 te vinden.

Stap 1: Begin

Stap 2: Geef de variabelen a, b, c, D, x1, x2, rp en ip op;

Stap 3: Bereken discriminant

D←b2-4ac

Stap 4: Als D≥0

r1←(-b+√D)/2a

r2←(-b-√D)/2a

Toon r1 en r2 als wortels.

Anders

Bereken het reële deel en het denkbeeldige deel

rp←b/2a

ip←√(-D)/2a

Toon rp+j(ip) en rp-j(ip) als wortels

Schrijf een algoritme om de factorial van een door de gebruiker ingevoerd getal te vinden.

Stap 1: Starten

Stap 2: Verklaar de variabelen n,factorial en i.

Stap 3: Initialiseren van variabelen

factorial←1

i←1

Stap 4: Leeswaarde van n

Stap 5: Herhaal de stappen tot i=n

5.1: factorial←factorial*i

5.2: i←i+1

Stap 6: Weergavefactor

Stap 7: Stop

Schrijf een algoritme om te controleren of een door de gebruiker ingevoerd nummer al dan niet prime is.

Stap 1: Starten

Stap 2: Verklaar de variabelen n,i,flag.

Stap 3: Initialiseren van variabelen

flag←1

i←2

Stap 4: Lees n van de gebruiker.

Stap 5: Herhaal de stappen tot i<(n/2)

5.1 Als de rest van n÷i gelijk is aan 0

flag←0

Ga naar stap 6

5.2 i←i+1

Stap 6: Indien vlag=0

Weergave n is niet prime

anders

Weergave n is prime

Stap 7: Stop

Schrijf een algoritme om de Fibonacci-reeks te vinden tot term≤1000.

Stap 1: Begin

Stap 2: Verklaar de variabelen eerste_term,tweede_term en temp.

Stap 3: Initialiseren van variabelen eersteterm←0 tweedeterm←1

Stap 4: Weergave eerste_termijn en tweede_termijn

Stap 5: Herhaal de stappen tot second_term≤1000

5.1: temp←second_termijn

5.2: tweede_term←second_term+eerste termijn

5.3: eerste_term←temp

5.4: Weergave tweede_termijn

Stap 6: Stop

Waarom elke programmeur zou moeten leren om algoritmes te optimaliseren

Wat zijn Algoritmen?

Terloops, een berekening is slechts een mededeling van stappen om een probleem op te lossen. Ze zijn in principe een antwoord.

Bijvoorbeeld, een berekening om de kwestie van de factorialen af te handelen kan er zo uitzien:

Probleem: Zoek de factorial van n

Feit initialiseren = 1

Voor elke waarde v in het bereik van 1 tot n:

Vermenigvuldig het feit met v

feit bevat de factorial van n

Hier is het algoritme in het Engels geschreven. Als het in een programmeertaal was geschreven, zouden we het in plaats daarvan code noemen. Hier is een code voor het vinden van een factorial van een getal in C++.

int factorial(int n) {

int feit = 1;

voor (int v = 1; v <= n; v++) {

feit = feit * n;

}

terugkeer feit;

}

Programmering gaat over informatiestructuren en berekeningen. Informatiestructuren worden gebruikt om informatie vast te houden, terwijl berekeningen worden gebruikt om het probleem aan te pakken met behulp van die informatie.

Informatiestructuren en berekeningen (DSA) geven antwoorden op standaardvraagstukken in detail en geven u kennis van het feit dat het zo productief is om ze allemaal te gebruiken. Het toont u ook de studie van het beoordelen van de productiviteit van een berekening. Dit stelt u in staat om de beste van de verschillende beslissingen te kiezen.

Gebruik van datastructuren en -algoritmen maken uw code schaalbaar

Tijd is waardevol.

Stel, Alice en Bob proberen een basisprobleem op te lossen, namelijk het vinden van het totaal van de initiële 1011 normale getallen. Terwijl Bob de berekening opstelde, actualiseerde Alice deze om aan te tonen dat deze net zo fundamenteel is als het veroordelen van Donald Trump.

Algoritme (door Bob)

Initialiseer som = 0

voor elk natuurlijk getal n in het bereik van 1 tot en met 1011 (inclusief):

n bij elkaar optellen

som is uw antwoord

Code (door Alice)

int findSum() {

int som = 0;

voor (int v = 1; <= 100000000000; v++) {

som += v;

}

retourbedrag;

}

Alice en Bob voelen zich euforisch dat ze in een paar seconden iets van zichzelf zouden kunnen verzinnen. Wat dacht je ervan om hun werkruimte binnen te sluipen en ons af te stemmen op hun discussie.

Alice: Laten we deze code uitvoeren en het geheel ontdekken.

Sway: Ik heb deze code enkele ogenblikken geleden uitgevoerd, maar het geeft nog steeds niet de opbrengst aan. Wat is er aan de hand?

Oh nee, er is iets slecht uitgepakt! Een PC is de meest deterministische machine. Terugkeren en het opnieuw proberen te draaien zal niet helpen. Dus we moeten ontleden wat er met deze eenvoudige code gebeurt.

Twee van de belangrijkste troeven voor een PC-programma zijn tijd en geheugen.

De tijd die de PC nodig heeft om een code uit te voeren is:

Tijd om code uit te voeren = aantal instructies * tijd om elke instructie uit te voeren

De hoeveelheid aanwijzingen is afhankelijk van de code die u gebruikt, en de tijd die nodig is om elke code uit te voeren is afhankelijk van uw machine en compiler.

Voor deze situatie zal het volledige aantal uitgevoerde richtlijnen (stel dat x) x = 1 + (1011 + 1) + (1011) + 1 zijn, wat x = 2 * 1011 + 3 is.

Geef ons een kans om te accepteren dat een PC y = 108 richtlijnen kan uitvoeren in een enkele seconde (het kan schommelen blootgesteld aan machinale opstelling). De tijd die nodig is om bovenstaande code uit te voeren is

Tijd die nodig is om de code uit te voeren = x/y (meer dan 16 minuten)

Is het denkbaar om de berekening te verbeteren met als doel dat Alice en Bob niet elke keer 16 minuten vast hoeven te zitten als ze deze code uitvoeren?

Ik ben er zeker van dat je eerder hebt gespeculeerd over de juiste techniek. Het geheel van de eerste N-kenmerkgetallen wordt gegeven door het recept:

Geheel = N * (N + 1)/2

Het omzetten in code zal er zoiets als dit uitzien:

int sum(int N) {

terugkeer N * (N + 1)/2;

}

Deze code voert slechts in één keer de opdracht uit, en voltooit de opdracht ongeacht wat de waarde ervan is. Geef het een kans om meer waard te zijn dan het alom bekende aantal deeltjes. Het zal de uitkomst in een oogwenk ontdekken.

In dit geval is het totaal aantal uitgevoerde opdrachten (laten we zeggen x) x = 1 + (1011 + 1) + (1011) + 1, wat x = 2 * 1011 + 3 is.

Laten we aannemen dat een computer y = 108 kan uitvoeren.

Geef ons een kans om te accepteren dat een PC y = 108 richtlijnen kan uitvoeren in een enkele seconde (het kan schommelen blootgesteld aan de machine setup). De tijd die nodig is om bovenstaande code uit te voeren is:

Tijd die nodig is om de code uit te voeren = x/y (meer dan 16 minuten)

Is het denkbaar om de berekening te verbeteren met als doel dat Alice en Bob niet elke keer 16 minuten vast hoeven te zitten als ze deze code uitvoeren?

Ik ben er zeker van dat je eerder hebt gespeculeerd over de juiste techniek. Het geheel van de eerste N normale getallen wordt gegeven door de vergelijking:

Hele = N * (N + 1)/2

Het omzetten in code zal er zoiets als dit uitzien:

int sum(int N) {

terugkeer N * (N + 1)/2;

}

Deze code voert slechts in één keer de opdracht uit, en voltooit de opdracht ongeacht wat de waarde ervan is. Geef het een kans om prominenter te zijn dan het alom bekende aantal moleculen van de mensheid. Het zal de uitkomst in een kwestie van momenten ontdekken.

De tijd die nodig is om het probleem aan te pakken voor deze situatie is 1/j (dat is 10 nanoseconden). Toevallig duurt het combineren van een kernbom 40-50 ns, wat betekent dat je programma effectief zal eindigen, ongeacht of iemand een kernbom op je PC gooit en tegelijkertijd je code uitvoert).

Opmerking: Computers nemen een paar richtlijnen (niet 1) om augmentatie en deling in te schatten. Ik heb alleen gezegd 1 voor rechtdoorzee.