2010-02-07 1 views
1

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

а -> Ь -> с -> d -> е -> е

Если я хочу, чтобы получить д от LinkedList, я не должен проходить по списку, начиная с и итерация до d или начиная с f и итерации назад к d?

Почему я должен заботиться о том, хранится ли физически в коллекции?

+0

Это плохой заголовок вопроса. Я не могу найти никакой связи между «неинтуитивным» и «физическим элементом». Не могли бы вы перефразировать заголовок, чтобы уточнить свой вопрос. Это довольно сложно разобрать. Что вы хотите узнать? –

+0

, но становится более важным, чем вставка g? или более важно, чем удаление b? потому что, не отвечая на эти вопросы, вы не можете знать, какая структура будет соответствовать вашим потребностям. возможно, что выборка немного дороже, но если вы делаете это только 1 раз для каждой вставки 1k, почему бы вам не заботиться о скорости загрузки по сравнению со скоростью вставки? –

+0

В частности, если вы перебираете список (что на самом деле является одной из наиболее распространенных вещей, связанных с коллекцией), это действительно не медленнее, чем что-либо еще. –

ответ

2

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

Преимущества:

  • наименьшее количество накладных расходов памяти для плоского массива, кроме
  • очень быстро вставить и удалить
  • памяти может быть выделен и освобожден один элемент, в то время
  • легко (не так важно с современными языками, но это было важно в C89 и C99)
  • Возможно упорядочение LIFO или FIFO
+0

Список, как показано на рисунке, является «односвязным», поэтому вы можете путешествовать только в одном направлении (вперед) .. с «двойным соединенным» списком вы можете путешествовать в обоих направлениях. a <-> b <-> c <-> d <-> e <-> f НО вы храните в два раза больше указателей и должны сохранять оба указателя в синхронизации при добавлении/удалении. Обратите внимание, что вы можете удерживать ссылку на любую точку в списке (mypointer-> d), но не гарантируете, что элемент все еще включен в список, если вы не пройдете его. Просто знайте, что LinkedList (в общем) медленнее перемещаться, чем, например, ArrayList, но быстрее вставлять/удалять. –

0

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

И да, если вы работаете с отсортированными данными, вы обычно все равно в каком порядке элементы хранятся в.

1

Я думаю, что правильный вопрос не ГДЕ, а КАК он хранит вашу коллекцию. В соответствии с этим ваше время добавления, поиска, удаления и сохранения вашей коллекции отличается друг от друга. Поэтому, когда вы выбираете коллекцию типов, вы должны иметь в виду, какая будет наиболее частая операция и выбрать лучшее решение для вашего дела.

0

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

0

Списки не касаются «физических местоположений» (что бы вы ни подразумевали под этим), списки представляют собой определенную структуру данных, которая может расти и сокращаться и обеспечивать достойную сложность в различных операциях.

0

Вам не нужно явно перемещать связанный список, так как LinkedList предлагает indexOf(Object) и get(int). Они все равно пройдут список, но сделают это неявно.

Вы позаботитесь о том, как элементы коллекции заказывают, потому что это влияет на эффективность операций над коллекцией, в частности, вставить, извлечь &. Любое упорядочение элементов в коллекции также влияет на сроки алгоритмов, которые используют структуру данных.