基本上,我需要这样的东西:
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
的一部分。
修改
我希望在不分配任何新内存的情况下完成此操作,仅使用指针。
答案 0 :(得分:1)
对于更快的算法,您需要考虑实施的每个成本。
首先,如果b
是a
的子集,并且您对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 ...
中选择一个元素