реализация связанного списка с использованием массива-преимущества и недостатки

Я знаю, как реализовать связанный список с помощью array. Например мы определяем структуру следующим образом:

struct Node{
    int data;
    int link;
}

"data" хранит информацию, а "link" - индекс в массиве следующего узла.

может ли кто-нибудь сказать мне, в чем преимущество и недостаток реализации связанного списка с использованием массива по сравнению с "обычным" связанным списком? Любое предложение будет оценено.

4 ответов


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

некоторые непосредственные недостатки:

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

Я полагаю, некоторые преимущества:

  1. если вы находитесь в 64-битной системе, ваши "указатели" будут занимать меньше места (хотя дополнительное пространство, необходимое для свободных записей, вероятно, перевешивает это преимущество)
  2. вы можете сериализовать массив на диск и прочитать его обратно с помощью mmap() легко позвонить. Хотя, было бы лучше использовать какой-то протокол буфер для переносимости.
  3. вы можете сделать некоторые гарантии о том, что элементы в массиве будут близки друг к другу в памяти.

может ли кто-нибудь сказать мне, в чем преимущество и недостаток реализации связанного списка с использованием массива по сравнению с "обычным" связанным списком?

связанные списки имеют следующие сложности:

  • минусы x xs:O (1)
  • добавить N m:O (n)
  • индекс i xs:O (n)

если ваше представление использует строгий непрерывный массив, у вас будет разная сложность:

  • минусы потребуют копирования старого массива:O (n)
  • append потребует копирования обоих массивов в новое непрерывное пространство:O (n + m)
  • может быть реализован как доступ к массиву: O (1)

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

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


стек в реализации два пути. во-первых, в использовании array и second используется связанный список.

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

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

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

стек-это lifo использование метода. но некоторые недостатки в реализации программы linked list.

большинство программистов используют Stack implemention, используя liked list.


используя реализацию массива, вы можете иметь последовательный и быстрый доступ к узлам списка, с другой стороны, Если вы реализуете связанный список с помощью указателей, вы можете иметь случайный доступ к узлам. Реализация массива полезна, когда вы имеете дело с фиксированным no. Из-за того, что изменение размера массива дорого, поскольку речь идет о производительности, потому что, если вам необходимо вставить/удалить узлы из середины списка, вы должны переместить каждый узел afterwise. Вопреки этому, вы следует использовать implemention указателя, когда вы не знаете нет. узлов, которые вы хотели бы, так как такой список может эффективно расти/сжиматься, и вам не нужно сдвигать какие-либо узлы, это можно сделать просто разыменовывая и ссылаясь на указатели.