python 之格雷码

格雷码 Gray code

一个 n 位二进制的格雷码就是一个包含 2**n 种不同情况的列表,
每一种情况的 n 位二进制数与其上一种情况的 n 位二进制数正好有一位不同
n 位二进制的格雷码生成方式如下:
    1.  n 位格雷码的 前 2**(n-1) 个代码字等于 n-1 位格雷码的代码字,按顺序书写,加前缀 0

    2. n 位格雷码的 后 2**(n-1) 个代码字等于 n-1 位格雷码的代码字,按逆序书写,加前缀 1

使用递归实现:

def gray_code(n):                                   # 递归,代码简单,速度较应用序慢
    if n == 1: return ['0','1']
    return ['0'+i for i in gray_code(n-1)] + ['1'+i for i in gray_code(n-1)[::-1]]

使用循环顺序实现:

def gray_code_for_2(n):                                 # 循环顺序实现,速度优势
    list = ['0', '1']
    for i in range(1,n):
        left  = ['0'+i for i in list]
        right = ['1'+i for i in list[::-1]]
        list = left + right
    return list

再来一个垃圾写法 ^-^

def gray_code_for(n):                                   # 菜鸡写法
    list = [False for i in range(2**n)]
    list[0] = '0'
    list[1] = '1'
    lst = list[:]
    for i in range(2, n+1):
        for j in range(2**(i-1)):
            list[j] = '0'+lst[j]
            list[j+2**(i-1)] = '1'+lst[:2**(i-1)][::-1][j]
        lst = list[:]
    return list

运行速度测试

import time


def main(n):
    a = time.perf_counter()
    gray_code(n)
    b = time.perf_counter()
    gray_code_for(n)
    c = time.perf_counter()
    gray_code_for_2(n)
    d = time.perf_counter()
    print(b-a, c-b, d-c)        # 递归时间  垃圾时间  应用序时间


if __name__ == '__main__':
    main(10)    # >>> 0.001174527398641972  0.002195796209085674  0.0001979732319710389
    main(17)    # >>> 0.23723541986879834   46.98887458702955     0.02618878659134083

发布了12 篇原创文章 · 获赞 4 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览