基于{1,2,3,4,5}的三元组唯一编号与可逆映射方案问询
解决方案:三元组与唯一编号的双向映射
当然存在这种分配方法!这本质上是要给每个有序三元组建立一个唯一的整数双射(一一对应),利用进制转换的思路就能轻松实现,而且天然支持排序——编号的大小可以直接对应三元组的某种有序排列(比如字典序)。
核心思路
因为每个位置的元素都有5种可能(1-5),我们可以把三元组看作一个5进制数,但需要先把1-5的取值转换为0-4来适配标准的进制计算逻辑,之后再做反向转换即可。
方法一:按字典序映射(先比第一个元素,再第二个,最后第三个)
1. 三元组 → 唯一编号
假设三元组是 (a, b, c),其中 a, b, c ∈ {1,2,3,4,5}:
- 第一步:把每个元素减1,得到
a' = a-1,b' = b-1,c' = c-1(此时每个值的范围是0-4) - 第二步:计算编号:
(加1是为了让编号从1开始;如果接受从0开始编号,可以去掉最后的编号 = a' * 5² + b' * 5 + c' + 1+1)
举几个例子验证:
- 三元组
(1,1,1):a'=0, b'=0, c'=0→ 编号 = 0 + 0 + 0 +1 = 1 - 三元组
(1,1,2):c'=1→ 编号 = 0 +0 +1 +1 =2 - 三元组
(5,5,5):a'=4, b'=4, c'=4→ 编号 = 425 +45 +4 +1 = 125(刚好是总三元组数量)
2. 编号 → 对应三元组
假设编号为 N(范围1-125):
- 第一步:先减1得到
N' = N-1(把编号转换为0起始的索引) - 第二步:计算最后一位的转换值:
c' = N' % 5,对应三元组的c = c' +1 - 第三步:计算剩余值
N1 = N' // 5 - 第四步:计算第二位的转换值:
b' = N1 %5,对应三元组的b = b' +1 - 第五步:计算第一位的转换值:
a' = N1 //5,对应三元组的a = a' +1 - 最终得到三元组
(a,b,c)
举例子验证:
- 编号125:
N'=124→c'=124%5=4→c=5;N1=124//5=24→b'=24%5=4→b=5;a'=24//5=4→a=5→ 得到(5,5,5) - 编号3:
N'=2→c'=2%5=2→c=3;N1=2//5=0→b'=0%5=0→b=1;a'=0//5=0→a=1→ 得到(1,1,3)
自定义排序映射
如果想要编号对应其他排序规则(比如优先比较第三个元素,再第二个,最后第一个),只需要调整公式里的权重即可。比如:
编号 = c' * 5² + b' *5 + a' +1
这样编号的大小顺序就会对应三元组按c→b→a的优先级排序,灵活度很高。
内容的提问来源于stack exchange,提问作者budi
相关产品推荐
相关产品推荐

