2016-12-30 61 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)。

對不起,在答案中不包括圖片。