首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >灰色代码是否存在于两个以外的其他基础上?

灰色代码是否存在于两个以外的其他基础上?
EN

Stack Overflow用户
提问于 2010-10-01 09:39:44
回答 2查看 1.5K关注 0票数 6

只是好奇的问题,灰度码是为基础2以外的基础定义的吗?

我试着在基数3中计数,每次只写一个注意改变的连续值。我已经能够枚举到26 (3**3-1)的所有值,而且它似乎是有效的。

代码语言:javascript
复制
        000              122              200
        001              121              201
        002              120              202
        012              110              212
        011              111              211
        010              112              210
        020              102              220
        021              101              221
        022              100              222

我能看到的唯一问题是,当循环回到零的时候,所有的三个都改变了。但这只适用于奇数基数。当使用偶数基时,循环回零只会改变一个数字,就像二进制一样。

我甚至认为它可以扩展到其他的基数,甚至十进制。这可能导致另一种排序,当计数基数为10. :-)

代码语言:javascript
复制
    0  1  2  3  4  5  6  7  8  9 19 18 17 16 15 14 13 12 11 10
   20 21 22 23 24 25 26 27 28 29 39 38 37 36 35 34 33 32 31 30

现在的问题是,有人听说过吗?有申请吗?还是只是数学上的狂热?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-01 09:43:22

是。看看维基百科的灰色编码项目。它有一个关于N进制灰色码的章节。

除了二元反射的格雷码外,还有许多特殊类型的灰色码.其中一种类型的灰色代码是n进制格雷码__,也称为非布尔格雷码__。顾名思义,这种类型的Gray代码在编码中使用非布尔值。

票数 10
EN

Stack Overflow用户

发布于 2010-10-01 10:02:58

为了完整起见( aioobe已经给出了正确的答案),这里有一个C++程序,它列出了以00开头的所有168个2位数字的灰色代码,并标记了96个循环的灰色代码。使用维基百科的算法,您可以很容易地构造更长的灰色码的偶数基。对于不均匀的基础,您可以更改程序,以生成灰色代码。

在这个程序中找到的第一个循环的2位数字的灰色代码是:

代码语言:javascript
复制
00 01 02 12 10 11 21 22 20

更改程序后,发现的第一个循环的3位数字灰度如下:

代码语言:javascript
复制
000 001 002 012 010 011 021 020 022 122 102 100 101 111
110 112 212 202 222 220 120 121 221 201 211 210 200

代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

// Highest number using two trits
#define MAXN 9

int gray_code_count, cyclic_count;

bool changes_one_trit(int code1, int code2) {
  int trits_changed = 0;
  if ((code1 / 3) != (code2 / 3)) trits_changed++;
  if ((code1 % 3) != (code2 % 3)) trits_changed++;
  return (trits_changed == 1);
}

int generate_gray_code(int* code, int depth) {
  bool already_used;

  if (depth == MAXN) {
    for (int i = 0; i < MAXN; i++) {
      printf("%i%i ", code[i]/3, code[i]%3);
    }
    // check if cyclic
    if (changes_one_trit(code[MAXN-1], 0)) {
      printf("cyclic");
      cyclic_count++;
    }
    printf("\n");
    gray_code_count++;    
  }

  // Iterate through the codes that only change one trit
  for (int i = 0; i < MAXN; i++) {
    // Check if it was used already
    already_used = false;
    for (int j = 0; j < depth; j++) {
      if (code[j] == i) already_used = true;
    }
    if (already_used) continue;

    if (changes_one_trit(code[depth-1], i)) {
      code[depth] = i;
      generate_gray_code(code, depth + 1);
    }
  }
}

int main() {
  int* code = (int*)malloc(MAXN * sizeof(int));
  code[0] = 0;
  gray_code_count = 0;
  generate_gray_code(code, 1);
  printf("%i gray codes found, %i of them are cyclic\n", gray_code_count, cyclic_count);
  free(code);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3838014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档