我不太清楚如何描述我的意思,所以让我试着通过例子解释(忍受我)。
当你只是递增一个整数时,你得到一个像这样的二进制序列(假设这个问题是8位):
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 1
0 0 0 0 0 1 1 0
0 0 0 0 0 1 1 1
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 1
0 0 0 0 1 0 1 0
0 0 0 0 1 0 1 1
0 0 0 0 1 1 0 0
0 0 0 0 1 1 0 1
0 0 0 0 1 1 1 0
0 0 0 0 1 1 1 1
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 1
0 0 0 1 0 0 1 0
0 0 0 1 0 0 1 1
0 0 0 1 0 1 0 0
0 0 0 1 0 1 0 1
0 0 0 1 0 1 1 0
0 0 0 1 0 1 1 1
0 0 0 1 1 0 0 0
0 0 0 1 1 0 0 1
0 0 0 1 1 0 1 0
0 0 0 1 1 0 1 1
0 0 0 1 1 1 0 0
0 0 0 1 1 1 0 1
0 0 0 1 1 1 1 0
0 0 0 1 1 1 1 1
[ ... etc ... ]
可视化的一种方法是每列代表一个“时钟”。每个时钟/列的频率是其右邻居的一半。
所以最右边的时钟有一个0
后跟一个1
等。下一个时钟有两个0
s后跟两个1
s等等。等......
我对二进制字符串序列很感兴趣,其中每个时钟都是其邻居的整数除法。
所以最右边的时钟仍然是一个0
,一个1
,下一个时钟仍然是两个0
s,两个1
s,但是第三个时钟是三个 0
和三个 1
等等。
而不是/1 /2 /4 /8 /16 ...
现在/1 /2 /3 /4 /5 ...
。
序列现在看起来像这样:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 1 1 1
0 0 0 0 1 1 0 0
0 0 0 1 1 1 0 1
0 0 1 1 1 0 1 0
0 1 1 1 1 0 1 1
1 1 1 1 0 0 0 0
1 1 1 1 0 1 0 1
1 1 1 0 0 1 1 0
1 1 1 0 0 1 1 1
1 1 0 0 1 0 0 0
1 1 0 0 1 0 0 1
1 0 0 0 1 0 1 0
1 0 0 1 1 1 1 1
0 0 0 1 0 1 0 0
0 0 0 1 0 1 0 1
0 0 1 1 0 0 1 0
0 0 1 1 0 0 1 1
[ ... etc ... ]
问题:是否有一个操作/算法可以在i
处给出i-1
处的值?
换句话说,让我说我是第4步(0 0 0 0 0 1 1 1
)。我是否可以对此数字执行某些操作以获取第5步(0 0 0 0 1 1 0 0
)的值,同样适用于任何其他步骤?
在除以2的情况下,你只需增加数字(i++
),但在除以N的情况下,我似乎无法找出从一个到另一个的类似方式。我错过了一些明显的东西吗?
我已经尝试将排序转换为十进制,但该模式为0, 1, 2, 7, 12, 29, 58, etc
,这对我来说并不突出。
我现在正在做的蛮力方式是我有一个计数器阵列(每个列/时钟一个),并且当达到相应列的“周期”时我独立地重置每个计数(所以2为第一列,第三列,等等。但这感觉很难看。
我喜欢直接在数字上执行此操作,而无需计数器阵列。这甚至可能吗?这是一个已知的序列吗?我甚至不确定谷歌要说实话。我很欣赏这方面的任何线索。我很乐意在一些指导下走下兔洞。
更新
根据@ borrible的观察,对于给定的i-1
,i
有多个值,所以事实证明我原来问题的解决方案是模棱两可的。因此,我将扩展我的问题以允许i
作为输入(除i-1
值之外。
答案 0 :(得分:4)
在不知道i
的情况下,如果该序列唯一地暗示i
(以比特序列的数量为模),则只能生成给定序列的后继。如果不是这种情况,则给定序列的后继是不明确的。
让我们考虑3位的前几个序列:
0 0 0
0 0 1
0 1 0
1 1 1
1 0 0
1 0 1
0 1 0
0 1 1
请注意,0 1 0
和1 1 1
同时取消0 1 1
;即它含糊不清。给定0 1 0
但不是i
,您无法推断出下一个序列。您可以在0 1 1 1
等的4位序列中看到类似的歧义......
换句话说,如果不知道i
,您的问题通常无法解决。
答案 1 :(得分:1)
此序列可被视为一组状态机,每个状态机都具有2,4,6,...,16
个状态。 2,4,6,...,16
的最小公倍数,即序列的长度,是1680.八位只允许我们表示256个值,所以即使我们被允许选择状态编码(我们也不是! ),我们无法唯一地识别所有可能的状态。
如果我们知道索引i
(或者,因为序列长度是1680,知道索引模1680就足够了),数字j
由(i mod (2 * j)) / j
给出。< / p>