从数组中返回随机元素,不包括子数组

时间:2015-05-25 08:02:45

标签: algorithm random

基本上,我需要这样的东西:

f(a[], b[]) = random element from a[] which is not in b[]

我有这个想法:

while true:
   e = element_from_uniform(a[])
   if e not in b[]: return e

问题是,我希望这个函数快速,因为它将被计算很多次(多个对象上的每一帧)。我知道,由于我们选择统一分布,最终会弹出a[]中的某些元素,而不是b[]

有什么想法吗?哦,如果它有帮助,a[].length总是6,而b[]始终是a[]b.length < a.length的一部分。

修改

我希望在不分配任何新内存的情况下完成此操作,仅使用指针。

2 个答案:

答案 0 :(得分:1)

对于更快的算法,您需要考虑实施的每个成本。

首先,如果ba的子集,并且您对b进行了排序,则可以使用二进制搜索O = lg n搜索任何元素。如果您使用x_{n+1} = x_{n} % M + b形式的al Linear Congruent生成器,则随机元素的拾取,因此拾取随机元素为O(1)

因此,使用此方法,您可以返回lg n,但在最坏的情况下保留b订购者可能会花费m lg m(其中m = {{1与Mergesort或Quicksort一起使用。

答案 1 :(得分:0)

您可以先创建$ a \ setminus b $。在Python中,例如函数difference()。然后你可以从$ s \ setminus b $ random ...

中选择一个元素