Список (информатика): различия между версиями

Материал из Поле цифровой дидактики
м (1 версия импортирована)
Строка 1: Строка 1:
{{Значения|Список}}
Это [[абстрактный тип данных]], представляющий собой упорядоченный набор [[Значение переменной|значений]], в котором некоторое значение может встречаться более одного раза.  
В [[информатика|информатике]], '''спи́сок''' ({{lang-en|list}}) — это [[абстрактный тип данных]], представляющий собой упорядоченный набор [[Значение переменной|значений]], в котором некоторое значение может встречаться более одного раза. Экземпляр списка является компьютерной реализацией [[Математика|математического]] понятия конечной [[Последовательность|последовательности]].
Экземпляры значений, находящихся в списке, называются '''элементами''' списка либо; если значение встречается несколько раз, каждое вхождение считается отдельным элементом.
Экземпляры значений, находящихся в списке, называются '''элементами''' списка ({{lang-en|item, entry}} либо {{lang-en2|element}}); если значение встречается несколько раз, каждое вхождение считается отдельным элементом.
 
[[Файл:Singly-linked-list.svg|thumb|right|Структура односвязного списка из трёх элементов]]


Термином ''список'' также называется несколько конкретных [[Структура данных|структур данных]], применяющихся при реализации абстрактных списков, особенно [[Связный список|связных списков]].
Термином ''список'' также называется несколько конкретных [[Структура данных|структур данных]], применяющихся при реализации абстрактных списков, особенно [[Связный список|связных списков]].
Строка 39: Строка 38:
Списки в функциональных языках являются фундаментальной структурой. Большинство функциональных языков имеет встроенные средства для работы со списками вроде получения длины списка, головы (первый элемент списка), хвоста (часть списка, идущая за первым элементом), применения функции к каждому элементу списка ([[Map (программирование)|Map]]), [[свертка списка|свертки списка]] и пр.
Списки в функциональных языках являются фундаментальной структурой. Большинство функциональных языков имеет встроенные средства для работы со списками вроде получения длины списка, головы (первый элемент списка), хвоста (часть списка, идущая за первым элементом), применения функции к каждому элементу списка ([[Map (программирование)|Map]]), [[свертка списка|свертки списка]] и пр.


==== Язык [[Haskell]] ====
==== Язык [[Lisp]] ====
=== [[Императивное программирование|Императивные языки]] ===
== См. также ==
* [[XOR-связный список]]
* [[Линейный список]]
* [[Развёрнутый связный список]]
* [[Связный список]]
* [[Список с пропусками]]
{{rq|sources|refless}}
{{Типы данных}}
{{Структуры данных}}
[[Категория:Информатика]]
[[Категория:Структуры данных]]
[[Категория:Структуры данных]]
[[Категория:Статьи о списках]]
[[Категория:Типы данных]]
[[Категория:Составные типы данных]]

Версия 12:07, 19 октября 2022

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


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

Определение

При помощи нотации метода синтаксически-ориентированного конструирования Ч. Хоара определение списка можно записать следующим образом:

[math]\displaystyle{ List(A) = NIL + (A \times List(A)) }[/math]
[math]\displaystyle{ prefix = \text{constructor} }[/math] [math]\displaystyle{ List(A) }[/math]
[math]\displaystyle{ head, tail = \text{selectors} }[/math] [math]\displaystyle{ List(A) }[/math]
[math]\displaystyle{ null, nonnull = \text{predicates} }[/math] [math]\displaystyle{ List(A) }[/math]
[math]\displaystyle{ NIL, nonNIL = \text{parts} }[/math] [math]\displaystyle{ List(A) }[/math]

Первая строка данного определения обозначает, что список элементов типа [math]\displaystyle{ A }[/math] (говорят: «список над [math]\displaystyle{ A }[/math]») представляет собой размеченное объединение пустого списка и декартова произведения атома типа [math]\displaystyle{ A }[/math] со списком над [math]\displaystyle{ A }[/math]. Для создания списков используются два конструктора (вторая строка определения), первый из которых создаёт пустой список, а второй — непустой соответственно. Вполне понятно, что второй конструктор получает на вход в качестве параметров некоторый атом и список, а возвращает список, первым элементом которого является исходный атом, а остальными — элементы исходного списка. То есть получается префиксация атома к списку, с чем и связано такое наименование конструктора. Пустой список [math]\displaystyle{ [] }[/math] не является атомом, а потому не может префиксироваться. С другой стороны, пустой список является нулевым элементом для конструирования списков, поэтому любой список содержит в самом своём конце пустой список — с него начинается конструирование.

Третья строка определяет селекторы для списка, то есть операции для доступа к элементам внутри списка. Селектор [math]\displaystyle{ head }[/math] получает на вход список и возвращает первый элемент этого списка, то есть типом результата является тип [math]\displaystyle{ A }[/math]. Этот селектор не может получить на вход пустой список — в этом случае результат операции неопределён. Селектор [math]\displaystyle{ tail }[/math] возвращает список, полученный из входного в результате отсечения его головы (первого элемента). Этот селектор также не может принимать на вход пустой список, так как в этом случае результат операции неопределён. При помощи этих двух операций можно достать из списка любой элемент. Например, чтобы получить третий элемент списка (если он имеется), необходимо последовательно два раза применить селектор [math]\displaystyle{ tail }[/math], после чего применить селектор [math]\displaystyle{ head }[/math]. Другими словами, для получения элемента списка, который находится на позиции [math]\displaystyle{ n }[/math] (начиная с [math]\displaystyle{ 0 }[/math] для первого элемента, как это принято в программировании), необходимо [math]\displaystyle{ n }[/math] раз применить селектор [math]\displaystyle{ tail }[/math], после чего применить селектор [math]\displaystyle{ head }[/math].

Четвёртая строка определения описывает предикаты для списка, то есть функции, возвращающие булевское значение в зависимости от некоторых условий. Первый предикат возвращает значение [math]\displaystyle{ true }[/math] в случае, если заданный список пуст. Второй предикат действует наоборот. Наконец, пятая строка описывает части списка, которые, как уже сказано, представляют собой пустой и непустой списки.

Свойства

У определённой таким образом структуры данных имеются некоторые свойства:

  • Размер списка — количество элементов в нём, исключая последний «нулевой» элемент, являющийся по определению пустым списком.
  • Тип элементов — тот самый тип [math]\displaystyle{ A }[/math], над которым строится список; все элементы в списке должны быть этого типа.
  • Отсортированность — список может быть отсортирован в соответствии с некоторыми критериями сортировки (например, по возрастанию целочисленных значений, если список состоит из целых чисел).
  • Возможности доступа — некоторые списки в зависимости от реализации могут обеспечивать программиста селекторами для доступа непосредственно к заданному по номеру элементу.
  • Сравниваемость — списки можно сравнивать друг с другом на соответствие, причём в зависимости от реализации операция сравнения списков может использовать разные технологии.

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

Списки в языках программирования

Функциональные языки

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