2013-05-02 38 views
2

假設一個對象數組:Element T [],每個對象包含兩個整數變量(x,y)。通過arraycopy增加和增加數組元素

T = (1,1) (2,2) (3,3) (4,4) 

欲增加一個新元素被添加到陣列具有可能的更快的方式可變對象的X每個時間的值。新元素可以在任何位置添加我們增加插入位置畢竟X元素(位置+1)

加前(6,6):

T = (1,1) (2,2) (3,3) (4,4)

後添加( 6,6)在不同的位置:

1)T = (6,6)(,1)(3 ,2)(4 ,3)(5 ,4)

2)T =(1,1)(2,2)(6,6)(,3)(,4)

3)T =(1,1)(2,2)(3,3)(6,6)(,4)

我用arraycopy添加新元素的方法,以及環遞增變量X每個元素,如下:

  1. 增量與循環對象元素的所有x對於

  2. Ta[0] = (6,6)

  3. araycopy(T, 0, Ta, 1, T.size-1);

,因爲它的速度比

While (i< T.length){ 

    T[i] = T[i+1] 

    T[i].x ++; 

    i++; 
} 

我需要一個更快的時間同時添加新元素,並增加陣列的其他對象。

// -------------------

公共類elemt {

public int x; 
public int y; 

public elemt(int a, int b){ 
    this.x= a; 
    this.y= b; 
} 


public void inc(){ 
x++; 
} 

int getX(){ 
    return x; 
} 

int getY(){ 
    return y; 
} 

}

// --- -------------

公共類TAD {

公共靜態的ArrayList < elemt> T =新的ArrayList < elemt>();

public static ArrayList < elemt> T1 = new ArrayList < elemt>();

public static void main(String[] args){ 



    for(int i=0; i<10000000; i++){ 
     T1.add(new elemt(i, i)); 
     } 


    long t0 = System.currentTimeMillis(); 

     T1.add(0, new elemt(1, 1)); 

    long t1= System.currentTimeMillis()- t0; 

    System.out.println("Time without Incrementation : "+t1); 


//-------------- 

    for(int i=0; i<10000000; i++){ 
     T.add(new elemt(i, i)); 
     } 


    long t2 = System.currentTimeMillis(); 

     T.add(0, new elemt(1, 1)); 

     for(int i=1; i<T.size(); i++){ 
      T.get(i).inc(); 
     } 

    long t3= System.currentTimeMillis()- t2; 

    System.out.println("Time with Incrementation: "+t3); 



} 

// -------結果:

時間沒有增量方向:15毫秒

時間與增量方向:156毫秒

我的目標是儘可能減少增量過程的時間

(時間增量<時間無增量* 2)

因爲實際上

與增量方向(156毫秒)=時間時間沒有增量方向(15毫秒)* 10

我注意到,我可以在任何位置添加了新的元件,但我選擇最壞的情況下(添加在所述第一位置,需要該ArrayList所有X元件的增量的元件)

+0

可以使用列表,存在插入的對象的列表的開頭()稱爲addfirst僅一個方法..和比可以從第二元件迭代列表,並遞增變量X – Elior 2013-05-02 19:54:11

回答

2

不要使用的陣列,使用Deque,大概LinkedList。這在前面插入了O(1)

public void addAndIncrement(Deque<Point> deque, Point new) { 
    for(Point p : deque) { 
    p.x++; 
    } 

    deque.addFirst(new); 
} 

或者什麼。

+0

噢男孩的值。 ..'px = p.x ++'??????? – Daniel 2013-05-02 20:26:11

+0

@Daniel好趕上 – durron597 2013-05-02 20:27:06

+0

我們可以在任何位置添加元素不僅在第一個 – MMD 2013-05-03 23:14:33

2

我會建議你使用List(LinkedList例如)如果你經常插入。

它允許您輕鬆地在任何位置插入一個元素。也可以輕鬆地遍歷列表來對每個元素做一些工作。

如果你想給第三方lib試試,例如番石榴,你可以嘗試番石榴的:

Lists.transform(列表,功能) http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/Lists.html#transform(java.util.List,com.google.common.base.Function)

它確實像map(list, function)功能。所以你不必自己做迭代,只需要知道transform方法,你想在每個元素上做什麼。那麼它爲你做。

P.S.如何用標籤寫下markdown http鏈接,當鏈接中包含brackets

+1

這是一種情況:'List'事項的實施,並非所有的名單有'O(1)'insertFront時間。例如,'ArrayList'具有'O(n)'insertFront。 – durron597 2013-05-02 20:28:21

+0

yes鏈表是更好的插入/刪除肯定!你是對的。我不知道OP如何訪問元素,也不知道隨機訪問發生的頻率。所以沒有指定具體的List實現。 – Kent 2013-05-02 20:30:34

2

只是一個建議(一些「開箱即用」的思想):

如果通過陣列T對象沒有別的要求,只訪問,你真的沒有遞增的第一要素對。

當你做到這一點今天(你是遞增的第一個值)...

given T[i] = (firstElement, secondElement); 
x = firstElement; 
y = secondElement; 
// work with x and y now... 

...你可以做到這一點(不要在任何時候需要遞增firstElement):

given T[i] = (firstElement, secondElement); 
x = firstElement + i; // add the index! 
y = secondElement; 
// work with x and y now... 

這將打開插入你的O(n)的複雜性爲O(1)。但是,當然,這很大程度上取決於您的場景以及您如何使用對象的值。