Article View: be.comp.programming
Article #14938Re: Willekeurig een reeks elementen kiezen
From: Lieven Marchand
Date: Fri, 08 Dec 2000 17:16
Date: Fri, 08 Dec 2000 17:16
75 lines
3479 bytes
3479 bytes
<apardon@trout.vub.ac.be> writes:
> Het probleem is als volgt.
>
> Ik heb een tabel met statistische gewichten.
> De tabel bevat n elementen waarvan er k
> moeten gekozen worden. Voor elke keuze
> die gemaakt wordt moet de kans dat een
> element er uit gekozen wordt gelijk zijn
> aan zijn gewicht gedeeld door het totaal
> gewicht (van de overblijvende elementen)
> Herhalingen zijn niet toegestaan.
>
> Kent iemand daar een efficient algoritme voor?
>
Als ik je goed begrijp, dan is die aanpassing die je beschrijft
nergens voor nodig. Je aanpassing verandert de relatieve
waarschijnlijkheden niet, je normaliseert ze terug om ze als som 1 te
geven.
Laten we het probleem wat formeler stellen.
Gegeven: een verzameling met n elementen x_1, ..., x_n
n gewichten p_1, ..., p_n met als eigenschap dat de som van de p_i 1
is.
een geheel getal k < n
Gevraagd: een deelverzameling S = {x_i1,...,x_ik} met k elementen zodat de
kans dat x_i een element is van S gelijk is aan p_i.
Eerst een "naief" algoritme:
S={}
while(#S<>k)
do
{selecteer een element x_i rekening houdend met de gegeven gewichten}
if(not x_i in S) then S=S+{x_i} fi
od
De manier om zo een element te selecteren gaat als volgt: genereer een
random getal X tussen 0 en 1.
Als 0<=X<p_1 kies x_1
Als p_1<=X<p_1+p2 kies x_2
Als p_1+p_2<=X<p_1+p_2+p_3 kies x_3
...
Als p_1+p_2+...+p_{n-1}<=X<1 kies x_n
Nu wat optimizaties:
Dit algoritme kan natuurlijk heel lang draaien aangezien we altijd op
een element kunnen vallen dat we al gekozen hebben. Dit wordt erger
naarmate k groter wordt en zou heel erg kunnen zijn voor k=n-1 met een
aantal erg kleine p_i's. We kunnen ervoor zorgen dat k altijd kleiner
of gelijk is aan n/2 door voor k>n/2 het probleem te transformeren
naar het duaal probleem van het kiezen van n-k elementen die wegvallen
met aangepaste p_i.
In bovenstaande methode om een element te selecteren moeten nogal wat
vergelijkingen gemaakt worden. De methode komt eigenlijk neer op een
plaats te zoeken in een gesorteerde tabel en doet dit met een O(n)
algoritme. Je kunt uiteraard binary search gebruiken om dit tot O(log
n) te herleiden. Dit kan zelfs nog verder herleid worden tot een O(1)
bewerking via de methode van Walker. Het is een beetje lang om hier in
te typen en te motiveren, maar je vind het bijvoorbeeld in Knuth,
Vol. 2.
Afhankelijk van je soort van verdeling van gewichten zijn er nog
andere technieken. Voor bovenstaande methode helpt het als de
gewichten niet al te sterk in grootte orde verschillen.
--
Lieven Marchand <mal@bewoner.dma.be>
Lambda calculus - Call us a mad club
Technical Details
Message-ID:
<m3aea6g7fr.fsf@localhost.localdomain>Path:
arc1-ca.pugleaf.net!supernews.google.com!sn-xit-02!sn-xit-03!supernews.com!news.tele.dk!193.190.198.17!newsfeeds.belnet.be!news.belnet.be!newsfeed1.news.nl.uu.net!sun4nl!not-for-mailReferences:
<90qlm4$rus$2@snic.vub.ac.be>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: fcea4,fc451c3eda77bf77 X-Google-Attributes: gidfcea4,public X-Google-ArrivalTime: 2000-12-08 14:25:21 PST Path: arc1-ca.pugleaf.net!supernews.google.com!sn-xit-02!sn-xit-03!supernews.com!news.tele.dk!193.190.198.17!newsfeeds.belnet.be!news.belnet.be!newsfeed1.news.nl.uu.net!sun4nl!not-for-mail Sender: mal@localhost.localdomain Newsgroups: be.comp.programming Subject: Re: Willekeurig een reeks elementen kiezen References: <90qlm4$rus$2@snic.vub.ac.be> From: Lieven Marchand <mal@bewoner.dma.be> X-Newsreader: Gnus v5.5/XEmacs 20.4 - "Emerald" Date: 08 Dec 2000 18:16:08 +0100 Message-ID: <m3aea6g7fr.fsf@localhost.localdomain> Lines: 75 NNTP-Posting-Host: uu212-190-10-4.unknown.uunet.be X-Trace: 976314320 news.be.uu.net 4492 212.190.10.4