【问题标题】:Divide-by-N binary clock sequence algorithm?除以 N 二进制时钟序列算法?
【发布时间】:2016-10-20 22:36:56
【问题描述】:

我不太清楚如何描述我的意思,所以让我试着举例说明(请耐心等待)。

当你简单地增加一个整数时,你会得到一个像这样的二进制序列(假设这个问题是 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,等等。下一个时钟有两个0s,然后是两个1s,等等......

我对二进制字符串序列感兴趣,其中每个时钟都是其邻居的整数除法。

所以最右边的时钟仍然是一个0,一个1,下一个时钟仍然是两个0s,两个1s,但是第三个时钟是三个 0s 和 三个 1s 等

现在是 /1 /2 /3 /4 /5 ...,而不是 /1 /2 /4 /8 /16 ...

序列现在看起来像这样:

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-1 的值的情况下,是否有一种操作/算法可以给我i 的值?

换句话说,假设我处于第 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 的观察,对于给定的ii-1 的值不止一个,因此我原来的问题的解决方案是模棱两可的。因此,我将扩展我的问题以允许 i 作为输入(除了 i-1th 值。

【问题讨论】:

  • 不知道这是否有帮助,但这里列出了序列:oeis.org/A175879
  • 你可以从它的索引中简单地计算出这样一个数字中的每一位,这足够了吗?也许你也可以从一个数字中计算一个索引并以这种方式递增..
  • 我有一种奇怪的感觉,在给定 i-1 的情况下,您确实找不到数字 i,但是您可以通过将 2 (1, 2, 4, 8 ...) 对每个二进制数字使用模 1,2,3,4...。
  • 查看我的更新答案。

标签: c algorithm binary computer-science clock


【解决方案1】:

在不知道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 10 1 1 继承;即它是模棱两可的。给定0 1 0 而不是i,您无法推断出下一个序列。您可以在 0 1 1 1 等的 4 位序列中看到类似的歧义...

换句话说,在不知道i 的情况下,您的问题通常无法解决。

【讨论】:

  • 啊,这是个好电话。我已经更新了我的问题以允许 i 作为输入值。
【解决方案2】:

这个序列可以看作是一组状态机,每个状态机都有2,4,6,...,16 个状态。 2,4,6,...,16 的最小公倍数,即序列的长度,是 1680。八位只能表示 256 个值,所以即使我们被允许选择状态编码(我们不是!),我们也不会'不能唯一标识所有可能的状态。

如果我们知道索引i(或者,因为序列长度为1680,知道索引模1680就足够了),数字j(i mod (2 * j)) / j给出。

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 2013-10-31
    • 2020-03-19
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多