除以N二进制时钟序列算法?

时间:2016-06-19 16:43:27

标签: c algorithm binary computer-science clock

我不太清楚如何描述我的意思,所以让我试着通过例子解释(忍受我)。

当你只是递增一个整数时,你得到一个像这样的二进制序列(假设这个问题是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-1i有多个值,所以事实证明我原来问题的解决方案是模棱两可的。因此,我将扩展我的问题以允许i作为输入(除i-1值之外。

2 个答案:

答案 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 01 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>