31.07.2013 Views

Denkende Machines -- Computers, rekenen, redeneren - CWI

Denkende Machines -- Computers, rekenen, redeneren - CWI

Denkende Machines -- Computers, rekenen, redeneren - CWI

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

86 HOOFDSTUK 3. MODELLEN VAN BEREKENING<br />

gezelschap herken je aan twee eigenschappen: ieder ander persoon in het gezelschap kent hem<br />

of haar, maar zelf kent hij of zij niemand in het gezelschap (of deze beroemdheid zichzelf wel<br />

kent doet er even niet toe). Hoe gaan we te werk? We beginnen als volgt. Om niet in de war<br />

te raken geven we alle leden van het gezelschap rugnummers, van 1 tot en met N. Vervolgens<br />

beginnen we bij persoon 1 met nagaan of we misschien meteen al om een handtekening kunnen<br />

vragen. Hiertoe gaan we de rij van 2 tot en met N af, en vragen we of 1 de personen kent die<br />

we opnoemen. Als we er op deze manier achterkomen dat 1 een van de N − 1 anderen kent, dan<br />

valt 1 af en beginnen we opnieuw, nu met persoon 2. Als we uiteindelijk iemand tegenkomen die<br />

niemand kent, dan moet dat de beroemdheid zijn. In het ergste geval treffen we het zo dat juist<br />

persoon N de beroemdheid is en in dat geval hebben we (N − 1) 2 tests moeten uitvoeren. Deze<br />

methode is dus polynomiaal, en wel: kwadratisch. De wachttijd hangt af van het kwadraat van<br />

het aantal personen in ons gezelschap (min 1).<br />

Opdracht 3.29 Hiernaast is een<br />

ImPro+-implementatie van een wat<br />

sneller algoritme gegeven voor een gezelschap<br />

van 1000 personen. We gaan ervan<br />

uit dat we al beschikken over een KENTtest<br />

die aangeeft of het eerste argument<br />

(rugnummer van gezelschapslid) het tweede<br />

argument kent. Teken eerst het corresponderende<br />

programmastructuurdiagram,<br />

en leg vervolgens uit wat het programma<br />

precies doet, en waarom het efficiënter is<br />

dan het algoritme hierboven. Leg ook uit<br />

waarom dit programma gegarandeerd de<br />

beroemdheid uitkiest.<br />

N.B. Het blijft een kwadratische methode.<br />

x := 1;<br />

f := 0;<br />

while (x < 1001 & f = 0) {<br />

y :=x ;<br />

while (y < 1001) {<br />

if ( KENT(x,y) ) {<br />

y := 1001; x+;<br />

} else {<br />

if (y = 1000) {<br />

f+;<br />

} else {<br />

y+;<br />

}<br />

}<br />

}<br />

Het algoritme uit de opgave hierboven is wat efficiënter, maar echt veel maakt het niet uit.<br />

Immers, de tijd die met het uitvoeren ervan gemoeid is verhoudt zich nog steeds kwadratisch tot<br />

de omvang van de invoer (N). Er bestaat echter wel een algoritme dat de wachttijd terugbrengt<br />

tot lineair.<br />

Begin met twee personen, 1 en N. Laten we even aannemen dat N = 1000. Vraag aan 1 of<br />

hij/zij 1000 kent. Als dit niet het geval is, dan kan 1000 niet de beroemde persoon zijn. Dan<br />

strepen we 1000 af en gaan nu door met 1 en 999, dat wil zeggen: N − 1. Als 1 wel 1000 kent,<br />

dan kan 1 niet de beroemdheid zijn en gaan we verder met 2 en 1000. Uiteindelijk houden we<br />

maar één persoon over, en dit moet de beroemdheid zijn. Dit kost ons in alle gevallen N tests.<br />

Opdracht 3.30 Schrijf een ImPro+-programma dat dit algoritme implementeert, weer met gebruikmaking<br />

van de functie KENT uit de vorige opdracht.<br />

De tijdscomplexiteit van een rekenprobleem zoals de hier besproken beroemdheidsdetectie is<br />

de rekentijd voor het snelste algoritme dat het probleem oplost. Het beroemdheidsprobleem is<br />

daarmee een lineair probleem.<br />

}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!