Solve algorithms dealing with randomness
Tonight I learned that random sample where each element in the sampling corpus has an equal likelihood of being chosen is a brand of algorithms known as "reservoir sampling". - Implement random.shuffle(..) - Implement random.choice(..) Surprisingly, candidates are expected to encounter problems like this during interviews.
This commit is contained in:
parent
572fb0fe5f
commit
751b5327a9
2 changed files with 46 additions and 0 deletions
7
scratch/facebook/hard/fisher-yates.py
Normal file
7
scratch/facebook/hard/fisher-yates.py
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import random
|
||||||
|
|
||||||
|
def shuffle(xs):
|
||||||
|
n = len(xs)
|
||||||
|
for i in range(n):
|
||||||
|
j = random.randint(i, n - 1)
|
||||||
|
xs[i], xs[j] = xs[j], xs[i]
|
39
scratch/facebook/hard/random-choice.py
Normal file
39
scratch/facebook/hard/random-choice.py
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import random
|
||||||
|
|
||||||
|
# This class of problems is known as "resevoir sampling".
|
||||||
|
def choose_a(m, xs):
|
||||||
|
"""
|
||||||
|
Randomly choose `m` elements from `xs`.
|
||||||
|
This algorithm runs in linear time with respect to the size of `xs`.
|
||||||
|
"""
|
||||||
|
result = xs[:m]
|
||||||
|
for i in range(m, len(xs)):
|
||||||
|
j = random.randint(0, i)
|
||||||
|
if j < m:
|
||||||
|
result[j] = xs[i]
|
||||||
|
return result
|
||||||
|
|
||||||
|
def choose_b(m, xs):
|
||||||
|
"""
|
||||||
|
This algorithm, which copies `xs`, which runs in linear time, and then
|
||||||
|
shuffles the copies, which also runs in linear time, achieves the same
|
||||||
|
result as `choose_a` and both run in linear time.
|
||||||
|
|
||||||
|
`choose_a` is still preferable since it has a coefficient of one, while this
|
||||||
|
version has a coefficient of two because it copies + shuffles.
|
||||||
|
"""
|
||||||
|
ys = xs[:]
|
||||||
|
random.shuffle(ys)
|
||||||
|
return ys[:m]
|
||||||
|
|
||||||
|
# ROYGBIV
|
||||||
|
xs = [
|
||||||
|
'red',
|
||||||
|
'orange',
|
||||||
|
'yellow',
|
||||||
|
'green',
|
||||||
|
'blue',
|
||||||
|
'indigo',
|
||||||
|
'violet',
|
||||||
|
]
|
||||||
|
print(choose_b(3, xs))
|
Loading…
Reference in a new issue