首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fibonacci前缀码

Fibonacci前缀码
EN

Code Review用户
提问于 2019-01-08 13:06:14
回答 1查看 124关注 0票数 1

这件事有点牵扯。是否有更简单的方法在基本python中实现这个前缀代码,我现有的代码在下面,但是任何修改或审查的帮助都是有帮助的。

代码语言:javascript
复制
# Lagged fibonacci numbers the sequence starts: 1,2,3,5,8,11
def fibonacci(n):
    a = 1
    b = 1
    out = []
    for i in range(n):
        out.append(a)
        a,b = a+b,a
    return out

# There has to be a better way to do this, right?
# Go through the list for the first few fibonacci numbers from greatest to
# make a list of fibonacci numbers that add up to each code number (1,2,3...)
# The code is then the indexes of those fibonacci numbers, with leading zeroes
# removed, reversed, with an additional "1" at the end.
def makeCodebook(decode=False):
    F = fibonacci(10)
    F.reverse()
    codes = []
    for x in range(1,27):
        while x != 0:
            code = []
            for f in F:
                if f <= x:
                    code.append("1")
                    x = x-f
                else:
                    code.append("0")

            while code[0] == "0":

                code.pop(0)
            code.reverse()
            code.append("1")
            codes.append("".join(code))

    # Matchup codes with letters
    D = {}
    alpha = "ETAOINSRHLDCUMFPGWYBVKXJQZ"
    if decode == False:
        for a,b in zip(alpha,codes):
            D[a] = b

    if decode == True:
        for a,b in zip(alpha,codes):
            D[b] = a
    return D

def prefixCode(text,decode=False):

    # Build the codebook
    D = makeCodebook(decode=decode)

    # When encoding we simply translate each letter to its code
    if decode == False:
        out = []
        for letter in text:
            out.append(D[letter])
        return "".join(out)
EN

回答 1

Code Review用户

发布于 2019-01-08 22:37:45

您的fibonacci不需要变量about已经在跟踪它们。

代码语言:javascript
复制
def fibonacci(n):
    out = [1,2]
    for i in range(n-2):
        out.append(out[i]+out[i+1])
    return out

您应该同时构建编码和编码代码本,这样您就不必运行相同的函数两次才能得到这两种代码。

您可以在找到代码时构建代码本:

代码语言:javascript
复制
def makeCodebook():
    alpha = "ETAOINSRHLDCUMFPGWYBVKXJQZ"
    F = fibonacci(10)
    F.reverse()
    D = {}
    E = {}
    for x,letter in enumerate(alpha,1):
        while x != 0:
            code = []
            for f in F:
                if f <= x:
                    code.append("1")
                    x = x-f
                else:
                    code.append("0")

            while code[0] == "0":

                code.pop(0)
            code.reverse()
            code.append("1")
        D[code] = letter
        E[letter] = code
    return D,E

注意,这消除了保留codes列表的需要。

那你就可以

代码语言:javascript
复制
def prefixCode(text,decode=False):
     D, E = makeCodebook(decode=decode)
     if not decode:
          return "".join([E[letter] for letter in text])
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/211098

复制
相关文章

相似问题

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