Если у вас есть наборы Si
, i=1..n
размера Ci = |Si|
, то декартово множество S = S1 x S2 x ... x Sn
имеет размер C = C1 * C2 * ... * Cn
.
Это мотивирует очевидный способ сделать упаковку один в один. Если у вас есть элементы e1,...,en
из каждого набора, каждый в диапазоне от 0
до Ci-1
, то вы присваиваете элементу e=(e1,...,en)
значение e1+C1*(e2 + C2*(e3 + C3*(...Cn*en...)))
.
Вы можете сделать любую перестановку этой упаковки, если хотите, но если значения не полностью соотнесены, размер полного набора должен быть произведением размеров наборов компонентов.
В конкретном случае трех 32-битных целых, если они могут принимать любое значение, вы должны рассматривать их как одно 96-битное целое.
Если вы особенно хотите, вы можете отобразить маленькие значения на маленькие значения с помощью любого количества средств (например, заполняя сферы с помощью нормы L1), но вы должны указать, какие свойства вы хотите иметь.
(Например, можно сопоставить (n,m)
с (max(n,m)-1)^2 + k
, где k=n
, если n<=m
и k=n+m
, если n>m
- вы можете нарисовать это как изображение заполнения квадрата следующим образом:
1 2 5 | draw along the edge of the square this way
4 3 6 v
8 7
если вы начинаете считать с 1
и беспокоитесь только о положительных значениях; для целых чисел вы можете вращаться вокруг начала координат.)