【问题标题】:How to calculate time and space complexity from a pseudocode?如何从伪代码计算时间和空间复杂度?
【发布时间】:2012-09-18 19:12:53
【问题描述】:

我被要求确定使用简单算法的时间和空间复杂性。问题是我不完全了解这些数字的来源。从示例中我们得到它把加法、减法、除法和乘法计算为基本操作。

在这里,我发布了我的算法的伪代码,它使用我们提供的公式计算标准偏差。

我看到了 2 * (n - 1) 个加法符号、1 个除法符号、2 个乘法符号和 1 个减法符号。

对于时间复杂度,我还必须在这里计算什么?以及如何处理空间复杂度?

// X is passed array, and N is number of elements in array.
Algorithm calculateStandardDeviation(X, N)
{
    private double arraySum;
    private double arrayMean;
    private double xi2;
    private double standardDeviation;

    foreach (arrayValue in X)
    {
        arraySum = arraySum + arrayValue;
    }

    arrayMean = sum / N;

    foreach (arrayValue in X)
    {
        xi2 = xi2 + Math.Pow(arrayValue, 2);
    }

    standardDeviation = Math. Sqrt(((1/N) * () * xi2) - Math.Pow(arrayMean, 2));

    return standardDeviation;
}

【问题讨论】:

  • 查看for 循环,尤其是它们的嵌套深度。

标签: time-complexity pseudocode mathematical-optimization


【解决方案1】:

具有讽刺意味的是,算法复杂性可以随心所欲地通用或复杂。如果您正在努力实现大 O(...) 符号复杂性 - 这是计算机科学的规范 - @david robinson 对于您当前的情况是正确的。

for 循环通常会增加 N 时间复杂度的维度 - 其中 N 是循环包含的运行次数。您所做的所有其他事情都在 O(1)“恒定”时间内运行(并不意味着与另一个 O(1) 时间操作花费相同的物理时间)。因此,您的时间复杂度是所有​​操作的线性相加或 O(N + N + 1 + 1+...) = O(2N)。我相信你在课堂上学到了这个,减少到 O(N)。时间复杂度。

现在对于空间复杂性 - 同样的事情。随着输入大小的增长,任何东西都会增长吗?那将是肯定的 - 随着您向数组中添加更多元素,您的数组会增长。因此它也增长为 O(N)。您还有其他恒定的空间因子,但我们放弃了它,给您

线性 - O(N) - 时间和空间复杂度。

【讨论】:

  • 但是你会说随着X 增长两倍大,其元素总和占用的空间会增长相同的因子吗?我认为这是不对的。
  • 不,我不会,这实际上达到了 2/4/8 字节的峰值,具体取决于您存储它的大小。我只看了他的代码,我错过了什么吗?
  • 好的,请仔细阅读,仍然坚持这一点 - 数组大小会根据您的输入增长而增长。所有其他因素的大小保持相对恒定。
  • 由于某种原因,我认为 xi2 的空间复杂度是非线性的,因为每次迭代都会添加 arrayValue^2 术语。我在 Python 中针对X 对其进行了测试,范围从[0][0...10000],空间复杂度似乎是线性的:i.imgur.com/vxo2v.png
  • 啊,不,不幸的是 xi2 存储在“双”中,因此在空间方面受到操作系统的限制。不过,您的实证结果显示出出色的侦探工作,您想编辑我的答案并将其添加进去吗?
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2018-03-16
  • 2011-10-04
  • 1970-01-01
  • 2019-09-27
相关资源
最近更新 更多