• Log InLog In
  • Register
Liquid`
Team Liquid Liquipedia
EST 20:06
CET 02:06
KST 10:06
  • 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
ByuL: The Forgotten Master of ZvT28Behind the Blue - Team Liquid History Book19Clem wins HomeStory Cup 289HomeStory Cup 28 - Info & Preview13Rongyi Cup S3 - Preview & Info8
Community News
Weekly Cups (Feb 16-22): MaxPax doubles0Weekly Cups (Feb 9-15): herO doubles up2ACS replaced by "ASL Season Open" - Starts 21/0243LiuLi Cup: 2025 Grand Finals (Feb 10-16)46Weekly Cups (Feb 2-8): Classic, Solar, MaxPax win2
StarCraft 2
General
ByuL: The Forgotten Master of ZvT How do you think the 5.0.15 balance patch (Oct 2025) for StarCraft II has affected the game? Oliveira Would Have Returned If EWC Continued Behind the Blue - Team Liquid History Book Weekly Cups (Feb 16-22): MaxPax doubles
Tourneys
StarCraft Evolution League (SC Evo Biweekly) Sea Duckling Open (Global, Bronze-Diamond) PIG STY FESTIVAL 7.0! (19 Feb - 1 Mar) Sparkling Tuna Cup - Weekly Open Tournament How do the "codes" work in GSL?
Strategy
Custom Maps
Map Editor closed ? [A] Starcraft Sound Mod
External Content
Mutation # 514 Ulnar New Year The PondCast: SC2 News & Results Mutation # 513 Attrition Warfare Mutation # 512 Overclocked
Brood War
General
BGH Auto Balance -> http://bghmmr.eu/ ACS replaced by "ASL Season Open" - Starts 21/02 TvZ is the most complete match up CasterMuse Youtube A cwal.gg Extension - Easily keep track of anyone
Tourneys
Escore Tournament StarCraft Season 1 [Megathread] Daily Proleagues [LIVE] [S:21] ASL Season Open Day 1 Small VOD Thread 2.0
Strategy
Fighting Spirit mining rates Simple Questions, Simple Answers Zealot bombing is no longer popular? Current Meta
Other Games
General Games
Path of Exile Nintendo Switch Thread Beyond All Reason Battle Aces/David Kim RTS Megathread New broswer game : STG-World
Dota 2
Official 'what is Dota anymore' discussion
League of Legends
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
Vanilla Mini Mafia Mafia Game Mode Feedback/Ideas TL Mafia Community Thread
Community
General
US Politics Mega-thread Canadian Politics Mega-thread Mexico's Drug War Russo-Ukrainian War Thread Ask and answer stupid questions here!
Fan Clubs
The IdrA Fan Club The herO Fan Club!
Media & Entertainment
[Req][Books] Good Fantasy/SciFi books [Manga] One Piece Anime Discussion Thread
Sports
2024 - 2026 Football Thread Formula 1 Discussion TL MMA Pick'em Pool 2013
World Cup 2022
Tech Support
TL Community
The Automated Ban List
Blogs
ASL S21 English Commentary…
namkraft
Inside the Communication of …
TrAiDoS
My 2025 Magic: The Gathering…
DARKING
Life Update and thoughts.
FuDDx
Customize Sidebar...

Website Feedback

Closed Threads



Active: 1487 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
PiGosaur Cup
01:00
#70
Liquipedia
[ Submit Event ]
Live Streams
Refresh
StarCraft 2
PiGStarcraft365
RuFF_SC2 146
CosmosSc2 78
StarCraft: Brood War
Artosis 790
League of Legends
tarik_tv4124
Counter-Strike
FalleN 1635
taco 585
Other Games
summit1g12658
shahzam693
C9.Mang0350
Maynarde121
Livibee47
ViBE44
Mew2King39
minikerr10
Organizations
Other Games
gamesdonequick1000
Counter-Strike
PGL529
StarCraft 2
Blizzard YouTube
StarCraft: Brood War
BSLTrovo
sctven
[ Show 16 non-featured ]
StarCraft 2
• musti20045 39
• davetesta31
• AfreecaTV YouTube
• intothetv
• Kozan
• IndyKCrew
• LaughNgamezSOOP
• Migwel
• sooper7s
StarCraft: Brood War
• RayReign 1
• BSLYoutube
• STPLYoutube
• ZZZeroYoutube
Dota 2
• masondota21152
Other Games
• imaqtpie1474
• Shiphtur186
Upcoming Events
CasterMuse Showmatch
7h 55m
Light vs Queen
WardiTV Winter Champion…
10h 55m
OSC
22h 55m
The PondCast
1d 8h
Replay Cast
1d 22h
Korean StarCraft League
3 days
CranKy Ducklings
3 days
SC Evo Complete
3 days
Replay Cast
3 days
Sparkling Tuna Cup
4 days
[ Show More ]
uThermal 2v2 Circuit
4 days
Replay Cast
5 days
Wardi Open
5 days
Replay Cast
5 days
Liquipedia Results

Completed

Proleague 2026-02-22
LiuLi Cup: 2025 Grand Finals
Underdog Cup #3

Ongoing

KCM Race Survival 2026 Season 1
Acropolis #4 - TS5
Jeongseon Sooper Cup
Spring Cup 2026
WardiTV Winter 2026
PiG Sty Festival 7.0
Nations Cup 2026
PGL Cluj-Napoca 2026
IEM Kraków 2026
BLAST Bounty Winter 2026
BLAST Bounty Winter Qual
eXTREMESLAND 2025
SL Budapest Major 2025

Upcoming

[S:21] ASL SEASON OPEN 2nd Round
[S:21] ASL SEASON OPEN 2nd Round Qualifier
Acropolis #4 - TS6
Acropolis #4
IPSL Spring 2026
CSLAN 4
HSC XXIX
uThermal 2v2 2026 Main Event
Bellum Gens Elite Stara Zagora 2026
RSL Revival: Season 4
PGL Astana 2026
BLAST Rivals Spring 2026
CCT Season 3 Global Finals
FISSURE Playground #3
IEM Rio 2026
PGL Bucharest 2026
Stake Ranked Episode 1
BLAST Open Spring 2026
ESL Pro League S23 Finals
ESL Pro League S23 Stage 1&2
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.