2

这里的大符号是什么?解释将不胜感激。谢谢。

public static int[] mystery1(int[] list) {

  int[] result = new int[2 * list.length];
  for (int i = 0; i < list.length; i++) {
    result[2 * i] = list[i] / 2 + list[i] % 2;
    result[2 * i + 1] = list[i] / 2;
  }

  return result;

}
4

4 回答 4

10

O(n),其中 n 是列表的长度。无论如何,您都会浏览整个列表一次。

算术运算的数量为:

  • 2n 次乘法
  • 2n 个加法
  • 2n个分区
  • n 模运算

这还不包括实现 for 循环的算术运算。

于 2013-02-08T20:37:50.467 回答
4

在)

命令的数量并不像您使用的控制结构(循环)那么重要。如果你考虑这个函数,它只有一个循环。该循环使用列表的长度 (n) 作为迭代次数。如果列表的长度加倍,则循环完成所需的时间也会加倍。

于 2013-02-08T20:39:04.600 回答
1

大 O 代表最坏的情况。因为您无法比较两台不同计算机执行操作所需的时间,所以大 O 应用于算法将执行的操作数量。操作可以是从方法调用到变量赋值的任何内容。

浏览您的代码

 int[] result = new int[2 * list.length]; 
  for (int i = 0; i < list.length; i++) {
    result[2 * i] = list[i] / 2 + list[i] % 2; 
    result[2 * i + 1] = list[i] / 2; 
  }

  return result;

重负载在for循环中。因为您循环list.length时间,所以此方法的大 O 是O(list.length). 但是,为了彻底起见,您确实可以计算其他操作。当您分配一个新的 int 数组时,您会计算它。当您将数组中的索引计算result为时2 * i,您也将其计算在内。但是,由于这些操作需要固定的时间,它们会被循环所花费的可变时间所吞噬。

你应该阅读你的笔记,但你会了解到有不同级别的复杂性,常数、线性、对数等。

于 2013-02-08T20:40:16.427 回答
1

它开着)。因为只有一个 for 循环迭代。这取决于数组的长度,并且会线性增长。

于 2013-02-08T21:02:08.427 回答