🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #14938

Re: Willekeurig een reeks elementen kiezen

#14938
From: Lieven Marchand
Date: Fri, 08 Dec 2000 17:16
75 lines
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-mail
References: <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