给定一个数组和一个值k,写一个函数,以k / sum(输入数组)的概率返回等于k的元素的索引.假设输入数组中没有重复的数字.
例如,如果输入数组是1,4,2,3.该函数应具有以下行为:
以概率1/10返回0;
以概率4/10返回1;
以概率2/10返回2;
以概率3/10返回3;
问题2:如果数组中有重复项,如何处理它?
我认为二进制搜索很适合在数组中找到一个元素,但是我还没弄清楚如何将它与概率联系起来.
编辑:
如建议的那样,this question与我的问题类似.但是,它的解决方案并非我的预期.我一直在寻找嵌入二分搜索的解决方案,这可能会降低时间复杂度.
关于给定一个键的good solution,如何使用二进制搜索来找到比排序数组中的键大的第一个元素.
最佳答案 您可以从输入中生成累积数组,其中B [i] = A [0] A [1] … A [i].生成1和sum(A)之间的随机int x,然后对第一个元素的二进制搜索B不小于x.
这是Python中的一个例子(使用Python的bisect模块,这本质上是二进制搜索).
import random, bisect, collections
def make_random(A):
s = sum(A)
B = list(A)
for i in xrange(1, len(B)):
B[i] += B[i-1]
def fn():
r = random.randint(1, s)
return bisect.bisect_left(B, r)
return fn
rnd = make_random([1,4,2,3])
c = collections.Counter()
for i in xrange(10000):
c[rnd()]+=1
print c
结果如下:
Counter({1: 3960, 3: 3036, 2: 1992, 0: 1012})