在不生成整个幂集的情况下生成原始列表的 n 个子列表(每个子列表任意大小)的最快方法?
Fastest possible way of generating n sublists (each of arbitrary size) of an original list without generating the entire power set?
我觉得这个问题以前肯定有人问过,但我找不到我要找的东西。我有一个 python 列表 S
,其中包含 100
个唯一整数,每个整数的大小为 10^100
。我想要以最快的方式从它的幂集中采样 n
元素。换句话说,我想要 n
个任意长度的唯一子列表。这可以通过生成 2^n
个子集并从中挑选来完成,但这不可行而且非常慢。我在循环中尝试过这样的事情,
S[np.random.choice(S.shape[0], np.random.randint(S.shape[0]), replace=False)]
但是,这很慢并且有冲突。我尝试过的另一件事是在循环中使用 SageMath's Subsets.random_element() 。这在没有碰撞的情况下更好地采样,但循环使其变慢。
那么,在 python 中从唯一整数列表的幂集(幂列表?)中获取 n
个样本的最快方法是什么。
这是我试图解决的问题的瓶颈,任何可以可行且快速地完成幂集采样的库或技术都将提高我的解决方案的整体速度。
您可以生成 n 个布尔掩码:
n = 4
masks = np.random.randint(2, size=(n,100), dtype=np.bool)
sets = [*map(lambda x: a[x], masks)] # a.shape=(100)
您可以通过以下方式检查掩码是否唯一:
len(np.apply_along_axis(lambda x: x.tostring(), 1, masks)) == n
不过概率太低了,我也懒得理了
我觉得这个问题以前肯定有人问过,但我找不到我要找的东西。我有一个 python 列表 S
,其中包含 100
个唯一整数,每个整数的大小为 10^100
。我想要以最快的方式从它的幂集中采样 n
元素。换句话说,我想要 n
个任意长度的唯一子列表。这可以通过生成 2^n
个子集并从中挑选来完成,但这不可行而且非常慢。我在循环中尝试过这样的事情,
S[np.random.choice(S.shape[0], np.random.randint(S.shape[0]), replace=False)]
但是,这很慢并且有冲突。我尝试过的另一件事是在循环中使用 SageMath's Subsets.random_element() 。这在没有碰撞的情况下更好地采样,但循环使其变慢。
那么,在 python 中从唯一整数列表的幂集(幂列表?)中获取 n
个样本的最快方法是什么。
这是我试图解决的问题的瓶颈,任何可以可行且快速地完成幂集采样的库或技术都将提高我的解决方案的整体速度。
您可以生成 n 个布尔掩码:
n = 4
masks = np.random.randint(2, size=(n,100), dtype=np.bool)
sets = [*map(lambda x: a[x], masks)] # a.shape=(100)
您可以通过以下方式检查掩码是否唯一:
len(np.apply_along_axis(lambda x: x.tostring(), 1, masks)) == n
不过概率太低了,我也懒得理了