【发布时间】:2013-11-30 02:52:18
【问题描述】:
有 n 个选择 k 个大小为 k 的 {1,2,...,n} 的子集。这些可以通过对元素进行排序并使用字典顺序来自然排序。
有没有一种快速的方法来确定给定子集的索引,即它在大小为 k 的所有子集的排序列表中的索引?一种方法是通过枚举所有大小为 k 的子集来创建从子集到索引的字典,但这需要 n 选择 k 个空间和时间。对于我的应用,n 和 k 太大了,但我只需要确定相对较少的子集的索引。
我正在使用 Python 进行编码,但我对通用算法比对任何特定实现更感兴趣。当然,如果在 Python 中有一种特别快速的方法可以做到这一点,那就太好了。
动机:大小为 k 的 {1,2,...,n} 的子集双射对应于维数为 n 的向量空间的第 k 个外幂的基向量。我正在向量空间的外部代数中执行计算,并尝试将结果向量列表转换为稀疏矩阵以进行线性代数,为此我需要按整数而不是列表来索引向量。
【问题讨论】:
-
它看起来确实像复制品。如前所述,阶乘基础答案不太适合问题;根据 n 和 k 的大小,这可能是也可能不是问题。一个简单的快速估计似乎表明接受的答案执行了不必要的计算量,
O(n)调用了n choose k函数而不是O(k)。这实际上可能会或可能不会导致放缓;我没有考虑到n choose k函数的运行时对其输入的依赖性。无论如何,看到现有的工作是很好的。 -
@user2357112 该链接恰当地回答了我的问题:我必须执行的线性代数计算在阶乘之前变得不可行。
标签: python algorithm indexing subset