【发布时间】:2021-02-19 02:33:06
【问题描述】:
我想为一组组合中的每个组合预先计算一些值。例如,当从 0 到 12 中选择 3 个数字时,我将为每个数字计算一些值:
>>> for n in choose(range(13), 3):
print n, foo(n)
(0, 1, 2) 78
(0, 1, 3) 4
(0, 1, 4) 64
(0, 1, 5) 33
(0, 1, 6) 20
(0, 1, 7) 64
(0, 1, 8) 13
(0, 1, 9) 24
(0, 1, 10) 85
(0, 1, 11) 13
etc...
我想将这些值存储在一个数组中,以便给定组合,我可以计算它并获取值。例如:
>>> a = [78, 4, 64, 33]
>>> a[magic((0,1,2))]
78
magic 会是什么?
最初我想将它存储为大小为 13 x 13 x 13 的 3-d 矩阵,这样我就可以轻松地索引它。虽然这对于 13 选择 3 来说很好,但对于像 13 选择 7 这样的东西来说,这将有太多的开销。
我不想使用字典,因为最终这段代码将在 C 中,而且数组会更有效。
更新:我也有类似的问题,但使用重复组合,所以任何关于如何获得这些排名的答案将不胜感激 =)。
更新:为了清楚起见,我正在尝试节省空间。这些组合中的每一个实际上都对某物进行索引占用了大量空间,比如说 2 KB。如果我要使用 13x13x13 数组,那将是 4 MB,其中我只需要 572 KB 使用(13 选择 3)点。
【问题讨论】:
-
在排列、组合和分区中,文献术语是“排名”而不是“索引”。搜索“排名组合算法”。 :) 这是一个非常好的页面:home.hccnet.nl/david.dirkse/math/rank/ranking.html
-
当你说“我不想使用字典”时……是否意味着你不想使用哈希表?
-
@belisarius: 是的,对不起python术语
-
如果你想预先计算,你总是会得到“M选择N”元素。如果你想要一个不是数组的结构,你必须为每个节点实现至少 1 个指针。那么,为什么你认为有比数组更好的方法呢?
-
@belisarius:数组很好。当我只需要一个 286 个元素的数组时,我只是不想要一个 13 x 13 x 13 的数组。
标签: algorithm language-agnostic hash combinatorics combinations