【问题标题】:What's complexity of this algorithm?这个算法的复杂度是多少?
【发布时间】:2023-03-07 20:32:01
【问题描述】:

我正在学习如何找到算法的复杂性,但我不知道这个算法的复杂性是什么。有人可以向我解释如何得到答案吗?

void algorithm(int a, int b) {
    while (a >= b) {
        int x = a - b;
        for (int i = 0; i <= x; i++) {
            std::cout << "complexity of this algorithm?";
        }
        a = x;
    }
}

欢迎任何意见。这是我目前所拥有的:

【问题讨论】:

  • 您在问题中考虑的场景是什么?最好的时间?平均的?最差?
  • 最好的和最坏的,如果有最好的......我不确定最好的情况是否会不同于最坏的情况。

标签: algorithm code-complexity


【解决方案1】:

a 被修改了,你应该在 sum 的参数中有它:

(1) x = a - b  // first iteration
(2) x = a - 2b // second iteration
(3) x = a - 3b
...

如果a = k * b,外循环迭代k 次。因此,最终的复杂度是:

(a - b) + (a - 2b) + ... + (a - (k-1) b) = 
(k-1) b + (k-2) b + ... + b = k * (k-1) * b/2

正如你所提到的 , 时间复杂度为 .

【讨论】:

  • @UweJ,您意识到这实际上与此处给出的复杂性相同吗?只有 OmG 更精确一些。 (在复杂性中,我们通常不关心天花板/地板等,但在这种情况下,如果 ab一起增长,那么即使在复杂性理论中,天花板仍然相关)。跨度>
【解决方案2】:

复杂度为 (a^2/b)

正如我在图片中描述的,你需要总结所有的“x”,然后你就会得到复杂度。

in summation part for (-b -2b -3b - ... -nb) you can write :
[![enter image description here][1]][1]-b (1+2+...)
so this is -b*(n(n+1)/2)

summation_part_definition_link

所以最后,如果“a”和“b”的顺序相同,那么结果是:

O(c) = 0(c 是数字)

这意味着复杂性按数字顺序排列。但如果“a”是高阶,那么结果是:

O((a^2)/b)

【讨论】:

  • @ItsNotMyFault 你不同意这个解决方案吗?
  • 我不明白你总结的大部分简化,因为我不知道答案,所以我不能真正同意任何事情。您在这里使用哪个求和规则? (我不明白你对总和的表示)习是某种替代品吗?
  • @ItsNotMyFault 再次检查此链接和我的编辑。 link
  • 当我简化 sommation 时(你有相同的 sommation,但我用 : (a - bi + 1) => 替换你的 Xi ,这是我的内在 sommation 的结果。我的内在sommation 是(因为 OmG,他说既然 a 发生了变化,它应该在总和的参数中): sum_j=0^(a - jb) 1 然后我得到 (a^2)/b + a/2 + a/b。但由于最大规则,我同意您的复杂性结果。
猜你喜欢
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多