2016-12-30 85 views
3

好的,我知道通过交换项目直到达到中间位置来反转阵列非常简单。就像这样:如何颠倒巨大尺寸的阵列?

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

你现在正在做O(N)。 O()的全部意义在于它没有被指定。 –

+1

你写的代码已经是O(n)。更确切地说,它运行n/2次迭代。 –

+0

好吧,我明白了,但如果大小等于1000000,那么这种方法不会花太长时间? –

回答

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

扭转数组不能被任何速度比完成O(n)。但是你的代码的时间复杂度也是O(n)。

大哦的定义: F(X)是f大哦(x)如果:

definition of Big-Oh

不是无限

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

那里离开常数c,使得CF(x)是大于G(X)为x的所有值更大。

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

交换拖曳整数需要不变时间。执行掉换n/2次会导致O(n)。

对不起,在答案中不包括图片。