【问题标题】:Algorithmic complexity O(n*log(n))- Do we need to divide by 2? [duplicate]算法复杂度 O(n*log(n))- 我们需要除以 2 吗? [复制]
【发布时间】:2018-05-13 18:07:31
【问题描述】:

在 O(n log(n)) 的许多定义中,我通常认为子问题必须是原始问题大小除以 2 的要求。但是,特别是,我已经看到 O(log(n)) 只需要是减小大小的问题。

我们是否一定需要将问题分成两半才能得到nlog(n)的问题?

或者它可能仅仅是一个还原问题?像这样:

for (i = 0; i < A.length(); i++)
{
    for (j = i; j < A.length(); j++)
    {
        //do something
    }
}

这样的东西也可以归类为 n(log(n)) 吗?还是更接近O(n^2)?

【问题讨论】:

  • 那个循环在我看来是 O(N^2)。
  • 这有点像我想的。谢谢! @juanpa.arrivillaga

标签: algorithm time-complexity complexity-theory analysis


【解决方案1】:

除以任何其他常数也会给你 log(n) 复杂度。那是因为您可以转换对数基数,而当您对 Big-O 感兴趣时,常数就会消失。

http://www.purplemath.com/modules/logrules5.htm

你会注意到分母是一个常数。

【讨论】:

  • 那么,它必须是某种形式的除法,我们不能每次都将它缩小一个恒定的大小?
  • “某种形式的划分”是什么意思?
  • 将它减少一个常数会给你一个线性复杂度。想一想,如果你必须走两倍于某个参考点的距离,你就需要两倍的步数。如果你可以在那里跳跃一些比例,那么如果你增加它,你就需要更多的反比例。
  • @Carlos 所以,如果我只是线性地减少问题(即每次迭代删除一项),问题将变成 n^2 而不是 n log n,因为在算法分析中我们删除了常量,所以这在技术上仍然是 n,即使它是 O(n-10) (或其他东西)。我现在明白了。谢谢!
【解决方案2】:

显示的代码是O(n^2)

外循环确定内循环的迭代次数。 N + N-1 + N-2 + N-3 + ... + 1 = O(n^2)

为了得到 log(n) 的复杂度,在每次迭代中你需要去掉 cn 元素。在哪里0&lt;c&lt;1

【讨论】:

    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多