【问题标题】:Designing A Constant-Time Algorithm For A Function为函数设计恒定时间算法
【发布时间】:2017-08-16 18:36:40
【问题描述】:

这个问题刚刚在我脑海中浮现:

函数G(m)定义如下:

a) 如果 m

b) 如果 m > 100 则 G(m) = m – 10

根据上面的问题,如何设计一个计算G(m)的常数时间算法?

【问题讨论】:

  • 也许是动态规划?将 m = 1 到 100 的结果存储在一个数组中。因此,计算 G(m 100) 永远是常数时间。
  • m 可以是负数还是零?
  • 我们不应该为你做作业。但是我会给你一个非常重要的提示,你可以使用基本的算术和离散推理来假设对于 m + ((floor((101 - m)/11) + 1) * 11) - 10 而不需要任何迭代。因为另一种情况也是 O(1) 操作,所以您最多得到 O(1)。 Edit2:错误太多。那里。固定
  • 我其实没想到你会完成我的作业。我只是想向我解释实际被问到的问题。编辑:即使有迭代,时间复杂度仍然是 O(1),因为循环将运行有限的时间。这是正确的吗?
  • @MananTyagi:它为m 的所有值形成了一个AP。当我简化时,它都以 91 结束。无论m 的值是多少,最终都会以 G(101) 结束,并且计算结果为 91。因此,G(m) = 91 对于@ 的所有值987654326@这里。

标签: algorithm constant-time


【解决方案1】:

假设m 适合一个整数变量,显然可以在恒定时间内计算 (b) 部分。

问题要求证明的棘手部分是 (a) 部分是恒定的。然后是O(1) 时间。这可以使用数学归纳法或其他方式来完成。

归纳证明如下。

首先观察G(101) 的定义等于 101 - 10 = 91。

对于90 <= n <= 100,它拥有G(n) = G(G(n + 11)),其中n + 11 > 100。所以G(n)等于G(n + 11 - 10) = G(n+1),也就是91。

由此可见,G(91 - 1) = 91G(91 - (1 - 1)) = 91、...、G(91 - (1 - 10)) = 91 这十个等式都是正确的。这是一般归纳的基础。

归纳步骤:假设 G(91 - i) = 91G(91 - (i - 1)) = 91、...、G(91 - (i - 10)) = 91 对于从 1 到某个界限的所有数字 i 都为真。

然后G(91 - (i + 1)) = G(G(91 - i - 1 + 11)) = G(G(91 - (i - 10)))。从基本步骤,我们知道G(91 - (i - 10)) = 91。将其代入上面的等式,我们得到G(91),它也已知为 91。由此可以得出,i+1 的假设也是正确的。

因此,对于所有 n >= 1G(91 - n) 等于 91。归纳证明。

在 Python 中计算G 的恒定时间算法示例:

def G(m):
   if m > 100:
      return m - 10
   else:
      return 91

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2014-12-18
    • 1970-01-01
    相关资源
    最近更新 更多