Denkende Machines -- Computers, rekenen, redeneren - CWI
Denkende Machines -- Computers, rekenen, redeneren - CWI
Denkende Machines -- Computers, rekenen, redeneren - CWI
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 />
}