【问题标题】:Running time of a long array of fixed size固定大小的长数组的运行时间
【发布时间】:2018-08-24 08:05:39
【问题描述】:

算法的运行时间是否取决于数组的长度? 我知道如果数组的长度未知,我们会说以下算法的运行时间是 O(n)。

   public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    System.out.print("Size of array: ");

    int lengthOfArray = sc.nextInt();
    int[] longArray = new int[lengthOfArray];

    for (int i = 0; i < longArray.length; i++) {
        System.out.println("Hello" + i);
    }

}

但是,如果数组的长度是已知且固定的。它会被视为常数时间,即 O(1) 还是仍被视为 O(n)。

   public static void main(String[] args) {

    int[] longArray = new int[99];

    for (int i = 0; i < longArray.length; i++) {
        System.out.println("Hello" + i);
    }

}

【问题讨论】:

  • 这有点主观。严格来说,两个代码 sn-ps 都是O(n),其中n 是数组的大小。如果你知道数组是固定的,那么你可以通过说它是一个已知的时间惩罚来抵消你的资产负债表。但它不会改变第二个循环的运行时间动态。
  • 是的,如果你的数组是固定大小并且它不随输入的大小而变化,它是 O(1),因为它可以表示为 c * O(1) = O( 1),其中 c 是一些常数。
  • 这是必须区分时间复杂度实际执行时间的地方。

标签: java time big-o


【解决方案1】:

在您的情况下,算法的复杂性将是一个常数。那是因为复杂性总是一样的。 (请参阅我使用复杂性而不是运行时间,因为实际上存在差异)。

对于一个未知的循环,它是 O(n),因为任务根据 n 变化(对于百万记录可能更复杂,而对于 5 则不太复杂)。虽然它仍然是线性复杂度。

如果我们知道长度 n=5,那么它就变成了 O(5),基本上是 5*O(1),并且由于不考虑常数,它变成了 O(1) 复杂度。

这并不意味着如果您知道元素的数量,程序的运行时间就会减少。这意味着运行时间将是一个常数(因为复杂性是常数)。

【讨论】:

    【解决方案2】:

    时间复杂度:O(n) 表示您的方法运行时间由输入决定。

    这是一个术语,用于在开发人员之间进行交流,以了解同一问题的最佳解决方案。

    来自wiki的一个很好的解释:

    如果算法的时间复杂度为 O(n),则称该算法需要线性时间或 O(n) 时间。通俗地说,这意味着运行时间最多随着输入的大小线性增加。更准确地说,这意味着存在一个常数 c,使得每个大小为 n 的输入的运行时间最多为 cn。例如,一个将列表中所有元素相加的过程需要的时间与列表的长度成正比,如果相加时间是常数,或者至少以常数为界。

    通常我们不仅需要考虑时间,还需要根据问题本身考虑空间复杂度来选择合适的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2013-12-04
      • 2017-07-29
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多