Комбинаторные алгоритмы для программистов

          

Связанное распределение


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

Связанное распределение

поставлен в соответствии указатель (ссылка)

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

Связанное распределение

Рис. 3.1. 

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

Связанное распределение
размещен сам элемент последовательности, а в поле
Связанное распределение
- указатель на следующий за ним элемент.

Linked list - список с использованием указателей: список, в котором каждый элемент содержит указатель на следующий элемент или два указателя - на следующий и предыдущий. Поскольку для

Связанное распределение
следующего элемента не существует, будем использовать обозначение
Связанное распределение
, где
Связанное распределение
- пустой , или нулевой указатель . Так как точные значения
Связанное распределение
для программиста не существенны, то в более общем виде связанное представление, показанное на рис. 3.1, можно изобразить так, как показано на рис.3.2.

Связанное распределение

Рис. 3.2.  Другой, более употребительный, способ представления списка

Связанное представление последовательностей облегчает операции включения элемента после некоторого

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


после такой операции элемента
Связанное распределение
в последовательности больше не будет (рис.3.3). Чтобы в последовательность, изображенную на рис. 3.2, включить новый элемент
Связанное распределение
, необходимо только воспроизвести новый элемент в некоторой ячейке
Связанное распределение
с
Связанное распределение
и
Связанное распределение
и присвоить
Связанное распределение
.Это изображено на рис.3.4.

Связанное распределение

Рис. 3.3.  Исключение элемента из связанного списка

Связанное распределение

Рис. 3.4.  Включение элемента в связанный список

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

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

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


Содержание раздела