好的,所以我知道通过交换项目直到你到达中间位置来反转数组非常容易。像这样:
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)?
答案 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,如果:
不是无穷大
或者我们可以这样说: alternate definition for Big-Oh
对于x的所有值,存在一个常数c,使得c.f(x)大于g(x)。
这里我们考虑,我们的数组大小和函数T(n)我们程序的步骤。
交换两个整数成本恒定时间。交换n / 2次将导致O(n)。抱歉不在答案中包含图片。