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

          

Поиск и другие операции над таблицами


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

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

Предположение 1. На

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

  1. Любые два элемента
    Поиск и другие операции над таблицами
    сравнимы, то есть должно выполняться в точности одно из трех условий:
    Поиск и другие операции над таблицами
    ,
    Поиск и другие операции над таблицами
    ,
    Поиск и другие операции над таблицами
    .
  2. Порядок обладает транзитивностью, то есть если
    Поиск и другие операции над таблицами
    и
    Поиск и другие операции над таблицами
    , то
    Поиск и другие операции над таблицами
    для любых элементов
    Поиск и другие операции над таблицами
    . Мы используем обозначения
    Поиск и другие операции над таблицами
    ,
    Поиск и другие операции над таблицами
    ,
    Поиск и другие операции над таблицами
    в очевидном смысле. При анализе эффективности алгоритма поиска полагаем, что исход (
    Поиск и другие операции над таблицами
    ,
    Поиск и другие операции над таблицами
    или
    Поиск и другие операции над таблицами
    ) зависит от сравнения.

Предположение 2. Каждое имя в

Поиск и другие операции над таблицами
есть последовательность символов или цифр над конечным линейно упорядоченным алфавитом
Поиск и другие операции над таблицами
. Естественным порядком на
Поиск и другие операции над таблицами
является лексикографический порядок, индуцированный линейным порядком на
Поиск и другие операции над таблицами
. Мы полагаем, что исход (
Поиск и другие операции над таблицами
,
Поиск и другие операции над таблицами
или
Поиск и другие операции над таблицами
) сравнения двух символов (не имен) получается за время, не зависящее от
Поиск и другие операции над таблицами
или
Поиск и другие операции над таблицами
.

Предположение 3. Имеется функция

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

при отображении

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

Как уже было отмечено, поиск производится не в самом пространстве

Поиск и другие операции над таблицами
имен, а в конечном подмножестве
Поиск и другие операции над таблицами
множества
Поиск и другие операции над таблицами
, называемом таблицей. На большинстве таблиц, которые мы рассматриваем, определен линейный порядок, называемый табличным порядком: ему соответствует нижний индекс имени (то есть
Поиск и другие операции над таблицами
есть первое имя в таблице,
Поиск и другие операции над таблицами
- второе и тому подобное).
Табличный порядок часто совпадает с естественным порядком, определенным на пространстве имен, однако такое совпадение не обязательно.

Мощность таблицы
Поиск и другие операции над таблицами
обычно намного меньше, чем мощность пространства имен
Поиск и другие операции над таблицами
, даже если
Поиск и другие операции над таблицами
конечно.

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

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

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


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

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

поиск
Поиск и другие операции над таблицами
: если
Поиск и другие операции над таблицами
, то отметить его указателем, то есть переменной
Поиск и другие операции над таблицами
присвоить такое значение, что
Поиск и другие операции над таблицами
; в противном случае указать, что
Поиск и другие операции над таблицами
;

включение
Поиск и другие операции над таблицами
: если
Поиск и другие операции над таблицами
, то поместить его на соответствующее место.

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

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

исключить
Поиск и другие операции над таблицами
: если
Поиск и другие операции над таблицами
, то исключить его.

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

исключить с
Поиск и другие операции над таблицами
-го места: исключить
Поиск и другие операции над таблицами
из
Поиск и другие операции над таблицами
.До исключения
Поиск и другие операции над таблицами
\\ & После исключения
Поиск и другие операции над таблицами


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

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

распечатка: & напечатать все имена из
Поиск и другие операции над таблицами
в их естественном порядке

Среди всех операций, которые можно производить над таблицами, четыре, рассматриваемые в этой лекции (поиск, включение, исключение и распечатка), и сортировка (лекции 14, 15) - наиболее важные.


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