【问题标题】:What's the Complexity when range varies?范围变化时的复杂性是多少?
【发布时间】:2015-10-06 18:25:28
【问题描述】:

如果你有这样的算法,复杂度是多少:

int get(const std::vector<unsigned int>& v, int N)
{
    int a = 0;
    for(int i = 0; i < N; ++i)
        for(int j = 0; j < v.size(); ++j)
            for(int k = 0; k < v[j]; ++k)
                a += k * v[j];
    return a;
}

除了缺少有用性之外,如果一个因素变化如此之大,您会在复杂性中投入什么?我的意思是,肯定是O(N * V * ?),当V = v.size(),但是然后呢?

【问题讨论】:

  • 你对v的元素范围有什么提示吗?如果没有进一步的上下文,这可能很难回答。当然它以std::numeric_limits&lt;int&gt;::max()为界
  • 不,可以是从零到std::numeric_limits&lt;unsigned int&gt;::max()的任何值

标签: c++ time-complexity complexity-theory


【解决方案1】:

复杂度是

O(N * V * std::numeric_limits<unsigned int>::max()) = O(N * V)

因为std::numeric_limits&lt;unsigned int&gt;::max() 是一个常数。

【讨论】:

  • 我不这么认为,您第一次发布的答案似乎更正确。那里并不总是最大 int,它是一个简单的用户输入,可能和那个一样高。所以V_max 似乎是有道理的
  • 您在 cmets 中写道:“不,可以是从零到 std::numeric_limits::max() 的任何值”
  • 是的,它可以,但不是必须的。最大元素甚至可能只是4
  • 是的,那么更精确的答案是O(N*V*V_max),但O(N*V) 仍然成立,因为V_max = O(1) 因为它受到unsigned ints 精度的限制。
  • 顺便说一句,如果你想把 C++ 技术放在一边,算法在 O(2^n) 时间运行,因为它以指数方式依赖于输入长度 (n)。
【解决方案2】:

这取决于V[j],如果v[j]=1,那么复杂度将为O(N*V),如果V[j]=N,那么复杂度将为O(N2, V)。

【讨论】:

  • 但这正是我问这个问题的原因。
【解决方案3】:

这个算法的复杂度是未知的。它类似于以下内容:

void foo(int arg) {
   int i = random() - arg;
   for (j = 0; j<i; ++j) 
        do_stuff();

无法评估此 foo() 的复杂性。

【讨论】:

    【解决方案4】:

    O(Nv.size() max(v)) ---> [O(N*v.size()*int.Max)]。 请注意您的代码可能是错误的,因为您没有收到任何异常 [try v[0] = int.Max]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 2011-09-29
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多