Article View: be.comp.programming
Article #15016Re: Finding 2 biggest numbers in a row
From: Andy Georges
Date: Fri, 17 Nov 2000 00:00
Date: Fri, 17 Nov 2000 00:00
72 lines
2757 bytes
2757 bytes
Hello,
> > Andy Georges heeft gelijk, zoeken in een niet-gesorteerde rij is altijd
> > O(n)... Waarom wil je per se recursief werken?
>
> Because my algorithm would require less comparisons...
daar ga ik niet mee akkoord.
eerst en vooral is het zoeken van de twee grootste eigenlijk hetzelfde
als het zoeken van de grootste, met in elke stap nog een extra
vergelijking om te zien of het nieuwe getal groter is dan het tweede
grootste in het geval het niet het nieuwe grootste is:
if(rij[i] > grootste) {
groot = grootste;
grooste = rij[i];
}
else if(rij[i] > groot)
groot = rij[i];
we kunnen dus zeggen dat we eigenlijk het grootste moeten bepalen.
een iteratief lineair algoritme gebruikt in wezen n-1 vergelijkingen:
grootste = rij[0];
for(int i = 1; i < rij.length; ++i)
if(rij[i] > grootste)
grootste = rij[i];
een recursief algoritme dat de rij in twee splitst (laten we voor de
eenvoud veronderstellen dat de lengte van de rij een macht van 2 is)
heeft de volgende kost:
C(N) = C(2^k) = 2 * C(2^{k-1}) + 1
we moeten immers de grootste bepalen uit de twee deelrijen en dan nog
eens vergelijken (merk op dat als we de twee grootste moeten hebben dan
die '1' gewoon een '2' wordt)
en:
C(1) = 0
C(2) = 1
dus:
C(2^k) = 2^m * C(2^{k-m}) + 2^m - 1 (uit de meetkundige rij met factor
2)
dus voor m == k hebben we:
C(2^k) = 2^k * 0 + 2^k - 1 = 2^k - 1 = N - 1
dus in wezen evenveel vergelijkingen als het lineair iteratief
algoritme, maar in de recursieve versie hebben we nog de functieoproepen
waarmee rekening moet worden gehouden.
ik denk dat deze redenering sluitend is, maar opmerkingen zijn
natuurlijk welkom. in elk geval is de recursie ook O(N) wat toch het
belangrijkste is.
mvg,
andy
--
==========================================================================
Dept. of Applied Mathematics and Computer Science, University of Ghent
Krijgslaan 281 - S9, B - 9000 Ghent, Belgium
Phone: +32-9-264.47.66, Fax: +32-9-264.49.95
E-mail: andy.georges@rug.ac.be
==========================================================================
Technical Details
Message-ID:
<3A15091C.9676CDB0@nospam.rug.ac.be>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<3A11B99A.2BB2E1E7@skynet.be> <8utlpa$3r5$1@news0.skynet.be> <3A12DF0E.7786684B@skynet.be>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: fcea4,470c011dba4db9c3 X-Google-Attributes: gidfcea4,public From: Andy Georges <andy.georges@nospam.rug.ac.be> Subject: Re: Finding 2 biggest numbers in a row Date: 2000/11/17 Message-ID: <3A15091C.9676CDB0@nospam.rug.ac.be> X-Deja-AN: 694687079 Content-Transfer-Encoding: 7bit References: <3A11B99A.2BB2E1E7@skynet.be> <8utlpa$3r5$1@news0.skynet.be> <3A12DF0E.7786684B@skynet.be> X-Accept-Language: en Content-Type: text/plain; charset=us-ascii Organization: University of Ghent, Belgium Mime-Version: 1.0 Newsgroups: be.comp.programming