• Log InLog In
  • Register
Liquid`
Team Liquid Liquipedia
EDT 11:37
CET 16:37
KST 00:37
  • Home
  • Forum
  • Calendar
  • Streams
  • Liquipedia
  • Features
  • Store
  • EPT
  • TL+
  • StarCraft 2
  • Brood War
  • Smash
  • Heroes
  • Counter-Strike
  • Overwatch
  • Liquibet
  • Fantasy StarCraft
  • TLPD
  • StarCraft 2
  • Brood War
  • Blogs
Forum Sidebar
Events/Features
News
Featured News
[ASL21] Ro24 Preview Pt1: New Chaos0Team Liquid Map Contest #22 - Presented by Monster Energy7ByuL: The Forgotten Master of ZvT30Behind the Blue - Team Liquid History Book20Clem wins HomeStory Cup 289
Community News
Weekly Cups (March 16-22): herO doubles, Cure surprises3Blizzard Classic Cup @ BlizzCon 2026 - $100k prize pool48Weekly Cups (March 9-15): herO, Clem, ByuN win42026 KungFu Cup Announcement6BGE Stara Zagora 2026 cancelled12
StarCraft 2
General
https://www.facebook.com/Silen.Sense.Calm.Ears.Ire What mix of new & old maps do you want in the next ladder pool? (SC2) Potential Updates Coming to the SC2 CN Server Behind the Blue - Team Liquid History Book herO wins SC2 All-Star Invitational
Tourneys
Sparkling Tuna Cup - Weekly Open Tournament RSL Season 4 announced for March-April StarCraft Evolution League (SC Evo Biweekly) WardiTV Mondays World University TeamLeague (500$+) | Signups Open
Strategy
Custom Maps
[M] (2) Frigid Storage Publishing has been re-enabled! [Feb 24th 2026]
External Content
The PondCast: SC2 News & Results Mutation # 518 Radiation Zone Mutation # 517 Distant Threat Mutation # 516 Specter of Death
Brood War
General
ASL21 General Discussion KK Platform will provide 1 million CNY Recent recommended BW games Gypsy to Korea RepMastered™: replay sharing and analyzer site
Tourneys
[ASL21] Ro24 Group C [ASL21] Ro24 Group A [Megathread] Daily Proleagues [ASL21] Ro24 Group B
Strategy
What's the deal with APM & what's its true value Fighting Spirit mining rates Simple Questions, Simple Answers
Other Games
General Games
General RTS Discussion Thread Nintendo Switch Thread Stormgate/Frost Giant Megathread Darkest Dungeon Path of Exile
Dota 2
The Story of Wings Gaming Official 'what is Dota anymore' discussion
League of Legends
G2 just beat GenG in First stand
Heroes of the Storm
Simple Questions, Simple Answers Heroes of the Storm 2.0
Hearthstone
Deck construction bug Heroes of StarCraft mini-set
TL Mafia
TL Mafia Community Thread Five o'clock TL Mafia Mafia Game Mode Feedback/Ideas Vanilla Mini Mafia
Community
General
US Politics Mega-thread The Games Industry And ATVI European Politico-economics QA Mega-thread Canadian Politics Mega-thread Russo-Ukrainian War Thread
Fan Clubs
The IdrA Fan Club
Media & Entertainment
[Manga] One Piece [Req][Books] Good Fantasy/SciFi books Movie Discussion!
Sports
2024 - 2026 Football Thread Cricket [SPORT] Formula 1 Discussion Tokyo Olympics 2021 Thread General nutrition recommendations
World Cup 2022
Tech Support
[G] How to Block Livestream Ads
TL Community
The Automated Ban List
Blogs
Funny Nicknames
LUCKY_NOOB
Money Laundering In Video Ga…
TrAiDoS
Iranian anarchists: organize…
XenOsky
FS++
Kraekkling
Shocked by a laser…
Spydermine0240
ASL S21 English Commentary…
namkraft
Customize Sidebar...

Website Feedback

Closed Threads



Active: 1147 users

Math/Computer Science Problem

Blogs > Slithe
Post a Reply
Slithe
Profile Blog Joined February 2007
United States985 Posts
Last Edited: 2008-01-22 23:20:36
January 22 2008 23:17 GMT
#1
You have a list of unknown size N, that you are only allowed to traverse once. The goal is to devise a method to create a set of size K that is random and uniformly distributed among all the possible subsets of N that are size K. What is the method?

Remember:
1) You do not know N. Your answer should not rely on N, i.e. your memory size should not be based on N in any way.
2) You can only traverse the list once.
3) K is less than or equal to N, so there is always at least one possible set.

*****
Asta
Profile Joined October 2002
Germany3491 Posts
January 22 2008 23:39 GMT
#2
I'm too tired to think it through but will the 'picks' be evenly distributed if you choose the first K elements and then (if N > K) eliminate a random (evenly distributed) element of the K+1 (the old picks and the next one on the list)?
I think not... :D Because the first ones will be much likelier to be discarded than the last ones. Which brings us back to the initial problem that you don't know to what degree you have to favor the first ones because it depends on N. Hum...
Cascade
Profile Blog Joined March 2006
Australia5405 Posts
January 23 2008 00:31 GMT
#3
Yeah, that's how you must do it. Up to K you obvioulsy have to pick all elements to your set. When you run through the n:th element (n>K), you use it to replace a random element in your previous set of K elements with a probability K/n. Leave the set unchanged with prob (n-K)/n. Use induction to prove that it works.
zdd
Profile Blog Joined October 2004
1463 Posts
Last Edited: 2008-01-23 02:49:19
January 23 2008 00:31 GMT
#4
I think it would be something like this:
let's say n is an array of ascending integers, k is an int, set_k is an empty array

the set n would be distributed something like this: [1 - k][k+1 - 2k][2k+1 - 3k]...
i=0;
for each $element in n {
if(i<k){
if(random(1,k)=k){
$set_k[i]=$element;
i++;
}
}
}

I dunno, statistically each element in n would have a 1/k chance to become an element in set_k, so I guess in every k elements in set n there should only be around 1 element that goes into set k.

edit: oh nvm, maybe you could just copy set "n" to set "set_k", then remove random elements from set_k until length(set_k) is equal to K

int K = <some value>;
int i=0;
int[] set_k;
for each $element in n {
set_k[i]=$element;
i++;
}
while(length(set_k) != K) {
delete(set_k[random(0, length(set_k))]);
}
output set_k

edit2: cascade's idea is different, because he uses k+1 memory instead of n
it would be implemented something like:
int K = <some value>;
int i=0;
int[] set_k;
function randomkn(k, n){ //run random(1,n) k times
$var=false;
while (k>0){
k--;
if (random(1, n) == n){$var=true;}
}
return $var;
}
for each $element in n {

if (i<K+1){
set_k[i]=$element;
i++;
}

else if (randomkn(K, length(n))) {
set_k[random(0,K+1)]=$element;
}

}
output set_k
All you need in life is a strong will to succeed and unrelenting determination. If you meet these prerequisites, you can become anything you want with absolutely no luck, fortune or natural ability.
BottleAbuser
Profile Blog Joined December 2007
Korea (South)1888 Posts
Last Edited: 2008-01-23 01:37:02
January 23 2008 01:30 GMT
#5
zdd, your second algorithm isn't O(1) or O(K) memory, it's O(n) memory, which breaks the problem constraints.

I'm not sure if I follow your first one.

I think the actual solution has something to do with finding the probability that the nth element should be included in the set, given k.

Obviously (at least to me, I could be wrong), the first element should be selected with (N/K) probability. Then, k := K - 1 if the first element was selected, and n := N - 1 , and repeat for the rest of the elements. This is guaranteed to return K elements.

There might seem to be a problem with the later elements (especially the last element) having a higher than (N/K) probability to be selected, but I think this is not the case. For the last L elements to always be selected, (n/k == 1) must hold. However, the probability of this happening is quite small if N is large (unless K is equally large).

I'm too lazy to calculate it myself (OK, I'm too stupid to do it), but I think if you go through with it, you'll find that the probability that the last L elements are arrived at with (k==n) is the same as 1 minus the probability that they are arrived at with (k==0).

Oh, shit, you don't know N. My idea is bunk.
Compilers are like boyfriends, you miss a period and they go crazy on you.
BottleAbuser
Profile Blog Joined December 2007
Korea (South)1888 Posts
January 23 2008 01:35 GMT
#6
Yeah, I think that Cascade's idea will work. Your memory space is O(K), not O(N), so it's fine.
Compilers are like boyfriends, you miss a period and they go crazy on you.
Slithe
Profile Blog Joined February 2007
United States985 Posts
January 23 2008 02:41 GMT
#7
Yes Cascade has the right answer. Good job! I'll be posting up a significantly more difficult problem now, which I actually don't quite know the answer to, but I have a basic idea.

Regarding this problem:
Basically, since you don't know how many elements are in the list, you have to make sure at each iteration through the list, all elements up to that iteration have an equal probability, k/i, of being in the set, where "i" is the current index. If you work around that idea, then the answer comes more easily, or at least for me it did.

For Asta's answer: The key there was that you don't always discard. It seems that you already realized the problem, so you probably would have realized the fix eventually.

For zdd's answers:
The first one is incorrect because, all elements will have probably 1/k of being in the set until the set is full, and then the next elements have probability 0. In the first place, 1/k is incorrect, and the correct probability to aim for is k/i.
The second one, BottleAbuser pointed out the problem, which is that you require O(n) memory, which is not allowed.
Please log in or register to reply.
Live Events Refresh
PSISTORM Gaming Misc
15:30
FSL s10 FINALS! PTB vs POG
Freeedom0
Liquipedia
Platinum Heroes Events
15:00
PHSC2 Tour S26 Cup #2
SteadfastSC78
CranKy Ducklings72
Liquipedia
[ Submit Event ]
Live Streams
Refresh
StarCraft 2
SteadfastSC 78
gerald23 3
StarCraft: Brood War
Britney 66657
Jaedong 2107
Mini 943
Soma 488
Stork 466
actioN 334
firebathero 311
Shuttle 307
EffOrt 237
hero 132
[ Show more ]
Hyun 80
Soulkey 66
sSak 60
sorry 59
yabsab 31
Movie 30
ToSsGirL 29
Rock 24
Hm[arnc] 23
Terrorterran 20
GoRush 18
IntoTheRainbow 12
SilentControl 10
ivOry 8
Dota 2
Gorgc5855
qojqva2047
Counter-Strike
fl0m3692
shoxiejesuss1929
byalli497
kRYSTAL_17
Super Smash Bros
hungrybox59
Heroes of the Storm
Khaldor390
Liquid`Hasu363
Trikslyr26
MindelVK11
Other Games
FrodaN5638
ArmadaUGS2235
singsing2164
B2W.Neo1068
Lowko392
DeMusliM351
KnowMe162
Fuzer 143
mouzStarbuck123
ToD47
Organizations
Other Games
gamesdonequick1375
StarCraft 2
ComeBackTV 549
Blizzard YouTube
StarCraft: Brood War
BSLTrovo
sctven
[ Show 17 non-featured ]
StarCraft 2
• EnkiAlexander 38
• HeavenSC 36
• Shameless 12
• CranKy Ducklings SOOP4
• AfreecaTV YouTube
• sooper7s
• Migwel
• LaughNgamezSOOP
• IndyKCrew
• Kozan
• intothetv
StarCraft: Brood War
• Michael_bg 7
• blackmanpl 6
• BSLYoutube
• STPLYoutube
• ZZZeroYoutube
League of Legends
• Jankos1984
Upcoming Events
BSL
4h 23m
RSL Revival
18h 23m
ByuN vs Maru
MaxPax vs TriGGeR
WardiTV Team League
20h 23m
BSL
1d 3h
Replay Cast
1d 8h
Replay Cast
1d 17h
Afreeca Starleague
1d 18h
Light vs Calm
Royal vs Mind
Wardi Open
1d 19h
Monday Night Weeklies
2 days
OSC
2 days
[ Show More ]
Sparkling Tuna Cup
2 days
Afreeca Starleague
2 days
Rush vs PianO
Flash vs Speed
Replay Cast
3 days
Afreeca Starleague
3 days
BeSt vs Leta
Queen vs Jaedong
Replay Cast
4 days
The PondCast
4 days
Replay Cast
5 days
RSL Revival
5 days
Replay Cast
6 days
RSL Revival
6 days
Liquipedia Results

Completed

Proleague 2026-03-27
WardiTV Winter 2026
Underdog Cup #3

Ongoing

BSL Season 22
CSL Elite League 2026
CSL Season 20: Qualifier 1
ASL Season 21
Acropolis #4 - TS6
2026 Changsha Offline CUP
StarCraft2 Community Team League 2026 Spring
RSL Revival: Season 4
Nations Cup 2026
NationLESS Cup
BLAST Open Spring 2026
ESL Pro League S23 Finals
ESL Pro League S23 Stage 1&2
PGL Cluj-Napoca 2026
IEM Kraków 2026
BLAST Bounty Winter 2026
BLAST Bounty Winter Qual

Upcoming

CSL Season 20: Qualifier 2
CSL 2026 SPRING (S20)
Acropolis #4
IPSL Spring 2026
BSL 22 Non-Korean Championship
CSLAN 4
Kung Fu Cup 2026 Grand Finals
HSC XXIX
uThermal 2v2 2026 Main Event
IEM Cologne Major 2026
Stake Ranked Episode 2
CS Asia Championships 2026
IEM Atlanta 2026
Asian Champions League 2026
PGL Astana 2026
BLAST Rivals Spring 2026
CCT Season 3 Global Finals
IEM Rio 2026
PGL Bucharest 2026
Stake Ranked Episode 1
TLPD

1. ByuN
2. TY
3. Dark
4. Solar
5. Stats
6. Nerchio
7. sOs
8. soO
9. INnoVation
10. Elazer
1. Rain
2. Flash
3. EffOrt
4. Last
5. Bisu
6. Soulkey
7. Mini
8. Sharp
Sidebar Settings...

Advertising | Privacy Policy | Terms Of Use | Contact Us

Original banner artwork: Jim Warren
The contents of this webpage are copyright © 2026 TLnet. All Rights Reserved.