【问题标题】:Time complexity of the following program [duplicate]以下程序的时间复杂度[重复]
【发布时间】:2019-07-10 07:39:54
【问题描述】:

所以,基本上我想找到第二个数组中小于或等于第一个数组元素的所有元素。两个数组都已排序。我知道解决方案。我不想要那个。 我只想知道这个程序的时间复杂度以及我们将如何计算它。提前谢谢你。

int count=0;
        for(int i=0;i<n;i++)
            {
            for(int j=count;j<m;j++)
                {
                if(arr[i]>=arr[j])
                    //some O(1) code
                else
                    {
                    count=j;
                    break;
                    }
                }
            }

【问题讨论】:

  • 现在代码完全被破坏了;)它不会再运行了
  • 对不起,伙计。即使它正在运行,也没有。看看这个。
  • 现在,当它停在 i=j 时,count 将被设置为 i/rsp.ex (i+1)。所以内部循环做了一个比较。在)。它本质上是 if(arr[i]>=arr[i]) - 是相同的索引 i - 也就是说,对于每个元素,将元素与自身进行比较(重复在内部进一步运行,但随后将在下一次迭代:没有区别)。你可以通过一个循环来实现这一点

标签: java c++ algorithm time-complexity


【解决方案1】:

复杂性将是 O(n*m),因为n 的每个值的外部循环将运行m 次。

【讨论】:

  • 感谢您的回答,但我在发布问题时打错了字。你能帮我做这个新的吗?
【解决方案2】:

您的代码中只有一个数组。与您说有两个数组的解释相​​反。

假设有一个错字,应该有第二个数组:

最差:您可以在 O(n * m) 处建立一个上限。如果第二个中的所有元素都比第一个小,就会发生这种情况。

最佳:您可以在 O(n) 处建立下限。 如果第二个元素的所有元素都大于第一个元素(第一个元素打破循环),则会发生这种情况。

平均:如果你假设一个均匀分布,你会得到 O(n * m / 2) 的平均值。

结论这是一个 O(n²) 的联赛算法。

只有一个数组:

但是,如果我“按原样”使用代码 - 只有一个数组并且还考虑到它是排序的:

如果 arr1[i] i 的内部循环。 -> 内循环将在 j==i 处停止; -> O(n * m / 2) 的上限。仍然是 O(n²) 联盟。

倒序

所以 arr[i] j 成立:

它将跳过 j

但我想这是一个错字,你输入了两个数组,所以我跳过了用重复排序的情况(它又是 O(n*m),例如,如果所有元素都相同)。

【讨论】:

  • 感谢您的宝贵解释。但是我在发布问题时犯了一个错误。现在看看编辑,请帮助我。 :)
【解决方案3】:

O(n*m)- 因为你正在经历'n'个外部元素 对于每个外部元素,您都有一个包含 m 个元素的内部循环。 对于循环时间复杂度 - O(n)。基本上for循环会运行多少次。

【讨论】:

  • 感谢您的回答,但我在发布问题时打错了字。你能帮我做这个新的吗?
【解决方案4】:

复杂度:O(m*n)
作为其中涉及的两个 for 循环,它在不同的情况下可能会有所不同,但如果两者都被执行,它必须是 O(m*n)

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 2015-12-01
    • 2018-02-26
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多