2009-03-13 3 views
39

Я понимаю определение связанного списка, но как его можно представить и связать с общей концепцией или предметом?Что такое практический пример реального мира связанного списка?

Например, композиция (EDIT: первоначально сказано «наследование») в ООП может быть связана с автомобилями. Все (большинство) автомобилей в реальной жизни - это, по сути, одно и то же; у автомобиля есть Двигатель, вы можете его запустить(), вы можете сделать автомобиль go(), stop() и так далее. Автомобиль обычно имел максимальную пассажирскую мощность, но он отличался бы между автобусом и SportsCar, которые оба являются автомобилями.

Есть ли какая-то реальная жизнь, интуитивно понятный пример простого простого оле? Связанный список, как у нас с наследованием? Пример типичного учебника Linked List показывает узел с целым числом и указатель на следующий, и он просто не очень полезен.

Ваш вход оценивается.

+2

Вы вводите в заблуждение наследование с композицией. Вы сами это сказали: Automobile _has_an_ Engine, а не _is_an_ Engine. –

+0

Я не смущен. Двигатель будет объявлен в классе Automobile и унаследован в классе Bus или SportsCar. Кроме того, этот пост не касается наследования. – 2009-03-13 19:17:00

+2

Если вы не смущены, ваш текст есть. Вы упоминаете пример учебника композиции, а не наследования. Вы добавите пример наследования атрибутов позже. Я понимаю, о чем идет речь, и это интересно. Вот почему я не собираю его. –

ответ

12

линии на кассира/кассира и т.д. Ожидание ...

ряд заказов, которые должны быть выполнены в порядке.

Любая структура FIFO может быть реализована как связанный список.

+0

+1: Каждый человек является главой списка со списком за ними. Кроме последнего человека, который является главой пустого списка. –

+0

Хм. Как насчет указателя? Если я стою в очереди, мне действительно все равно, что человек позади меня, и кассир не собирается спрашивать меня, где следующий человек. Я пытаюсь представить себе модель реального мира. – 2009-03-13 19:19:03

+0

Указатель на самом деле не имеет значения. Важная часть связанного списка состоит в том, что очень легко добавить элемент в конец, или в начало, или в любом месте в списке. Попробуйте сделать это с помощью обычного массива. Представьте, что кто-то в очереди решает вырезать, или кто-то выходит, чтобы пойти в ванную ... –

6

Если вы думаете об этом, «ссылка» - это просто способ определения отношений «Next», «Previous», «Child» или «Parent» между данными экземпляров. Итак, среди приложений реального мира вы найдете множество приложений. Подумайте о простом списке (например, списке продуктов) для базовых списков ссылок. Но рассмотрите также те виды использования, в которые мы можем поместить Графики (построение расстояний между городами на карте, взаимодействие между видами в биологии) или деревья (иерархии в организации или данные в индексе базы данных для двух очень разных примеров).

+0

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

+0

Хорошая точка! Я удалил строку о ООП, поскольку это было действительно не нужно. Я быстро просмотрел вопрос и подумал, что есть какая-то путаница. –

+0

+1 Согласен. Эквивалент реального мира - это любой список, который вы можете написать на бумаге. «Связанная» часть - это просто внутренние кодовые механизмы, которые программа будет использовать для навигации по списку. Для нашего примера это будет бумага. –

0

Мне нравится думать о круговом связанном списке, таком как жемчужное ожерелье, с каждой жемчужиной, содержащей немного данных. Вы просто следуете за строкой до следующей жемчужины данных, и в итоге вы снова начинаете в начале.

+0

Hah, я только что написал то же самое ... nice :) – 2009-03-13 19:34:06

+0

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

8

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

Например:

  • список изображений, которые должны быть записаны на компакт-диске в приложении медицинской визуализации
  • список пользователей веб-сайта, которые должны быть по электронной почте Некоторые уведомление о
  • Список объектов в 3D-игре, которые необходимо отобразить на экране

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

Редактировать: Я заметил, что в одном из ваших комментариев вы спросили, почему указатель имеет значение. Кто-то справедливо ответил, что указатель на самом деле не имеет значения для пользователя связанного списка. Пользователь просто хочет список, содержащий список нужных вещей. Как этот список «содержит» этот список вещей не имеет особого значения для пользователя. Указатель является частью этого «как».Представьте себе линию, нарисованную на полу, которая ведет к кассиру. Люди должны стоять на этой линии, чтобы добраться до кассира. Эта строка является (и я признаю, это немного растянутая) аналогия для указателя, который использует связанный список. Первый человек, у кассира, на линии, является главой списка. Лицо, прямо за ним на линии, является следующим в списке. И, наконец, последний человек в строке, на линии, является хвостом списка.

+2

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

+0

Внутренне, когда у вас нет C++ и boost, очереди и стеки (и, возможно, векторы) являются конкретными случаями связанных списков. Приятно понимать, что, даже если вы никогда не должны знать это, чтобы использовать их. –

+0

Какие аспекты этих случаев делают связанный список более подходящим, чем, скажем, массив? – Faust

1

Связанный список может использоваться для реализации queue. Канонический пример реальной жизни - это линия для кассира.

Связанный список также может быть использован для реализации stack. Кононический реальный пример ife был бы одним из таких диспенсеров для тарелок в ресторане «шведский стол», где вытащить верхнюю пластину с верхней части стека.

0

В .NET BCL класс System.Exception имеет свойство InnerException, что указывает на другое исключение, либо null. Это создает связанный список.

В System.Type имущество BaseType указывает на другой тип таким же образом.

55

Связанный список похож на conga line. Каждый держит бедра человека перед собой, а их бедра удерживаются в свою очередь человеком сзади, за исключением только спереди и сзади. Единственный способ добавить людей в линию - найти нужное место и отделить это соединение, а затем вставить нового человека или людей.

+0

Я думаю, что их руки будут указателем, и вместо того, чтобы указывать на следующего человека, они указывают на то, что мы будем считать предыдущим человеком, но это работает очень хорошо. +1 –

+11

Я волнуюсь, что это побудит людей идти назад, что является плохой сценой, если большинство участников конги выпивают (как это часто бывает). –

0

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

1

Дает направление движения: каждый шаг в направлениях является узлом и инструкцией по путешествию между каждым узлом в качестве вашей ссылки.

Пример:

Узел 1: Запуск дом

Ссылка: Прогулка 3 блоков Южного дома Боба

Узел 2: дом Боба

Ссылки: Прогулка 2 блоков на севере к Элис Дом.

Node 3: дом Алисы

Если вы хотите, чтобы получить одно место на другую, вы должны следовать ссылкам (инструкция) от каждого промежуточного места (узел), вы не можете просто пропустить от дома к Элис.

47

Я предполагаю, что вы хотите более метафорическое объяснение, чем определение книги, а не примеры того, как вы можете использовать связанный список.

Связанный список похож на охоту за мусорщиками. У вас есть ключ, и этот ключ имеет указатель на место, чтобы найти следующую подсказку. Итак, вы переходите к следующему месту и получаете еще один кусочек данных и другой указатель. Чтобы получить что-то посередине или в конце, единственный способ добраться до него - следовать этому списку с самого начала (или обмануть;))

+2

+1 Отличная метафора. Мне любопытно, как можно обмануть, но я подозреваю, что это просто юмор. –

+4

Lutz: чтобы обмануть, вы сохранили бы итератор из предыдущей операции, поэтому вам не придется снова перебирать в следующий раз. :) – 2009-03-13 19:33:23

+0

Ницца. Я одобряю. –

0

Посмотрите на Связанный список как структуру данных. Это механизм представления самоагрегации в OOD.И вы можете думать об этом как о объекте реального мира (для некоторых людей это реальность)

11

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

Единственная разница в эффективности различных операций. Самое главное:

  • Вставка посередине: O (1) для списка, O (n) для массива.
  • Прямой доступ к элементу в середине: O (n) для списка, O (1) для массива.

Таким образом, любая аналогия, которая может использоваться для массива (все двигатели плоскости, все элементы в списке покупок ...) также относится к связанному списку, но соображение эффективности может сделать это чтобы сделать еще одну аналогию:

Массив будет коробки в книжном шкафу. Когда вы удаляете ящик из n-й строки, все ящики с n + 1 вверх нужно перемещать на одну полку вниз (так что у вас нет хлопотной пустой полки).

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

+0

В примере ожерелья, а как насчет удаления? –

32

Что такое практический пример реального мира связанного списка?

Самый простой и самый простой поезд.

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

Например, завод Jiffy Mix нуждается в сахаре, муке, кукурузной муке и т. Д. Рядом с изгибом может быть предприятие по переработке бумаги, которое нуждается в хлоре, серной кислоте и водороде.

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

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

Конец поезда легче отсоединить, чем часть посередине, и значительно проще, чем отсоединить несколько автомобилей в одном месте и несколько автомобилей в другом месте.

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

Много как связанный список.

-Adam

2

Моя первая реакция на этот вопрос был «Посмотрите вокруг! Этот материал везде!» Но, немного подумав об этом, я не мог придумать ни одного примера, который не надуман.

Концепция связанного списка представляет собой сложную концепцию, состоящую из двух ферм. У вас есть представление о списке, что не представляет проблемы. Например, список продуктов. Затем вы попадаете в ссылку. Один пункт бакалеи не знает о следующем продуктовом элементе, поэтому модель ломается.

Я думаю, что причина, по которой у вас возникли проблемы с поиском реального мира, заключается в том, что часть ссылки представляет собой артефакт программирования, деталь реализации. Существует много способов реализации списков программным образом, и один хороший способ состоит в том, чтобы каждый элемент списка знал о своих соседях. Другой способ - иметь объект List, который отслеживает элементы и их порядок. Так работает большинство списков в реальной жизни. В приведенном выше примере объектом List для списка продуктов будет бумага (или что-то еще), на которой она написана.

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

1

Посмотрите на связанный список:

[A] => [B] => [C] => [D] =>

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

1

Телефонная цепочка реализована непосредственно как связанный список. Вот как это работает:

  1. Организатор группы собирает номера телефонов всех участников.

  2. Организатор назначает каждому члену номер другого члена для звонка. (Иногда они назначают свой номер, чтобы они знали, что сообщение прошло, но это необязательно.)

  3. Когда сообщение нужно отправить, организатор вызывает головку списка и доставляет сообщение.

  4. Головка вызывает номер, которому они были назначены, и доставляет сообщение.

  5. Шаг 4 повторяется, пока все не услышали сообщение.

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

5

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

реальных примеров:

  • куча людей, ожидающих в очереди то или другое - особый вид ЛЛ называется «очередь».

  • Стек посуды в вашем фарфоре шкаф - особый вид LL под названием «стопка».

  • «принять ряд» линии (где цифры должны начать снова в «1» в какой-то момент) - особый вид LL называется «круговой очереди».

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

Мой личный фаворит: Bogosort = играть в 52 карты, пока ваша колода не будет сортироваться. :-)

1

Связанный список очень похож на стопку бумаг, каждая с одним элементом на нем. (. В отличие от массивов, которые, как pegboards) Это обычно используется, чтобы решить проблему с этими характеристиками:

  • Есть неизвестное или изменчиво количество элементов
  • детали в порядке, подобно список
  • товары может быть изменен, добавлен в середине списка, удаленные в середине списка и т.д.

Перегруппировка простой массив является боль, добавив элемент где-то в середине, а убедившись, что массив имеет достаточно памяти и т. д. является болью. Со связанным списком эти операции просты. Предположим, что вы хотите переместить элемент № 10 между пунктом № 2 и пунктом №3. С бумагами вы можете просто поднять его и переместить. С массивом вам нужно будет перемещать элементы с 3 по 9 по слоту, а затем вставьте его. Со связанным списком вы выполните следующее: Скажите 9, что после 11 символов скажите 2 после 10, скажите 10 после того, как он равен 3.

Я использую несколько из них прямо сейчас, из-за того, насколько легко добавлять элементы и программно сказать «сделайте это действие для каждого элемента в списке». Одним из них является список записей, например, в электронной таблице. Другой, я делаю, просматривая этот первый список и добавляя ссылку на каждый элемент, который имеет определенное значение, чтобы я мог выполнять пакетные операции над ними. Возможность выхватывать предметы из середины или добавлять их в середину и не беспокоиться о длине массива. Это основные преимущества моего опыта.

8

Ваши молекулы ДНК являются списками с двойной связью.

0

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

может быть новой ОС используют некоторые напуганные структуры данных ... связанные списки могут быть использованы там

9

Кстати Авторство двигается вокруг кучки разработчиков программного обеспечения, работающих с различными модулями в проекте.

Во-первых, пользователь GUI обвиняется в том, что продукт не работает. Он проверяет свой код и видит, что это не его вина: API запутался. Парень API проверяет свой код: не его ошибка, это проблема с модулем регистратора. Парень модуля Logger теперь обвиняет парня базы данных, который обвиняет парня-установщика, который обвиняет ...

+0

Пример кругового связанного списка – Brandon

8

Цепь:

alt text

Особенно роликовая цепь:

alt text

Каждый элемент цепи соединен с его преемника и предшественника.

+4

+1 для ваших усилий –

1

Хорошо, если учитель взял своих учеников в мультфильм, но она не могла собраться вместе, она попросит учеников вспомнить адрес (номер места) следующего ученика и так далее ... чтобы она не придется сталкиваться с проблемой, возвращаясь !!!

+0

Почему это запрещено? Это единственный ответ здесь, возможно, в том, что касается необходимости связанного списка с учетом несмежного фактора. – nawfal

0

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

0

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

Обратите внимание, что каждая коробка может содержать многосетевые отсеки, содержащие стрелки (указатели) и информацию (данные).

+0

Добро пожаловать в SO! Боюсь, что ваш ответ не отвечает на вопрос. Объяснение структуры связанного списка в порядке, но за ним следует ответ на фактический вопрос: дайте пример того, какие объекты или отношения можно использовать для моделирования, например, пример автомобиля, данный в самом вопросе , – idoby

1

Он попросил практический пример; так что я сделаю снимок:

Допустим, вы пишете брандмауэр; в этом брандмауэре есть белый список IP и черный список IP.

Вы знаете, что ваш IP-адрес, IP-адрес вашей работы и некоторые тестируемые IP-адреса должны быть включены в белый список. Таким образом, вы добавляете все IP-адреса в белый список.

Теперь у вас также есть список известных IP-адресов, которые необходимо заблокировать. Таким образом, вы добавляете эти IP-адреса в черный список.

Зачем использовать LinkedList для этого?

  1. Операция быстро добавляет/удаляет элемент из списка.
  2. Вы не знаете, сколько IP заблокировано/включено в белый список. Таким образом, выявление одного из основных преимуществ LinkedList (он изменен).
1

Лучший и прямой пример двусвязного списка - Поезд!

enter image description here

Здесь Каждый тренер соединен со своим предыдущим и последующим тренера (за исключением первого и последнего)

С точки зрения программирования считают тренер тело в качестве данных (значение) узла и разъема в качестве опорного узла.

3

Человеческий мозг может служить хорошим примером отдельно Связанный список.На начальных этапах обучения что-то наизусть, естественный процесс - связать один предмет с другим. Это подсознание. Давайте возьмем пример грабительством вверх 8 строк Вордсворта Одиночные Жнец:

Behold her, single in the field, 
Yon solitary Highland Lass! 
Reaping and singing by herself; 
Stop here, or gently pass! 
Alone she cuts and binds the grain, 
And sings a melancholy strain; 
O listen! for the Vale profound 
Is overflowing with the sound. 

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

В то же время, если вы дадите ему указатель, он будет идти вперед. ОК начало с Reaping and singing by herself;?. Теперь становится легче. Это еще проще, если вы можете дать ему две линии: Alone she cuts and binds the grain, And sings a melancholy strain;, потому что он получает поток лучше. Аналогичным образом,, если вы ничего ему не дадите, он должен начать с самого начала, чтобы получить линии. Это классический связанный список.

В аналогиях, которые могут не соответствовать требованиям, должно быть немного аномалий, но это несколько объясняет, как работает связанный список. Когда вы становитесь несколько опытным или знаете стихотворение наизнанку, связанный список переводит (мозг) в хеш-таблицу или массив, что облегчает поиск O (1), где вы сможете выбирать строки из любого места.

0

Я не думаю, что есть хорошая аналогия, которая могла бы выделить две важные характеристики в отличие от массива: 1. эффективно вставлять после текущего элемента и 2. неэффективно находить определенный элемент по индексу.

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

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

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

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

0

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

0

Некоторые примеры одного связанного списка.

  1. Кнопка отмены любого приложения, такого как Microsoft Word, Paint и т. Д. Связанный список состояний.
  2. GPS-навигация: связанный список данных карты. Путешествие от источника к месту назначения является примером прохождения через все узлы. Перенаправление с помощью GPS - это пример операций добавления и удаления данных карты.

Некоторые примеры двойного перечня.

  1. Браузер Next и Previous Button: связанный список URL-адреса
  2. Microsoft Image телезритель Next и Previous Button: связанный список изображений
  3. UNDO и кнопки Photoshop, связанный список состояний Redo.
5

Реальный пример жизни для:.

** 1) односвязанны список **

  1. Человеческий мозг ребенка (Для того, чтобы что-то вспомнить, например, стихотворение он должен связать его, если вы спросите его о последней строке, которую он должен будет прочитать из первой строки)
  2. доставка сообщений по сети (сообщение разбивается на пакеты, и каждый пакет имеет ключ от следующего, так что в конце приемника он будет быть легким для их объединения)

2) двусвязному список

  1. молекулы ДНК
  2. кэш браузера, который позволяет использовать кнопку BACK.
  3. Железнодорожные автобусы связаны со следующим и предыдущим.
  4. роликовые цепи велосипеда (двоякокруговых связанный список)

3) круговой связанный список

  1. Эскалатор
  2. Время обмена Проблема используется планировщиком во время планирования процессов в Операционная система.
  3. Многопользовательская настольная игра
Смежные вопросы