【问题标题】:What is the algorithm efficiency (in terms of Big-Oh) of simple fixed-size integer-arithmetic?简单的固定大小整数算术的算法效率(以 Big-Oh 计)是多少?
【发布时间】:2015-02-19 20:29:54
【问题描述】:

例如,

public int sumArray()
{
  int[] arr = new int[10];

  int n = arr.length;

  int sum = (n*(n+1))/2;

  return sum;
}

这个算法的效率会是O(1),O(n),还是别的什么?

【问题讨论】:

  • 基本算术是 O(1)
  • 在这种情况下,它是一个无参数的纯函数,也称为常量。不出所料,它有O(1)

标签: java arrays performance algorithm induction


【解决方案1】:

sumArray 中的每个单独语句都需要固定时间(与 n 的值无关,这里本身就是一个常量),所以整个函数也是如此。

【讨论】:

    【解决方案2】:

    简单来说,据我了解(如果您想要更准确的官方信息,请访问谷歌或查看 wiki),

    Big-O 让您了解特定算法的效率如何,例如,如果您想对列表进行排序/搜索已排序/未排序列表中的元素,基本上这需要针对项目大小进行迭代。随着大小开始变大,您会看到使用更高效的算法得到很大改进。

    在您的情况下,不涉及迭代,因此这将是常数时间 O(1),n 的值是多少并不重要。但是,如果您使用从一到 n 的循环重写您的 Sigma N 问题并在每次迭代中求和,那么它将是 O(n)。如您所见,对于这个特定问题,您的解决方案比循环更有效。 O(1) 优于 O(n)。

    【讨论】:

      【解决方案3】:

      算法效率为 O(1)。没有争论,它是不变的。下次如果你弄糊涂了,你应该看看Big-O Algorithm Complexity Cheat Sheet

      【讨论】:

        【解决方案4】:

        通常假设基本整数的大小是一个常数,并且任何能够处理某些数量的项目的机器都会固有地具有足以容纳该数字的本机整数大小。如果不是这样的假设,大多数算法最终会得到额外的 O(lg(N)) 或 O(lg(N)^2) 因子,以适应所需整数大小为 O(lg(N) ),并且对大小为 S 的整数执行操作的总步骤数将是 O(S) 或 O(S*S) [实际上,大多数步骤将在现代硬件上并行执行,但 总步数仍然是 O(S) 或 O(S*S)]。

        请注意,这些假设假设代码不需要使用长度超过 O(lg(N)) 的数字,但后一种假设通常在实践中成立;主要有必要防止算法使用任意长度的整数来执行在所谓的 O(1) 时间内不是 O(1) 的任务。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-30
          • 1970-01-01
          • 2013-10-30
          相关资源
          最近更新 更多