время обработки списка java - PullRequest
2 голосов
/ 18 февраля 2012

Это из википедии: http://en.wikipedia.org/wiki/Arraylist под Производительность .

ArrayList: постоянное время для remove (), add () в конце массива, линейное время для add (), remove () в начале.

LinkedList: обе указанные операции: постоянное время, индексирование: линейное.


1) Почему разница во времени обработки массива между двумя операциями?

2) Linkedlist является линейным для индексации, постоянным для добавления в конце, почему?

Ответы [ 4 ]

3 голосов
/ 18 февраля 2012

1) Потому что для добавления / удаления в начале необходимо сместить все и переиндексировать.

2) Поскольку оно поддерживает ссылки на голову и хвост (начало и конец).Индексирование означает обход списка.

1 голос
/ 18 февраля 2012

Когда вы достигнете add до конца ArrayList, он вырастет сам, чтобы иметь место для запаса.Таким образом, если у вас есть 10-элементный элемент ArrayList, добавление в конце приведет к тому, что он внутренне выделит место для двадцати элементов, скопируйте десять уже имеющихся, а затем добавьте один.Затем, когда вы добавляете еще один элемент в конце, он просто вставляет этот двенадцатый элемент в пространство, которое он уже создал.

Технически это не дает ему постоянное время вставки в конце, но оно дает ему амортизируется постоянная вставка времени.То есть, при большом количестве операций стоимость приближается к постоянному времени;каждый раз, когда он увеличивается, он удваивается, поэтому у вас будет все большее число «свободных» вставок постоянного времени, прежде чем вам придется снова увеличивать и копировать.

Когда вы вставляете в начало , он не может этого сделать и всегда должен копировать весь список в новое место (линейное время).

Удаление с конца всегда постоянное время, потому что вы просто переключаете последнюю ячейку сбудучи «заполненным» до «свободного пространства».Вам никогда не нужно копировать список.

Что касается вашего второго вопроса, LinkedList сохраняет указатель на конец списка, поэтому add и remove там просто используют этот указатель и таким образомпостоянное времяНет быстрых указателей на середину списка, поэтому доступ к произвольному элементу требует линейного обхода времени от начала до (потенциально) конца.

1 голос
/ 18 февраля 2012
  1. Потому что удаление в конце не требует перемещения данных.Добавление может потребовать копирования для изменения размера массива хранения, но его время амортизируется .
  2. Поскольку добавление в конце не требует перехода по списку, а индексирование делает.
1 голос
/ 18 февраля 2012

i) ArrayList -> Вы должны сдвинуть все элементы на одну позицию в случае удаления / добавления в начале, следовательно, линейное время. В конце массива вы просто добавляете или удаляете.

ii) LinkedList -> У вас есть ссылки на голову и хвост, следовательно, вы можете добавлять / удалять все что угодно (в постоянном времени).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...