对于通信系统,我需要一种特殊的格雷码。要求是:
- 像所有格雷码一样,两个连续的值只有一位不同。
- 同一位上的两个转换应该至少远离一些任意数量的值。这个距离被记录为最小运行长度的mrl。
- 我不关心从最后一个代码到第一个代码的距离,代码翻转时对 mrl 没有限制。
这种格雷码的一个例子是,对于 5 位和 mrl = 4:
01111000011110000111100001111000
00111100000011111100001111110000
00011110000111100001111000011110
00001111110000111111000000111100
00000000111111110000000011111111
本文给出了不同位数的最佳 mrl 值。但是,这些值是“通过使用详尽的计算机搜索”找到的
我有适用于少量位数(最多 6 位)的 python 代码:
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)。有关如何改进此代码的任何建议?有更好的方法吗?