arrays – 如何返回元素的索引,其元素值的概率除以数组的总和

给定一个数组和一个值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})
点赞