|
本贴说明一种毫无技术含量的算法,用于对排列顺序进行编号。
假设需要对ABCDEFGHIJ进行排列,共有多少种排列组合?
经过计算可以得到总共有3628800种组合。
如果需要对每种排列组合进行编号,应该怎么计算?
首先需要对每个字母编号,规定一个组合作最小值为0,比如设ABCDEFGHIJ为0
则ABCDEFGHIJ的编号为0,1,2,3,4,5,6,7,8,9
编号完后,需要对每一位的大小进行计算,类似普通的进位制,都需要满几进1原则,不过在这里每一位的进制都不同。
最后一位因为只有一种组合所以是0,没有意义,所以从第二位开始计算。(默认从左向右高位到低位)
第二位代表1,满2进1,因此第三位代表2,第四位代表6,第五位代表24。(第n位代表的数字是 n-1的阶乘 ,因为前面的字母排列组合总共有 n-1的阶乘 种。阶乘可用计算器的n!按钮计算)
ABCDEFGHIJ的编号是临时的,在算法中编号会发生变化。
简述一下算法
把排列组合变为一个整数:
假设给的排列组合是ABCDEFGIJH
从左向右的读取单个字符。读取它们的编号。
设置a=0 B(n)=n-1的阶乘
第一步:读取A 编号为0(实际应用中会用循环结构来判断)
然后从A到J每个字母的的编号-1
略
第七步:读取I 编号为1 设置a=a + 1'*b(3) I到J每个字母的的编号-1 (为了方便B应该顺序反过来设置的,这里的1'是读取到的编号)(B(3)=2)
第八步:读取J 编号为1 设置a=a + 1'*b(2) J到J每个字母的的编号-1 (B(2)=1)
然后得到a=3
把整数变为排列组合:
类似于从排列组合变整数,但计算更为简单
确保没有超过能代表的最大数字
设置a=任意整数 i=10
第i位=a/b(i)
a=a mod b(i)
i-1
重复动作直到i=1
然后用A-J编号 每用一个就剔除掉
因为太懒了所以省很多字,这只是简述,做起来也并不复杂。
有什么用?
可以用于数据加密,这是一种“奇葩”的加密方式,出现的字母不应该重复,可进行二次替换加密。
因为本身能进行排列,所以可用玩家句柄转换成排列顺序再进行替换。可对已经替换过的再进行替换。
无需记录玩家句柄。建议使用其他加密方式配合,或只是对明码数字封装。
|
|