我需要将20个不同的值存储到5位中,但是我没有为此找到好的映射函数。
一个对象最多可以有3个插槽,每个插槽的大小为1、2或3。顺序无所谓。
这可以用两种方式表示:
例如,具有2个size-3插槽和1x size-1插槽的对象使用第一种表示形式将是[3,3,1]或使用第二种表示形式是[1,0,2]。
由于顺序无关紧要,因此[3,3,1],[3,1,3]和[1,3,3]是相同的(第一代表)。总共有20种组合。
到目前为止,我可以使用以下简单公式将此映射到6位:
#slot3 = N / 13
#slot2 = (N % 13) / 4
#slot1 = (N % 13) % 4
在给定的示例中,该值为2 * 13 +1 = 27。
可通过以下方式完成:
{{1}}
如前所述,它的范围从0(根本没有插槽)到3 * 13 = 39(3x slot3),间隔需要6位。
如何在不使用地图或大型开关/箱的情况下将其调整为5位?
答案 0 :(得分:0)
您有20个值分别为0、1、2、3的有序组合,并且想要找到一种简单的方法来对这些组合进行编号并按编号检索组合。
对于组合,按降序排列,从3开始有10个组合,从2开始有6个组合,从1开始有3个组合,以及一个零组合。这些值是“三角数”。在第二阶段(第二组合项),涉及数值4,3,2,1(“线性数字”)。似乎您不想将它们保存在表中,因此所有值都可以“即时”计算。
这是Python示例,该示例查找组合数num()
并按数字retr()
检索组合
def num(lst):
lst.sort(reverse=True)
n = 0
j = 0
for i in range(lst[0] + 1):
j += i
n += j
for i in range(lst[1] + 1):
n = n + i
n = n + lst[2]
return n
def retr(num):
result = []
i = 0
j = 1
k = 1
while num >= k:
j += i
k += j
num -= k
i += 1
num += k - j
result.append(i)
i = 0
while num > i:
i += 1
num -= i
result.append(i)
result.append(num)
return result
for i in range(20):
comb = retr(i)
print(comb, num(comb))
[0, 0, 0] 0
[1, 0, 0] 1
[1, 1, 0] 2
[1, 1, 1] 3
[2, 0, 0] 4
[2, 1, 0] 5
[2, 1, 1] 6
[2, 2, 0] 7
[2, 2, 1] 8
[2, 2, 2] 9
[3, 0, 0] 10
[3, 1, 0] 11
[3, 1, 1] 12
[3, 2, 0] 13
[3, 2, 1] 14
[3, 2, 2] 15
[3, 3, 0] 16
[3, 3, 1] 17
[3, 3, 2] 18
[3, 3, 3] 19