可以使用0
至2^n-1
范围内的部分数字(可以全部使用)创建任意数字序列。让我们考虑所有数字都是唯一的序列。
例如,n = 4
的一些顺序是:
4 2 5 7 11 3
15 1 6
6 5 8 2 3 10 12 13 4
问题:是否可以在不使用内存存储整个序列的情况下生成此类序列?
我正在考虑某种功能F
,该功能仅进行位操作并使用前一个给出下一个数字。例如顺序7 3 5 9
:F(7)=3
,F(3)=5
,F(5)=9
。
如果我事先知道序列,如何构建这样的功能F
?
答案 0 :(得分:3)
不,一般而言。尽管序列S不必真正地在内存中表示出来以便我们实现生成函数F,但是任何函数F都可以有效地编码序列S,因此需要存储。
(生成函数F是这样的函数,其中F(i),其中i是序列的元素,是序列的下一个元素,或者,如果i是最后一个元素,则是指示该值的某个值。)
当然,某些序列(例如琐碎的0、1、2、3,…)可能由小的函数生成。但是,请考虑一些位数b。可以用b位编码的不同函数的数量最多为2 b (使用您想要的任何编码方案-源代码,机器代码,抽象数学表示等)。不同序列的数量为2 n !,因此所需的不同生成函数的数量为2 n !。
因此2 b ≥2 n !,因此b≥log 2 (2 n !)。因此,如果我们想要有足够的内存来保存2 n 的任何序列的生成函数,则至少需要log 2 (2 n !)位。
答案 1 :(得分:0)
是的。加密是明文和密文之间的双射。每个明文输入都会产生一个唯一的密文输出,然后可以将其唯一解密为原始明文。
对于数字,最简单的方法是使用诸如DES(64位)或AES(128位)之类的分组密码。如果需要,可以使用其他块大小。
对于给定的序列,您将需要存储密码(通常与块大小一样大)以及在纯文本输入中所达到的位置。只需按顺序加密整数0、1、2、3,...。输出将是给定块大小内的一系列非重复数字。要以相同的顺序生成更多数字,请从最后使用的数字继续。对于不同的序列,请更改键,然后再次从0开始。每个键定义给定大小的可能块的排列。
对于允许重复的序列,请使用哈希函数而不是密码,对0、1、2、3等进行哈希处理。对于不同的序列,请使用XOR块作为键的等效项,并将其与输入进行XOR运算。散列之前。如果要添加到现有序列中,则需要跟踪到达的输入位置。