Article View: be.comp.programming
Article #14627Re: Finding 2 biggest numbers in a row
From: Koen Deforche
Date: Wed, 17 Jan 2001 22:12
Date: Wed, 17 Jan 2001 22:12
101 lines
4668 bytes
4668 bytes
Andy Georges wrote:
> >> 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:
>
> hiermee ga je toch akkoord, ja?
Nee dus. Dit is 'niet eigenlijk hetzelfde'. Het een is het de
probleemstelling, het andere is een algoritme om dat probleem op te
lossen.
> > 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?
>
> ik :-)
Hoeveel vergelijkingen heeft uw algoritme worst-case dan nodig?
1 + 2*(N-2) tel ik hier gauw (correct me if I'm wrong).
> maar het is tevens zo dat een functie-oproep nog duurder is dan een
> vergelijking. in een imperatieve programmeertaal ga je dit niet zo doen,
> je gaat iteratief te werk.
Jamaar. Ofwel veronderstel je dat een vergelijking peperduur is, oftewel
niet. En bij sorteeralgoritmes geldt als complexiteitsnorm het aantal
vergelijkingen (veronderstel dat je oneindige precisie getallen moet
vergelijken, of strings, of een willekeurige andere orde-relatie ...)
> > 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;
> > }
>
> dit was toch wat ik zei?
Nee. Jij zei:
> 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:
Ik daarentegen zeg:
Het zoeken van de twee grootste kan je doen door de rij in twee te
splitsen,
van die twee deelrijen de twee grootste paren zoeken (a1 b1) en (a2 b2)
en dan is er een combinatie stap met 2 vergelijkingen om de twee
grootste
(a b) van die twee paar twee grootste; met a1 >= b1, a2 >= b2 en a >= b.
Dit kost (voor N een macht van 2) 3/2 * N - 2 vergelijkingen.
Merk op dat ik trouwens minder vergelijkingen doe, dus hoe zouden
we hetzelfde kunnen zeggen?
> maar 3n/2 is nog steeds O(n) he. en je moet hier ook rekening houden met
> de functie-oproepen.
Ja, het is nog O(N). Ik heb nooit anders beweerd.
Wat betreft functie-oproepen, nogmaals:
> > Btw. het is niet omdat een algoritme gebaseerd is op een recursie-
> > betrekking dat je het moet implementeren met behulp van recursieve
> > functiecalls.
Dus, geen functie calls, maar toch een recursiebetrekking.
> > 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.
>
> hiet ging het over een imperative taal (Java iirc) en de oorspronkelijke
> oplossing had geen staartrecursie iirc.
Het was dan ook bijvoorbeeld (om aan te tonen dat het zelfs door een
compiler automatisch wordt gedaan; laat staan wat een programmeur zelf
kan doen in java).
koen.
Technical Details
Message-ID:
<3A661A24.F375906C@chello.be>Path:
arc1-ca.pugleaf.net!supernews.google.com!sn-xit-02!supernews.com!isdnet!newsfeed.icl.net!zapata.tvd.be!news.tvd.be!news.chello.be!not-for-mailReferences:
<3A11B99A.2BB2E1E7@skynet.be> <8utlpa$3r5$1@news0.skynet.be> <3A12DF0E.7786684B@skynet.be> <3A15091C.9676CDB0@nospam.rug.ac.be> <3A646ACC.8AAD738D@easics.be> <943m57$gk0$1@inf6serv.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-17 16:08:44 PST Path: arc1-ca.pugleaf.net!supernews.google.com!sn-xit-02!supernews.com!isdnet!newsfeed.icl.net!zapata.tvd.be!news.tvd.be!news.chello.be!not-for-mail Message-ID: <3A661A24.F375906C@chello.be> From: Koen Deforche <koen.deforche@chello.be> X-Mailer: Mozilla 4.74 [en] (X11; U; Linux 2.2.16 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> <3A646ACC.8AAD738D@easics.be> <943m57$gk0$1@inf6serv.rug.ac.be> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Lines: 101 Date: Wed, 17 Jan 2001 22:12:48 GMT NNTP-Posting-Host: 195.162.217.93 X-Complaints-To: abuse@chello.be X-Trace: news.chello.be 979769568 195.162.217.93 (Wed, 17 Jan 2001 23:12:48 MET) NNTP-Posting-Date: Wed, 17 Jan 2001 23:12:48 MET Organization: Chello Usenet Service