【问题标题】:Is the overall time complexity of an algorithm effected if it calls another algorithm to perform its functionality?如果一个算法调用另一个算法来执行它的功能,它的整体时间复杂度是否会受到影响?
【发布时间】:2018-11-07 09:25:53
【问题描述】:

我正在尝试设计一种具有 O(1) 时间复杂度的算法,它从数组中返回一个 不是 最小值的值。我知道搜索数组并比较它的元素以找到最小的将使算法 O(n),所以这不起作用。

如果我编写一个单独的方法,使用排序算法先对数组进行排序,然后返回最小的,这会影响算法的时间复杂度吗?

这是我的代码:

private static int nonSmallestElement(int[] array) {
    int smallest = smallestElement(array);
    int index = (int) (array.length * Math.random());
    System.out.println("Index = " + index);
    for (int i = index; i < array.length; i++) {
        if (array[i] != smallest) {
            return array[i];
        }
    }
    return array[1];
}

private static int smallestElement(int[] array) {
    Arrays.sort(array);
    return array[0];
}

这里Arrays.sort() 方法使用的是双轴快速排序算法,即 O(n log(n))。现在这是否意味着 nonSmallestElement() 方法也具有该时间复杂度,或者它是 O(1),因为它不必处理排序?

【问题讨论】:

  • 你必须算排序,否则你作弊。但是为什么还要对数组进行排序呢?我以为你想返回一个 NOT 最小的元素。
  • 嗨。为了确保我没有返回最小值,我必须知道最小值是什么,不是吗?然后进行比较以返回任何其他值!= minimum
  • 这里有一个提示:如果你手头有两个不同的值,那么较大的不能是数组中的最小值。对于“典型”数组,您希望在任意两个元素中找到两个不同的值。
  • @JamesKPolk 我相信我和你在一起。这样我就可以比较任何两个元素并返回更大的那个。干杯
  • @PumpkinBreath - 如果你可以有不明确(相等)的值,那么你可能需要查看超过 2 个。

标签: java algorithm big-o


【解决方案1】:

你是对的,你需要计算所有动作来计算算法的复杂性。但是您应该了解规则,例如较大的包含较小的 (more examples)。在您的情况下,您调用 smallestElement() 一次 - O(nlogn),然后有一个循环 O(n)。因此,整体复杂度将为 O(n + nlogn)。但是nonSmallestElement()最终复杂度是 O(nlogn),因为 nlogn 更大。

另一方面,不可能有比 O(n) 更好的算法来返回非最小值。因为您需要至少遍历所有元素一次才能找到最小值。异常可以是排序数组。


来自 cmets 的更新:

这里有一个提示:如果你手头有两个不同的值,那么 较大的一个不能是数组中的最小值。为一个 您希望在任意两个中找到两个不同值的“典型”数组 元素。 @詹姆斯·K·波尔克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2016-02-08
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多