找回密码
 点一下
查看: 1256|回复: 5

对排列顺序的研究

[复制链接]
发表于 2016-9-3 22:12:31 | 显示全部楼层 |阅读模式
本贴说明一种毫无技术含量的算法,用于对排列顺序进行编号。

假设需要对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编号 每用一个就剔除掉

因为太懒了所以省很多字,这只是简述,做起来也并不复杂。

有什么用?
可以用于数据加密,这是一种“奇葩”的加密方式,出现的字母不应该重复,可进行二次替换加密。
因为本身能进行排列,所以可用玩家句柄转换成排列顺序再进行替换。可对已经替换过的再进行替换。
无需记录玩家句柄。建议使用其他加密方式配合,或只是对明码数字封装。
 楼主| 发表于 2016-9-3 22:29:41 | 显示全部楼层
另外说一下,这个算法是可以使用递归实现的。
回复

使用道具 举报

发表于 2016-9-3 22:59:44 | 显示全部楼层
排列组合是高中数学的知识(至少我上学那会儿是的),说实在的,有一定难度,也许是我数学比较渣,对于高中数学学得好的人可能是挺简单的一件事。不过对于电脑来讲,排列组合的算法就丰富多了,而且有些也比较直观。而且因为递归的存在,排列组合就成了基础性的东西了。但是暴雪并没有直接提供这类算法,所以楼主还是可以定义一个这样的函数,发出来让有需要的人使用,这样会避免大家重复劳动。
不过说到加密,其实星际2的自定义地图并不是真正的加密啦,毕竟可以直接看源码,写啥都可以直接被破解者看到,连猜解过程都省了。当然,对于大多数不懂编辑器的玩家来说,加密还是有一定作用的。前些时候我写过关于加密的一些思想和演示算法,不过考虑到编辑器本身就支持加密,需要自行写加密算法的时候并不多,所以权当乐趣来研究了。
回复

使用道具 举报

 楼主| 发表于 2016-9-7 23:23:41 | 显示全部楼层
最后完成效果就是这样
09071.png 09072.png 09073.png

亲测有效,用于奇葩加密。
回复

使用道具 举报

 楼主| 发表于 2016-9-7 23:39:16 | 显示全部楼层
最右边的图有个错误谁发现了吗
回复

使用道具 举报

发表于 2016-9-8 19:17:41 | 显示全部楼层
呆若木鸡
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-19 14:38 , Processed in 0.144234 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表