2015-07-14 3 views
0

Так что мне поручено сопоставить LinkedLists и ArrayLists для двух разных вещей.Список массивов Vs. Связанный список

часть 1) произвольного выбор места внутри списка и приращения этих значений от 1 для каждого типа списка

часть 2) дважды каждого размера списка путем добавления случайных мест, а затем немедленно удалить такое же количество случайных местоположения приносят список до первоначального размера.

Я чувствую, что я достиг этого очень хорошо, но мой учитель говорит, что часть 1 ArrayList должна быть быстрее (что есть в моем коде). Он говорит, что LinkedList должно быть намного быстрее в части 2, что для меня совершенно противоположно ... путь медленнее. Я добавляю в SYSO's в разных местах, чтобы проверить правильность изменения списков и все, почему он не работает так, как он говорит, что это должно быть.

Может ли кто-нибудь определить, что я сделал неправильно (если что?). Большое спасибо

import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.List; 
import javax.swing.JOptionPane; 

public class LinkedListVersusArrayList { 

public static void main(String[] args) { 

    long startTime, endTime, duration; 
    List<Double> LL = new LinkedList<Double>(); 
    ArrayList<Double> AL = new ArrayList<Double>(); 
    int size = Integer.parseInt(JOptionPane.showInputDialog("Pick a list size (whole number only please)")); 

    //fills the Linked List with random doubles 
    for (int i = 0; i < size; i++){ 
     LL.add(Math.random()); 
    } 
    //fills the ArrayList with random doubles 
    for (int i = 0; i < size; i++){ 
     AL.add(Math.random()); 
    } 

    // 
    //Part 1 
    // 
    System.out.println("\nPART 1:\nBoth lists are now full of random numbers. \nI will now cycle through " 
      + "and incremiment random locations " +size+ " times for each list.\n"); 

    //testing the LinkedList first for random access 
    startTime = System.nanoTime(); 
    for (int i = 0; i < size; i++){ 
     int x = (int)(LL.size()*Math.random()); 
     double y = LL.get(x); 
     LL.set(x, y+1); 
    } 
    endTime = System.nanoTime(); 
    duration = (endTime - startTime); 
    System.out.println("Linked List took: " +(duration/1000000) +" milli seconds"); 

    //testing the ArrayList now for random access 
    startTime = System.nanoTime(); 
    for (int i = 0; i < size; i++){ 
     int x = (int)(AL.size()*Math.random()); 
     double y = AL.get(x); 
     AL.set(x, y+1); 
    } 
    endTime = System.nanoTime(); 
    duration = (endTime - startTime); 
    System.out.println("Array List took: " +(duration/1000000) +" milli seconds"); 

    // 
    //Part 2 
    // 
    System.out.println("\nPART 2:\nBoth lists will now get "+size+" slots added to them in random locations.\n" 
      + "After this is complete, we will remove "+size+" slots from each list at random\n"); 

    //testing the LinkedList first for random adding/subtracting 
    startTime = System.nanoTime(); 
    //add 
    for (int i = 0; i < size; i++){ 
     int x = (int)(LL.size()*Math.random()); 
     LL.add(x, 1.0); 
    } 
    //delete 
    for (int i = 0; i < size; i++){ 
     int x = (int)(LL.size()*Math.random()); 
     LL.remove(x); 
    } 
    endTime = System.nanoTime(); 
    duration = (endTime - startTime); 
    System.out.println("Linked List took: " +(duration/1000000) +" milli seconds"); 

    //testing the ArrayList now for random adding/subtracting 
    startTime = System.nanoTime(); 
    //add 
    for (int i = 0; i < size; i++){ 
     int x = (int)(AL.size()*Math.random()); 
     AL.add(x, 1.0); 
    } 
    //delete 
    for (int i = 0; i < size; i++){ 
     int x = (int)(AL.size()*Math.random()); 
     AL.remove(x); 
    } 
    endTime = System.nanoTime(); 
    duration = (endTime - startTime); 
    System.out.println("Array List took: " +(duration/1000000) +" milli seconds"); 
} 

}

+0

Что именно вы имеете в виду, когда говорите «удваиваете размер каждого списка, добавляя случайные местоположения»? – bhspencer

+0

добавление элементов. поэтому, если аррайалист имеет размер 200 изначально, после его удвоения он будет содержать 400 элементов. просто добавив в случайные местоположения внутри массива – DojoOria

+0

Выполнение микро-тестов является нетривиальным, особенно на JVM (из-за оптимизационного компилятора времени исполнения). Теоретически случайные добавления в связанном списке должны быть быстрее, чем на ArrayList (так как ArrayList сдвинет все элементы справа от позиции), но разница не огромна (поскольку связанный список должен сканировать через список, чтобы найти pos X) - особенно для небольших списков. – folkol

ответ

3

Помимо всех вопросов, которые microbenchmarking ваш код не контролирует для ожидания своего учителя для случая 2, также неправильно. Он не учитывает стоимость доступа к случайному элементу LinkedList (предпосылка для вставки в это место) и переоценивает стоимость вставки в ArrayList. Стоимость копирования смежных блоков памяти намного ниже стоимости преследования длинной цепочки указателей, что и требуется для доступа к случайному элементу LinkedList.

В действительности LinkedList имеет очень узкую область применения, где есть любое улучшение по сравнению с ArrayList. Например, вы можете попытаться вставить только около передней части списка. Таким образом, вы будете подчеркивать стоимость перемещения элементов в ArrayList и снижать стоимость доступа к члену LinkedList.

+0

do вы подразумеваете под отметкой микросканирования, тот факт, что я не получаю доступа к тем же местам для каждого списка для каждого теста ... Я рассмотрел возможность создания случайного списка чисел ('size' long), а затем используя это для итераций из-за петель. Я думал, что это будет более «честно», но мой урок сказал, что это не обязательно – DojoOria

+0

Я имею в виду, что вы не разогреваете код, вы используете одно и то же JVM для всех тестов, у вас есть все тесты в линия в том же методе (исключает некоторые оптимизации) и многие другие. бенчмаркинг на JIT-скомпилированном, управляемом времени выполнения чрезвычайно обманчив. –

+0

Большое спасибо за ответ от департамента. Я боюсь, что на моем уровне (1,5 класса в моей карьере программирования) это немного по моей голове, если не сказать больше. Я собираюсь рассказать об этом и о том, что вы сказали. Спасибо вам за помощь! я очень ценю это – DojoOria

Смежные вопросы