【问题标题】:Time complexity of algorithms in javajava中算法的时间复杂度
【发布时间】:2012-02-25 10:10:06
【问题描述】:

您好,我正在使用以下通用冒泡排序算法,我想显示时间复杂度。我知道这个算法的最佳/最坏情况是固定的,但我想知道,它可以特定于我的数组吗?

例如,这种排序的最坏情况是O(n^2),这可以特定于我的数组吗?

例如,最坏的情况可能是对 120 个元素中的 100 个进行排序(这就是我所说的特定于我的数组的意思)。

public static <E extends Comparable<? super E>> void bubbleSort(E[] comparable) {
    boolean changed = false;
    do {
        changed = false;
        for (int a = 0; a < comparable.length - 1; a++) {
            if (comparable[a].compareTo(comparable[a + 1]) > 0) {
                E tmp = comparable[a];
                comparable[a] = comparable[a + 1];
                comparable[a + 1] = tmp;
                changed = true;
            }
        }
    } while (changed);
}

【问题讨论】:

  • "它可以特定于我的阵列吗?"对不起。这句话看不懂。
  • 我对此表示赞同,因为虽然网上有很多资源,但我知道在学习时间复杂度时我很难掌握一些概念。

标签: java arrays sorting time complexity-theory


【解决方案1】:

复杂性是函数(或算法)的渐近属性,而不是实际执行路径的属性。复杂度表示输入大小和计算时间(或空间要求)之间的关系。因此,这个概念在应用于单个具体计算时没有任何意义。

换句话说,您可以根据n 询问计算f(n) 的复杂性,但不能询问计算f(5) 的复杂性。后者只是一个数字。前者是一个函数。

可以做的是计算实际操作次数。每次执行要包含的操作(例如“比较”)时,只需增加一些全局计数器,然后检查其值。 (算法复杂度应该告诉你这个计数器可能取的值的界限。)

【讨论】:

  • 是的,检查操作数就是我的意思。我该怎么做?
  • 我要补充一点,这个概念与语言无关
  • @Matt9Atkins:正如我所说,在某处添加一个计数器变量,并在每次进行比较时递增它(例如,就在 if 之前)。
【解决方案2】:

算法的“最坏情况”性能是指使算法表现最差的一组输入数据。所以引用特定输入数组的“最坏情况”是没有意义的,因为那只是一种情况。

【讨论】:

  • 我要补充一点,这个概念与语言无关。
【解决方案3】:

在一般情况下,您的算法的最坏情况复杂度为O(n^2)(即不超过n^2,渐近)。它也是Theta(n^2)(即不多不少而不是n^2)。我省略了乘法常数。

假设您对阵列有所了解。为了保持具体,假设您知道您的数组需要不超过五个冒泡排序类型的交换才能排序。有了这些知识,说你的算法的运行时间是O(n^2) 仍然是正确的。然而,它不再是Theta(n^2)

正确地说该算法在特定情况下的运行时间是O(n)。换句话说,对数组有所了解使我们能够在算法的运行时提供更严格的界限

【讨论】:

    【解决方案4】:

    当列表已经排序或接近排序O(n) 时,冒泡排序的最佳情况发生,所以是的,它可以取决于您的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      相关资源
      最近更新 更多