🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #14723

Re: Finding 2 biggest numbers in a row

#14723
From: Koen Deforche
Date: Tue, 16 Jan 2001 15:37
69 lines
3429 bytes
Andy Georges wrote:
> 
> 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:

En is het zoeken van de drie grootste eigenlijk hetzelfde als het
zoeken van de grootste, met in elke stap twee extra vergelijkingen,
...

En is het zoeken van de N grootste eigenlijk hetzelfde als het
zoeken van de grootste, met in elke stap nog N-1 extra vergelijkingen,
...

Met andere woorden, zijn quicksort en consoorten dus maar fabeltjes?!

Nee dus.

Dit IS al terug een algoritme dat je naar voor schuift. Wie zegt dat
dit het beste algoritme is voor het gegeven probleem, i.e. om de twee
grootste getallen te vinden uit een rij ongesorteerde getallen?

Tenmiste, als we onder 'beste' het algoritme verstaan met het minst
vergelijkingen, dus onder de veronderstelling dat de vergelijking
peperduur is.

Bijvoorbeeld, bedenk als je twee paar getallen hebt (a1 b1) en
(a2 b2) waarvoor geldt dat (aX > bX). Hoe vind je nu de grootste
twee getallen (a b) van die 4 getallen, opnieuw zodat (a > b)?
Dat kan je met twee vergelijkingen doen:

  if (a1 > a2) {
    a = a1;
    if (a2 > b1)
      b = a2;
    else
      b = b1;
  } else {
    a = a2;
    if (a1 > b2)
      b = a1;
    else
      b = b2;
  }

Breid dit uit naar een recursie-betrekking en je vindt dat
het aantal vergelijkingen dus werkelijk minder is dan 2N (ik
vermoed iets van 3N/2).

Btw. het is niet omdat een algoritme gebaseerd is op een recursie-
betrekking dat je het moet implementeren met behulp van recursieve
functiecalls. En dat je ook niet per se hoeft een stack op te
bouwen. Bijvoorbeeld de 'staart-recursie' optimizatie die veelal
geimplementeerd is in LISP-achtige talen laat een compiler zelfs
toe om zelf de stackopbouw eruit te gooien.

Mooi toch, die informatica.

koen.
Technical Details
Message-ID: <3A646ACC.8AAD738D@easics.be>
Path: arc1-ca.pugleaf.net!supernews.google.com!sn-xit-03!sn-xit-04!supernews.com!xfer13.netnews.com!netnews.com!cpk-news-hub1.bbnplanet.com!news.gtei.net!npeer.kpnqwest.net!nreader1.kpnqwest.net.POSTED!not-for-mail
References: <3A11B99A.2BB2E1E7@skynet.be> <8utlpa$3r5$1@news0.skynet.be> <3A12DF0E.7786684B@skynet.be> <3A15091C.9676CDB0@nospam.rug.ac.be>

Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit
X-Google-Thread: fcea4,470c011dba4db9c3
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2001-01-16 07:39:50 PST
Path: arc1-ca.pugleaf.net!supernews.google.com!sn-xit-03!sn-xit-04!supernews.com!xfer13.netnews.com!netnews.com!cpk-news-hub1.bbnplanet.com!news.gtei.net!npeer.kpnqwest.net!nreader1.kpnqwest.net.POSTED!not-for-mail
Message-ID: <3A646ACC.8AAD738D@easics.be>
From: Koen Deforche <koen@easics.be>
Organization: Easics nv, Leuven, Belgium, http://www.easics.com
X-Mailer: Mozilla 4.72 [en] (X11; U; Linux 2.2.16-3 i686)
X-Accept-Language: en
MIME-Version: 1.0
Newsgroups: be.comp.programming
Subject: Re: Finding 2 biggest numbers in a row
References: <3A11B99A.2BB2E1E7@skynet.be> <8utlpa$3r5$1@news0.skynet.be> <3A12DF0E.7786684B@skynet.be> <3A15091C.9676CDB0@nospam.rug.ac.be>
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Lines: 69
Date: Tue, 16 Jan 2001 15:37:50 GMT
NNTP-Posting-Host: 193.74.198.7
X-Complaints-To: abuse@Belgium.EU.net
X-Trace: nreader1.kpnqwest.net 979659470 193.74.198.7 (Tue, 16 Jan 2001 16:37:50 MET)
NNTP-Posting-Date: Tue, 16 Jan 2001 16:37:50 MET