首页 > 其他分享 >用一个整数表达一个序列,可能吗

用一个整数表达一个序列,可能吗

时间:2023-12-29 09:11:24浏览次数:25  
标签:15 数字 个数 整数 算法 序列 表达

引言

早年,我发现了一种可以用一个整数表示一个序列的数学方法。
下表是3个数字的全排列,有6种情况,编号0到5。

编号 序列
0 0,1,2
1 0,2,1
2 1,0,2
3 1,2,0
4 2,0,1
5 2,1,0

编码

下面介绍如何从序列计算出编号。以2,1,3,0为例。

2 1 3 0   2+0*4=2
  1 2 0   1+2*3=7
    1 0   1+7*2=15
      0   0+15*1=15

首先,取最左的数字2,得到了2。剩下1,3,0。把大于2的数字减1,得到1,2,0。
其次,取最左的数字1,把上一步得到的2,乘以当前的数字个数3,再和1相加,得到7。剩下2,0,把大于1的数字减1,得到1,0。
再次,取最左的数字1,把上一步得到的7,乘以当前的数字个数2,再和1相加,得到15。剩下0,把大于1的数字减1,得到0。
最后,取最左的数字0,把上一步得到的15,乘以当前的数字个数1,再和0相中,得到15。
序列有几个数字,就作几次运算。

用同样的算法,把0,1,2,3共4个数字的全排列24种序列进行计算,刚好得到0至23共24个整数。

解码

那么,如何反算编号,还原出序列呢?以15还原出0~3共4个整数为例。

                 0
15/2=7...1   1   1 0
7/3=2....1   1   1 2 0
2/4=0....2   2   2 1 3 0

首先,固定给序列加上数字0。
其次,当前序列的个数1加上固定1得到2。15除以2商7余1,把余数1加到序列的左边,得到1,0。
再次,和上一步同样的算法,上一步的商7除以3商2余1,把序列中比1大的数字加1,再把1加到序列的左边,得到 1,2,0
最后,和上一步同样的算法,上一步的商2除以4商0余2,把序列中比2大的数字加1,再把2加到序列的左边,得到 2,1,3,0
要还原的序列有几个数字,就作几次运算。最后一次运算的商肯定是0。

用同样的算法,把0至23共24个数字进行计算,刚好得到全排列24种序列。

优点

这种算法有什么优点

  1. 一个整数,就能存储一个序列,非常节约了存储空间。
    多个数字变一个
  2. 不同的序列,换算成的整数是连续的,还是节约存储空间。
    这一个数字还很小
  3. 支持任意个数字的序列,有普通性。
    上述的例子是4个数的序列,这种算法支持任意的个数。当然,不能少于1个。

限制

这种算法有什么限制

  1. 整数必须是从0开始,并且是连续的,即是0~n,共n+1个数。不是这种情况,得先转化成这种情况。
  2. 必须是整数,不支持字符,除非能换算成整数

数字的个数

前面的例子,要还原出序列,即需要数字15,也需要知道序列的个数,即数字4。所以,完整来讲不是一个数,而是两个数。
在很多场景下,序列的个数是事先约好的,是固定的,所以,又变成了一个数。

由来

记得在2010年,就向朋友介绍过这种算法。这位朋友长期在国外,最近回国可能是探亲。令我想起这种算法,所以编理成文。
这种算法不是在哪里抄的,或借鉴的,是我自个儿琢磨的。目前推算,应该是2005至2010之间想出来的。

标签:15,数字,个数,整数,算法,序列,表达
From: https://www.cnblogs.com/BillySir/p/17934008.html

相关文章

  • Linux文件查找、三剑客、正则表达式
    Linux文件查找1.find查找概述为什么要有文件查找,因为很多时候我们可能会忘了某个文件所在的位置,此时就需要通过find来查找。find命令可以根据不同的条件来进行查找文件,例如:文件名称、文件大小、文件修改时间、属主属组、权限、等等方式。同时find命令是Linux下必须掌握的。*fi......
  • StringBuilder&正则表达式&日期类总结
    总结StringBuilder:可以改变的字符串底层:使用的是一个byte类型的数组,默认长度16如果超过16,数组会自动扩容扩容的时机:当添加的数据的长度大于此时数组的长度扩容的机制:当前数组长度的2倍+2构造方法:StringBuilder()构造一个没有字符的字符串构建器,初始容量为16个字符。/......
  • 数据类型&变量&表达式总结
    总结数据类型转换概念:数据从一种数据类型转换为另外一种类型为什么需要数据类型转换?节约内存空间业务需要java中的数据类型转换分类向上转型:从小范围的数据转换为大范围的数据类型,自动发生byteb=10;//局部变量shorts=b;//发生数据类型转换,向上......
  • 数据类型转换&表达式&运算符总结
    总结数据类型转换概念:将数据从一种格式或结构转换为另一种格式或结构的过程。作用:节约内存空间将一些类型转换为项目所需要的类型类型转换分类自动隐式转换定义:将小的数据类型转换大的数据类型注意事项:在Java中,boolean类型与所有其他7种类型都不能......
  • Kotlin的Lambda表达式
    Kotlin中的Lambda表达式提供了一种强大且灵活的方式来定义一个匿名函数(一个没有名字的函数)。Lambda表达式在处理集合、实现事件监听器、以及其他需要简洁且专注的函数式编程场景中非常有用。以下是一些KotlinLambda表达式的示例:1.基本Lambda表达式假设我们有一个简单的需求:对......
  • NX2306机电概念设计-仿真序列
    【写在每个笔记前面:个人学习记录,如有错误,烦请指正,不胜感激。】 【机电概念设计】→【自动化】→【仿真序列】 1、定义仿真序列就是让你在什么时间,实现什么运动。官方解释:定义基于时间的行为和基于事件的行为 2、基于时间的仿真序列(学习案例源于UG爱好者-撒盐哥)step1......
  • 正则表达式语法速查
    字符说明\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,n匹配字符n。\n匹配换行符。序列\\匹配\,\(匹配(。^匹配输入字符串开始的位置。如果设置了RegExp对象的Multiline属性,^还会与"\n"或"\r"之后的位置匹配。$匹配输入字符串结尾......
  • 快速熟悉Lambda表达式
    在Java基础课程中有一个工具非常好用,但不常用就很容易忘记。大家一定已经猜到,它就是Lambda表达式,一个会者不难的工具。今天我们就来快速熟悉下Lambda表达式。1.没有Lambda表达式的编码习惯先聊一个简单的面试题,匿名内部类和多态有什么关系?相信大家都会脑补在Java基础部分的内部类知......
  • SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行在上面搭建SpringBoot项目的基础上,并且在项目中引入fastjson、hutool等所需依赖后。JaywayJsonPath:GitHub-json-path/JsonPath:JavaJsonPathi......
  • Postgresql中自增主键序列的使用以及数据传输时提示:错误:关系“xxx_xx_xx_seq“不存
    场景Postgresql在Windows中使用pg_dump实现数据库(指定表)的导出与导入:Postgresql在Windows中使用pg_dump实现数据库(指定表)的导出与导入上面讲使用pg_dump进行postgresql的导出与导入。如果使用Navicat可以直接连接两个库,则可直接使用数据传输功能。但是在传输某个表时提示:错误:关......