2017-02-17 30 views
0

Для проекта мне требуется написать метод, который проходит через обход LinkedList, заполненный 5 миллионами случайных целых чисел, с помощью listIterator, а затем методом get (index) LinkedList.Обход гигантского LinkedList

У меня не возникло проблем с перемещением его с помощью ListIterator, и он завершился примерно в 75 мс. ОДНАКО, после попытки пройти метод get на 5 миллионов целых чисел, я просто прекратил работу примерно 1,5 часа.

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

public static long getTraverse(LinkedList<Integer> list) { 
    long start = System.currentTimeMillis(); 
    for (int i = 0; i < linkedList.size(); i++) { 
     linkedList.get(i); 
    } 
    long stop = System.currentTimeMillis(); 
    return stop - start; 
} 

Это работало прекрасно для LinkedLists от Целые размеров 50, 500, 5000, 50000, и потребовалось некоторое время, но для завершения 500000.

Мой профессор, как правило, крайне неопределенными с инструкциями и очень бесполезно, когда подходили к вопросам. Итак, я не знаю, нарушен ли мой код, или если он увлекся целями в руководящих принципах. Любой вход оценивается.

+1

В моем классе структур данных нам пришлось ждать более 24 часов для сортировки пузырьков, чтобы завершить сортировку массива примерно такого размера. (Который также является алгоритмом O (n^2)), что звучит нормально. – 4castle

+2

Урок, который ваш инструктор пытается вас научить, заключается в том, что 'LinkedList' очень медленны с большим количеством значений. Существует не метод произвольного доступа. Для 'get (n)' он должен начинаться с первого элемента и итерации до 'n'. –

+0

Хорошо, просто убедитесь, что тогда! Я предположил, что это займет очень много времени, но я подумал, что я должен делать что-то не так, чтобы ждать несколько часов. Мой последний проект занял 30 минут. В этом есть смысл! –

ответ

1

Подумайте о том, как реализован LinkedList - как цепочка узлов - и вы увидите, что для того, чтобы добраться до определенного узла, вы должны начать с головы и пройти к этому узлу.

Вы звоните .get() на LinkedList через п раз, что требует перемещения по списку, пока он не достигнет этого показателя. Это означает, что ваш метод getTraverse() принимает O (n^2) (или квадратичное) время, потому что для каждого элемента он должен пройти (часть) списка.

Как сказал Эллиотт Фриш, я подозреваю, что вы обнаруживаете, что именно ваш инструктор хотел, чтобы вы обнаружили - разные алгоритмы могут иметь совершенно разные времена автономной работы, даже если в принципе они делают то же самое.

+0

Ahh да, я определенно обнаружил это! Наверное, я был нетерпелив, потому что время исполнения показалось чрезмерным. Изучив Биг-О, я предполагаю, что мог предсказать ужасно продолжительное время. Просто собираюсь позволить ему бежать. –

+0

@ColeDooley Вот еще один вопрос, чтобы обдумать. LinkedList содержит оптимизацию для получения (n), которая заключается в том, что если n ближе к концу списка, обход начинается с конца и продолжается назад. Это отличная оптимизация, потому что в среднем она сокращает время поиска пополам! Объясните, какое влияние это оказывает на анализ Big-O. –

1

A LinkedList оптимизирован для вставки, что является постоянной операцией времени.

Для поиска LinkedList требуется выполнить итерацию по каждому элементу, чтобы найти тот, который вы хотите. Вы указываете индекс методу get, но под обложками он перемещает список по этому индексу.

Если вы добавили некоторые операторы печати, вы, вероятно, увидите, что первые X-элементы извлекаются довольно быстро и замедляются с течением времени, когда вы индексируете элементы дальше по списку.

ArrayList (поддерживается массивом) оптимизирован для извлечения и может индексировать нужный элемент в постоянное время. Попробуйте изменить код, чтобы использовать ArrayList и посмотреть, насколько быстрее выполняется get.

+0

Отлично! Я попробую реализовать его на ArrayList. Я решил, что обход будет медленным, но не ожидал точно, как медленно. Я даже добавил подсказку, чтобы пропустить обход цели в целом, проверяя его из-за разочарования ха-ха. –