【发布时间】:2015-08-11 17:34:35
【问题描述】:
对于通信系统,我需要一种特殊的格雷码。 要求是:
- 两个连续的值只有一位不同,就像所有的格雷码一样。
- 同一位上的两个转换至少应远离某个任意数量的值。这个距离被记录为最小运行长度。
- 我不关心从最后一个代码到第一个代码的距离,代码翻转时对mrl没有限制。
这种格雷码的一个例子是,对于 5 位和 mrl = 4:
01111000011110000111100001111000
00111100000011111100001111110000
00011110000111100001111000011110
00001111110000111111000000111100
00000000111111110000000011111111
This paper 给出不同位数的最佳 mrl 值。但是,这些值是“通过使用详尽的计算机搜索”找到的
我的 Python 代码可以很好地处理少量位数,最多 6 个:
N = 5 # number of bit
mrl = 4 # minimum run length
first_transition = [0]
first_code = [0]
def Recur(previous_transitions, previous_codes):
if len(previous_codes) == (2**N):
for b in xrange(N):
print ''.join([str((code >> (N-b-1)) & 1) for code in previous_codes])
print
return
new_transition_list = range(N)
for new_transition in new_transition_list:
ok = True
for i in xrange(mrl-1): #look back for transitions that are too close
try:
if new_transition == previous_transitions[-1-i]:
ok = False
break
except: break
if ok:
new_code = previous_codes[-1] ^ 2**new_transition #look back for repeated code
if not (new_code in previous_codes):
Recur(previous_transitions+[new_transition], previous_codes+[new_code])
Recur(first_transition, first_code )
raw_input('[end]')
我的问题是我想要一个 20 位的代码,而基本方法的复杂性似乎接近 O(n^3)。有关如何改进此代码的任何建议?有更好的方法吗?
【问题讨论】:
-
balanced gray codes 似乎很有用——如果转换在所有位之间均匀分布,则您最有可能最大化任何给定位的最小转换距离。
-
你想要格雷码是字符串还是整数?
-
@hobbs 长期格雷码可能是平衡的,但我不确定是否相反。 Wikipedia 示例的 mrl 为 2,这是最坏的结果。您是否建议生成(或获取一个表格)平衡格雷码并检查它们中的每一个?
-
@CommuSoft 您的意思是输出格式还是 n 元格雷码?我需要二进制格雷码,任何输出格式。
-
@pserra 我想知道 math.se 或 cs.se 是否更适合这个问题。
标签: python combinatorics gray-code