只是好奇的问题,灰度码是为基础2以外的基础定义的吗?
我试着在基数3中计数,每次只写一个注意改变的连续值。我已经能够枚举到26 (3**3-1)的所有值,而且它似乎是有效的。
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. :-)
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现在的问题是,有人听说过吗?有申请吗?还是只是数学上的狂热?
发布于 2010-10-01 09:43:22
是。看看维基百科的灰色编码项目。它有一个关于N进制灰色码的章节。
除了二元反射的格雷码外,还有许多特殊类型的灰色码.其中一种类型的灰色代码是n进制格雷码__,也称为非布尔格雷码__。顾名思义,这种类型的Gray代码在编码中使用非布尔值。
发布于 2010-10-01 10:02:58
为了完整起见( aioobe已经给出了正确的答案),这里有一个C++程序,它列出了以00开头的所有168个2位数字的灰色代码,并标记了96个循环的灰色代码。使用维基百科的算法,您可以很容易地构造更长的灰色码的偶数基。对于不均匀的基础,您可以更改程序,以生成灰色代码。
在这个程序中找到的第一个循环的2位数字的灰色代码是:
00 01 02 12 10 11 21 22 20更改程序后,发现的第一个循环的3位数字灰度如下:
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代码:
#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);
}https://stackoverflow.com/questions/3838014
复制相似问题