Created
October 30, 2011 22:40
-
-
Save zdavkeos/1326551 to your computer and use it in GitHub Desktop.
Sample answer to interview question: Given an unknown number of items one at a time, choose one at random using O(1) space
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
from random import random | |
class seq_selector: | |
""" | |
Given an arbitrary and unknown length sequence of objects recieved | |
one at a time, this module provides a random selection from the | |
sequence using O(1) space. | |
TODO: make thread safe? | |
""" | |
def __init__(self): | |
self.current = None | |
self.count = 0.0 | |
def get_selection(self): | |
""" returns current random selection """ | |
return self.current | |
def clear(self): | |
""" | |
Clears the selector and resets everything | |
""" | |
self.current = None | |
self.count = 0.0 | |
def feed(self, item): | |
""" | |
register next item in sequence | |
returns selection (changed or otherwise) | |
""" | |
self.count += 1.0 | |
if random() < (1.0 / self.count): | |
self.current = item | |
return self.current | |
if __name__ == '__main__': | |
""" | |
Runs a test of seq_selector | |
""" | |
from matplotlib import pylab | |
import numpy | |
rng = 256 #length of seq | |
cnt = 1000 #num trials | |
seq = range(rng) | |
seqr = seq_selector() | |
res = [] | |
for _ in xrange(cnt): | |
seqr.clear() | |
for i in seq: | |
seqr.feed(i) | |
res.append(seqr.get_selection()) | |
n, bins, p = pylab.hist(res, rng) | |
print 'Mean should be about:', 1.0*cnt/rng | |
m = numpy.mean(n) | |
print 'Mean is:', m | |
print 'Std. Dev:', numpy.std(n) | |
print 'Greatest outlier: +-', max(abs(numpy.max(n)-m), abs(numpy.min(n)-m)) | |
pylab.plot(bins, numpy.ones(len(bins))*cnt/rng, 'r', linewidth=2) | |
pylab.show() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment