【问题标题】:Returns the largest n such that R[n] = S返回最大的 n 使得 R[n] = S
【发布时间】:2015-09-11 21:51:00
【问题描述】:

写一个函数 answer(str_S) ,给定 base-10 字符串 整数 S 的表示,返回最大的 n 使得 R(n) = S. 以 base-10 表示形式将答案作为字符串返回。如果有 没有这样的 n,返回“无”。 S 将是一个不大于的正整数 超过 10^25。

其中 R(n) 是时间 n 时的僵尸数量:

R(0) = 1
R(1) = 1
R(2) = 2
R(2n) = R(n) + R(n + 1) + n (for n > 1)
R(2n + 1) = R(n - 1) + R(n) + 1 (for n >= 1)

Test cases
==========

Inputs:
    (string) str_S = "7"
Output:
    (string) "4"

Inputs:
    (string) str_S = "100"
Output:
    (string) "None"

我下面的程序是正确的,但它不可扩展,因为这里 S 的范围可以是一个非常大的数字,例如 10^24。任何人都可以帮助我提出一些建议以进一步改进代码,以便它可以涵盖任何输入案例。

def answer(str_S):

    d = {0: 1, 1: 1, 2: 2}
    str_S = int(str_S)
    i = 1
    while True:

        if i > 1:
            d[i*2] = d[i] + d[i+1] + i
            if d[i*2] == str_S:
                return i*2
            elif d[i*2] > str_S:
                return None

        if i>=1:
            d[i*2+1] = d[i-1] + d[i] + 1
            if d[i*2+1] == str_S:
                return i*2 + 1
            elif d[i*2+1] > str_S:
                return None

        i += 1

print answer('7')

【问题讨论】:

标签: python memory out-of-memory scalability space-complexity


【解决方案1】:

首先,您在缩放方面遇到了哪些问题?我在一个 30 位数字上运行了您的代码,它似乎可以完成。你有内存限制吗? Python 可以处理任意大的整数,尽管非常大的整数会被转换为数字算术模式。

鉴于 R 值的密度,我怀疑如果您切换到直数组,可以节省空间和时间:使用该值作为数组索引而不是 dict 键。

【讨论】:

  • 我用 20 位数字运行了这个程序,但我的电脑挂了 :D。无论如何,这是一个编码竞赛问题,我正在那里运行。引发内存错误
  • 程序应该涵盖所有情况,不幸的是,由于字典数据结构,这占用了两个很大的内存。
  • 我觉得很奇怪,比赛允许你向其他人寻求帮助。解释一下?
  • 我不是参加比赛,而是为了好玩和学习而解决问题。任何人都可以访问他们的问题集并在他们的平台上运行。
  • 好多了;谢谢。如果您的内存有限,那么您将无法维护任意数量的参考数据;您将不得不根据需要重新计算它。您目前保持 N 个条目的顺序来计算 answer(N)。但是,定义的计算深度是 log2(N)。我相信你需要牺牲计算时间来换取内存:编写一个递归例程来计算 R(N)。请注意,R(N) 与 N 的值具有一般关系;如果你能表征这一点,你可以减少你尝试的 N 值的范围。这有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2019-10-21
  • 2017-11-18
相关资源
最近更新 更多