【问题标题】:Nested Polynomial-Time functions嵌套多项式时间函数
【发布时间】:2013-04-26 17:21:01
【问题描述】:

如果我将多项式时间子程序运行多项式次数,有哪些示例可以在指数时间内完成此操作?

"表明对多项式时间子例程的多项式调用可能 导致指数时间算法。” - 硬件问题

【问题讨论】:

  • 你确定至少存在一个例子吗?
  • 希望如此,否则我在这个硬件任务上得到-10%
  • 如何定义多项式时间子程序?也许问题的某个地方涉及到一个技巧。
  • 你能找到诀窍吗?

标签: algorithm complexity-theory polynomial-math


【解决方案1】:

好吧,如果我们将此视为一个“肮脏的把戏”问题:

def g(a):
    b = 0
    for i in range(a * 2):
        b += 1
    return b

def f(x):
    a = 1
    for i in range(x):
        a = g(a)

g(a) 在 O(a) 中运行,f(x) 在调用 g 之前运行 O(x) 次,但总体而言是 O(2 ^ n)

【讨论】:

  • O(a) 不是多项式。就像 O(NV) 的背包问题,但它不是多项式。
  • g 绝对是关于其输入参数的多项式,但是是的,这是一个技巧解决方案,可能是错误的。
  • 复杂度是通过输入长度来衡量的。输入一个只需要 log(a) 位。因此,长度为 la 的输入将花费 O(2^la)。这是指数级的。
  • 一个简单的for循环是指数的?这对我来说是新事物。我猜你的计算模型与我的不同。您的模型意味着 polylog=poly。
  • Sure.Knapsack 问题只是两个简单的循环,但它是 NP-Hard。我不知道你心中的计算模型是什么。至于我,我读了 Sipser 写的书,这就是我所知道的关于计算理论的全部内容。
【解决方案2】:

你的问题有点混乱。但是,如果您将多项式时间子例程运行多项式次数,您将永远不会得到指数时间函数。在运行多项式时间子例程多项式次数后,您仍将获得多项式时间运行时间复杂度。

例如,如果您运行具有 n2 复杂度的子例程 n3 次结果算法将有 n5 的运行时间复杂度,这仍然是一个多项式时间算法。

【讨论】:

  • 多项式乘以多项式仍然是多项式。所以你永远不会得到指数算法,除非问题中有一些额外的条件。
【解决方案3】:

f(a) = 2^a

g(b) = sum=0;对于 (i = 1..b) sum=sum+i

f(a) 是 O(n)

g(b) 是 O(n)

g(f(a)) 是指数的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-02
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多