Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 编码并生成N以下唯一数字的固定序列_Algorithm_Bit Manipulation - Fatal编程技术网

Algorithm 编码并生成N以下唯一数字的固定序列

Algorithm 编码并生成N以下唯一数字的固定序列,algorithm,bit-manipulation,Algorithm,Bit Manipulation,可以使用0到2^n-1范围内的部分(可以使用全部)数字创建任意数字序列。让我们考虑所有数字唯一的序列。< /P> 例如,如果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
2^n-1
范围内的部分(可以使用全部)数字创建任意数字序列。让我们考虑所有数字唯一的序列。< /P> 例如,如果
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,序列S不需要在内存中按字面表示,但是任何函数F都有效地编码序列S,因此需要内存

(生成函数F是这样一个函数,其中F(i)是序列的一个元素,是序列的下一个元素,或者,如果i是最后一个元素,则是指示该元素的某个值。)

当然,一些序列,例如平凡的0,1,2,3,…,可能是由小函数生成的。然而,考虑一些比特B。可以用b位编码的不同函数的数量最多为2b(使用您想要的任何编码方案,源代码、机器代码、抽象数学表示等等)。不同序列的数量为2n!,所以需要的不同生成函数的数目是2n


因此2b≥ 2n!,所以b≥ log2(2n!)。因此,如果我们想要有足够的内存来为2n的任何序列保存生成函数,我们至少需要log2(2n!)位。

是的。加密是明文和密码文本之间的双射。每个纯文本输入都会产生一个唯一的cyphertext输出,然后可以将其唯一地解密回原始纯文本

对于数字,最容易使用分组密码,如DES(64位)或AES(128位)。如果需要,可以使用其他块大小

对于给定的序列,您需要存储密码键(通常与块大小一样大)以及您在明文输入中达到的位置。只需加密整数0,1,2,3。。。整齐输出将是给定块大小内的一系列非重复数字。要在同一序列中生成更多数字,请从使用的最后一个数字继续。对于不同的序列,请更改键并在0处重新开始。每个键定义给定大小的可能块的排列


对于允许重复的序列,使用散列函数而不是密码,散列0、1、2、3。。。对于不同的序列,使用XOR块作为密钥的等价物,并在散列之前将其与输入进行XOR。如果要添加到现有序列中,您需要跟踪已到达的输入位置。

如果您发现使用n=4生成这些序列的规则,那么可能……如果序列完全是任意的,那么您必须在程序中的某个位置拥有它。计算机在运行时还不能读懂程序员的心思。即使在这种情况下,序列也会存储在程序员的头脑中。@EricPostpischil只有当他找到一个表示序列的函数(或每个n的一组函数)时,你所说的才是有效的,而对于一个完全任意的序列,这些函数最终可能会使用比硬编码序列本身更多的字节。