如何反转大尺寸的阵列?

时间:2016-12-30 12:39:40

标签: java arrays

好的,所以我知道通过交换项目直到你到达中间位置来反转数组非常容易。像这样:

int array[SIZE];
int temp;

for (int i = 0; i < SIZE/2; i++)
  {
     temp = array[i];
     array[i] = array[SIZE-1 - i];
     array[SIZE-1 - i] = temp;
  }

但是如果数组大小真的像10000那么大呢?是否有可能做到O(N)?

2 个答案:

答案 0 :(得分:10)

你不能比现在的算法(在O(n)中运行)更快地完成它。可能感兴趣的是将数组包装在提供O(1)反转的类中:

简单版本可能如下所示:

public class ReversableArray {
  private boolean reverse = false;
  private final int[] array;
  public ReversableArray(int[] array) { this.array = array; }

  public int get(int index) {
    return reverse ? array[array.length - index - 1] : array[index];
  }
  public void reverse() { reverse = !reverse; }
}

答案 1 :(得分:1)

反转数组不能比O(n)快。但是代码的时间复杂度也是O(n)。

Big-Oh的定义: f(x)是f(x)的Big-Oh,如果:

definition of Big-Oh

不是无穷大

或者我们可以这样说: alternate definition for Big-Oh

对于x的所有值,存在一个常数c,使得c.f(x)大于g(x)。

这里我们考虑,我们的数组大小和函数T(n)我们程序的步骤。

交换两个整数成本恒定时间。交换n / 2次将导致O(n)。

抱歉不在答案中包含图片。