Тема 5 Методы организации данных

advertisement
5-1
Тема 5 Методы организации данных
5.1
Списки, записи и поля
Списком называется множество записей, занимающих произвольные участки памяти, по-
следовательность обработки которых задается с помощью адресов связи.
Адресом связи называется атрибут, в котором хранится начальный адрес или номер записи, обрабатываемой после этой записи. Обычно последовательность обработки записи
определяется возрастанием значением ключа записи.
По заполненности списки подразделяются на:
Плотные списки - каждая ячейка содержит запись из файла, т.е. число ячеек в списке
равно числу записей в файле.
Пустой список - Ни одна из ячеек списка не содержит записи из файла
Неплотный список - отдельные ячейки списка пусты, а остальные содержат записи
файла.
Пустая ячейка - ячейка не содержит записи данного файла (хотя в ней может остаться
информации от предыдущего файла или "мусор"). Для выделения пустых ячеек проводится
их инициализация. Инициализация заключается в предварительном заполнении ячеек до их
использования некоторым образом, а именно:

Пробелами

Нулями

Установкой "флага" в одном или нескольких битах в некоторой части ячейки

Помещение некоторого литера в некоторой части ячейки
Поле - описывает атрибут объекта. Оно имеет характеристики:
1. Имя - однозначно идентифицируется через данную характеристику.
2. Позицию - занимает фиксированную позицию в записи или фиксированную позицию по
отношению к другим полям.
3. Размер - длина выраженная в байтах или литерах и достаточная для размещения всего
диапазона возможных значений.
4. Переменный формат - длина поля может меняться от записи к записи. Для такого поля
вводится дополнительная ячейка, описывающая длину поля. Т.е. поле переменной длины
состоит из двух подполей ДЛИНА и ЗНАЧЕНИЕ.
5. Множественность - некоторые атрибуты могут принимать одновременно несколько значений. Например, с поиском документа в системе связано несколько дескрипторных
слов, по которым может осуществляться поиск, или запрашиваемый список предыдущих
мест жительства какого-либо лица может оказаться несколько или ни одного. Обычно за-
5-2
дается счетчиком. Отсутствие такого поля переводит счетчик в нуль. Иногда для обозначения конца записи используется некоторый разделитель
В структуре записи последовательного массива выделяются один или несколько
ключевых атрибутов по значениям, которых происходит доступ к остальным значениям атрибутов.
Записи в списках могут быть упорядочены или не упорядочены по ключевым атрибутам
5.2
Алгоритмы обработки данных
Наиболее часто применяемыми алгоритмами обработки данных являются:

формирование данных;

поиск и корректировка;

последовательная обработка.
Для ИС поиск данных является одной из основных и трудоемких задач. Поиск данных
может проводиться в случайном и упорядоченном списке.
Обычно данные возникают в неупорядоченной форме, а именно в виде случайного списка. В случайном списке записи располагаются в ячейках без учета значения ключей. Процедуры упорядочивания данных часто называют сортировкой.
5.2.1 Сортировка
Сортировку можно проводить в оперативной памяти, а можно на внешних носителях, с
использованием методов слияния.
5.2.1.1 СОРТИРОВКА В ПАМЯТИ
Пусть сортируемые записи размещены во входном списке I. Мы хотим получить выходной список S, записи которого упорядочены по возрастанию ключей:
Все операции над записями из списка I выполняются в памяти. Какой бы метод мы не
использовали, всегда нужно учитывать исходную организацию записей в этом списке, т. е.
он может быть
• полностью упорядоченным;
• частично упорядоченным;
• уже упорядоченным;
• упорядоченным, но не в том порядке (например, не по возрастанию, а по убыванию).
Методы сортировки
Перечислим методы, используемые для сортировки в зависимости от организации
списка и числа содержащихся в нем записей.
Один список. Сортировку можно провести простой перестановкой записей в списке I.
5-3
Тогда S — переписанный список I. В дальнейшем всегда будем предполагать, что S и I занимают одно и то же место в памяти.
Два независимых списка. Списки I и S могут быть независимыми. Записи из I передаются в S так, что после выполнения операции результирующий список S оказывается упорядоченным.
Вспомогательный список. Иногда для внутренней сортировки требуется ввести вспомогательный список, А он используется для хранения записей из I. С помощью А ускоряется
процесс образования списка S.
Обычно список А придается в дополнение к входному списку I и упорядоченному
выходному списку S.
Сортировка включением
При использовании этого метода сортировки I ведется как полуплотный список. При
переносе записи из L ей находится, место в I, после чего раздвигается (плотная) заполненная
часть списка, чтобы освободить место для новой записи. Эта операция повторяется до тех
пор, пока список I не будет заполнен. Записи в I, упорядочены, и поэтому его можно называть списком S.
Отбор
Список I полностью заполняется записями из L (записи поступают последовательно).
Далее в I ищем запись с наименьшим ключом и помещаем ее в начало S. Возвращаемся в I и
ищем запись с наименьшим (после выбранного), ключом. Ее помещаем за предыдущей записью в S и т. д. После завершения операции все записи из L окажутся размещенными в S в
заданном порядке.
Подкачка
Некоторые методы внутренней сортировки сводятся к подкачке, которая иллюстрируется рис. 5.2.2 Например, здесь показан описанный выше отбор с перестановкой. На место
записи, которая передается из I в S (1), подается очередная запись из L (2). Операция продолжается до тех пор, пока не заполнится весь список S (3, 4, 5, 6). В дальнейшем будет показано, что при таком подходе размер S может примерно вдвое превосходить размер I.
Рассмотренные нами методы дают только общее представление о сортировке. Пользователю может быть доступен универсальный пакет программ сортировки с существенно
5-4
более сложными методами.
5.2.1.2 ЭЛЕМЕНТЫ СОРТИРОВКИ
Разберем более подробно элементы сортировки.
Включение
При сортировке методом включения записи поступают в ЭВМ из внешнего списка L,
причем порядок их поступления к программе случаен. На выходе формируется полуплотный
упорядоченный список S. Размер списка предварительно определяется программно или задается пользователем. Перед началом сортировки полуплотный список пустой — он не содержит записей и в нем отсутствует плотная часть.
Сортировка начинается с передачи первой записи из L в начало S. Если ключ второй
записи в L больше ключа первой, то она помещается в S вслед за первой записью. В противном случае первая запись сдвигается вниз на одну позицию и на ее место вводится вторая
запись.
Сортировка аналогична добавлению новой записи в полуплотный список. Как только
встречается новая запись, для нее ищется место в So. Записи из So с большими ключами
сдвигаются вниз, чтобы освободить ячейку для этой новой записи и сохранить установленный в плотной части порядок.
В список S новые записи поступают до тех пор, пока он весь не заполнится. Число записей фиксированной длины в S определяется заранее. Для записей же произвольной длины
можно сказать, что данный список заполнен, если очередная запись из L целиком в него не
помещается.
Во время общей сортировки заполненный список S записывается на внешний носитель и освобождается для приема следующего входного потока.
Отбор
Для сортировки методом отбора входная область I заполняется записями. Далее выбирается и выводится наименьшая из них, затем вновь выбирается и выводится наименьшая
из оставшихся т. д.
На ,рис. 5.3.1—5.3.3 показана процедура сортировки с отбором. В изображенные
здесь три регистра помещаются следующие данные:
в IKR—ключ наименьшей из встречающихся записей;
в IPR — указатель вызываемого адреса (т. е. адрес записи с ключом из регистра IKR);
в SPR (РЕГИСТР УКАЗАТЕЛЯ СОРТИРОВКИ) —
указатель адреса ячейки из S, в которую
будет помещена запись.
Инициализация. В начале поиска анализируется первая, запись из I и записывается в
IKR. Адрес этой записи или ее порядковый номер заносится в IPR:
5-5
Осуществляется переход к следующей записи, и ее ключ сравнивается с ключом IKR.
Если этот ключ оказывается меньше последнего, то он записывается в IKR, а положение записи фиксируется в IPR. Таким образом, проверяются все записи из I.
Если ключ J записи больше ключа из IKR, то никаких действий не предпринимается.
Поиск оканчивается после анализа всех записей из I. В результате имеем
(IКР)<=(Ijk)(для всех j),
т. е. содержимое IKR меньше или равно любому ключу записи из I
Пример. На рис. 5.3.1 показано содержимое регистров IKR и IPR после просмотра трех первых записей из I
• IKR содержит 15, что соответствует ключу I3.
• IPR содержит 3, т. е. порядковый номер Iз.
• SPR содержит 1, так как первая запись еще не помещена в S.
Заметим, что на практике при сортировке IPR, вероятно, будет содержать абсолютный адрес I3.
Ключ записи в ячейке I4 равен 21. Так как 21 дольше 15, то все три регистра остаются неизменными.
Мы знаем, что ключ в I5 равен 12 и меньше 15. Следовательно, ключ этой записи заносится в IKR, а ее порядковый номер 5— в IPR. На рисунке этот процесс показан полужирными дугами.
Передача. Как показано на рис. 5.3.2, после просмотра всех записей из I, IKR содержит наименьший ключ, а IPR —порядковый номер записи с этим
ключом.
Теперь можно передать запись из I в S:
• IPR указывает место записи (I10) в списке.
5-6
Сплошной линией изображен процесс передачи записи в пустую ячейку. Этот процесс можно записать так:
((IPR))-> (SPR)
где IPR—регистр, (IPR)—содержимое этого регистра (указатель) и ((IPR)) запись, на
которую указывает (IPR).
Обновление. Если бы мы провели еще раз поиск в I вышеописанным способом, то получили бы те же результаты. Поэтому сначала следует удалить пересланную из I запись, которая еще здесь присутствует. При этом ее не обязательно уничтожать, можно просто записать на место ключа специальный индекс, который сделал бы этот ключ большим остальных.
Для обозначения ключа, заведомо большего любого другого, здесь используется символ . Такой ключ записывается в (IPR) уже скопированной записи:
  (IPR)
На рис. 5.3.3 показана последовательность операций, выполняемых после того, как
запись в ячейке I10 с ключом 3 переслана в S. Старый ключ 3 заменяется на  (1). SPR изменяется с 1 на 2, т. е. указатель показывает на следующую свободную ячейку из S (2).
Наконец, регистры IPR и IKR устанавливаются на начало списка I, откуда может повторно
начаться поиск (3, 4).
Эта последовательность операций повторяется до тех пор, пока входной список I не
будет исчерпан. Для записей фиксированной длины окончание сортировки определяется
подсчетом скопированных записей. Данный метод можно использовать и для записей переменной длины, если известно число размещенных в I записей. Сортировка считается законченной и в том случае, если при очередном поиске в IKR попал символ :
(IKR) == : стоп
Отбор и обмен
Метод отбора и обмена подобен простому отбору, за исключением того, что в результате переупорядочивается входной список L. Это дает ряд преимуществ:

не требуется дополнительного места для S;

вместо того чтобы хранить копию записи с измененным ключом, можно пере-
5-7
ставить запись в списке и в дальнейшем ее не рассматривать;

каждый раз просматривается не весь список, а только его неупорядоченная
часть.
Входной список I во время сортировки как бы состоит из двух частей: Is—
упорядоченной и Iu—неупорядоченной. По аналогии с полуплотным списком назовем такой список полуупорядоченным. В процессе сортировки упорядоченная часть будет возрастать, а неупорядоченная—сокращаться до тех пор, пока все записи не окажутся размещенными в упорядоченной части.
Инициализация. Сохраним прежние обозначения регистров. Первый просмотр осуществляется так же, как и для случая сортировки, простым отбором. После его завершения
регистры IKR, IPR и SPR содержат соответственно ключ и номер позиции записи с
наименьшим ключом и указатель на начало входного списка, как показано на рис. 5.3.4.
Теперь выбранная запись не пересылается, а меняется местами с первой записью из
списка. В примере, приведенном на рис. 5.3.4, запись с наименьшим ключом 3 найдена в I10,
указатель на нее заносится в IPR. Записи из I1 и I10 меняются местами. Таким образом запись с наименьшим ключом попадает в начало списка, а запись с ключом 28 (бывшая первая) помещается в. I10. Регистры SPR и IPR содержат адреса этих двух записей.
Заметим, что записи должны меняться местами, но не перекрываться при пересылке (1). Для передачи из I1 в Iio следует воспользоваться промежуточным регистром
(например, TR), иначе может быть испорчена другая запись списка. Итак, запишем:
((IPR))  (SPR), ((SPR)) ))  (IPR)
Продолжение сортировки. Теперь, когда записи поменялись местами, Iu содержит
только одиннадцать записей.
Повторная инициализация сводится к настройке регистров SPR (2) и IPR (3) на
начало неупорядоченной части списка Iu. Ключ первой записи из Iu заносится в IKR (4),
5-8
как показано на рис. 5.3.4:
(SPR) + 1 -> SPR, IPR; ((IPR))k ))  IKR
Сравнение проводится для оставшихся десяти записей. Результат этой операции показан на рис. 5.3.5. Третий этап сравнения представлен на рис. 5.3.6.
Завершение сортировки. Процесс продолжается до тех пор, пока все записи не
будут размещены соответствующим образом. Это определяется либо числом обращений
к списку, либо значением указателя SPR перед началом очередного просмотра.
Отбор с подкачкой
Для многих видов сортировки полезно использовать подкачку. Подкачка не дает
особого эффекта в случае сортировки с отбором, но на примере этого метода удобно
продемонстрировать ее основные принципы.
Для подкачки определены три списка:
• L — исходный, хранящийся на внешнем носителе;
• I — неупорядоченный список в памяти, подлежащий сортировке;
• S — упорядоченный выходной список.
Как только запись копируется из I в S, в ячейку, ранее занимаемую этой записью,
подается (подкачивается) новая запись из L.
Подкачка весьма эффективна при сортировке с использованием вспомогательных
списков, например при квадратичной сортировке. Для отбора с подкачкой выбираемая запись заменяется новой и операция отбора повторяется без изменений.
Отбор с подкачкой позволяет получить выходной список большего размера, чем
входной 1. Некоторые из записей, которые заменили пересланные в выходной список S, могут в результате сортировки также попасть в этот список. Другие, меньшие последней пересланной в S, в него не попадут. Математически показано, что размер выходного списка
приблизительно вдвое превосходит размер входного.
Пример. Предположим, что в S уже поступило i записей, причем последняя из IJ. По правилам отбора с
подкачкой в освободившиеся ячейки заносятся очередные записи из внешней области (L). Если первоначально
в I содержалось n записей, то добавление очередной записи из L даст n+1, причем
Ln+i  Ij
Поиск наименьшей записи. В процедуре отбора с подкачкой есть одно исключение.
Очевидно, что нам больше не требуется метить символом  ключи выбранных записей, так
как запись здесь заменяется новой. Следовательно, каждый раз просматривается весь список I. Однако мы не просто хотим найти наименьшую из имеющихся записей. Наш выходной список формируется теперь по новому правилу. Найденная наименьшая запись может
быть меньше последней из пересланных в S записей. Следовательно, мы ищем в I наимень-
5-9
шую запись, которая будет больше последней пересланной в S записи.
Процедура поиска начинается так же, как и при простом отборе:
(Ijk) ))  IKR, 1))  IPR, j=2
Теперь, остановившись на j-й записи в I (Ij), мы должны быть уверены в том, что выполняются два условия:
• ключ этой записи меньше ключа в IKR;
• ключ этой записи больше ключа последней записи, переданной в Si:
(Ijk) )) <IKR,
(Ijk) )) >(Sik)  IKR, jIPR, j+1j
•Если эти условия не выполняются, мы переход к следующей записи в I:
(Ijk) )) >IPR, или (Ijk) ) >(Sik): j+1j
Пример. Рассмотрим пример, приведенный на рис. 5.3.7. Ранее в I6 находилась запись с ключом 9, которая стала третьей записью Sз в выходном списке S. В I6 теперь содержится запись с ключом 7 (в результате
подкачки). Проверим ключи записей из I. Запись I4 имеет ключ 21, больший содержимого IKR, поэтому она
пропускается — ведь мы ищем наименьший ключ. Таким ключом (12) обладает I5. Он больше, чем 9 в S3, следовательно, в регистры IKR и IKP заносятся новые значения.
Рис. 5.3.7. Отбор с подкачкой в случае, когда запись с меньшим ключом заменяет большую выходную
Ключ 7 из I (I6) меньше ключа 12 из IKR, но он меньше и ключа 9 последпей записи, переданной в S,
следовательно, J6 в S не заносится. Записи в S упорядочены, и хотя ключ 7 верен, он нарушит порядок в
S.
Заметим, что если бы ключ записи I6 был равен 11, то эта запись попала бы в выходной список S.
Завершение сортировки. Сортировка и подкачка выполняются до тех пор, пока находятся нужные записи. Если же все записи (включая подкаченные) имеют меньшие ключи,
чем последняя из записей в S, то нам нечего больше добавлять в список и, следовательно, он
является заполненным:
(Ijk) )) >(Sik) (для всех j: стоп)
В I содержится целый новый набор записей, но ключ любой из них меньше ключа последней записи из S. Выведем выходной список из S и начнем сортировку заново. Наименьшая запись из I становится первой в новом выходном списке.
В какой-то момент во внешнем списке L не останется ни одной записи. Сортировка
записей в I будет происходить уже без подкачки, и свободные ячейки опять придется метить.
После окончания сортировки в I выдаются все упорядоченные выходные списки.
5-10
5.2.2 СЛИЯНИЕ
Зачем нужно слияние
В результате внутренней сортировки в списке создается несколько упорядоченных
подфайлов. Мы же хотим иметь один упорядоченный файл. Возможности основной памяти
ЭВМ ограничивают размеры такого файла, полученного внутренней сортировкой. В условиях этого ограничения мы формируем файлы, содержащие несколько упорядоченных подфайлов. Теперь наша задача состоит в том, чтобы из сформированных подфайлов создать
упорядоченный файл. Эта операция называется слиянием. Последовательно применяя операцию слияния к файлам, которые состоят из упорядоченных подфайлов, полученных в результате внутренней сортировки, мы получим требуемый упорядоченный файл.
На рис. 5.4.1 показан процесс построения упорядоченного файла с из двух упорядоченных файлов а и b.
Здесь и в последующем описании запись представляется
как состоящая из одного ключа. На самом деле пересылается вся запись.
Далее мы рассмотрим слияние двух .файлов, каждый из которых состоит из нескольких упорядоченных
подфайлов, а также сортировку полностью неупорядоченного файла.
Слияние двух упорядоченных файлов
Слияние двух упорядоченных файлов а и b в один
упорядоченный файл с можно начать сверху (с наименьшего ключа) или снизу (с наибольшего ключа). Выберем
первый способ. Какие правила слияния здесь применяются?
Выбор первой записи. На рис. 5.4.2 показана проверка отношения между ключами первых
записей из а и b. Стрелка направлена в сторону большего ключа: t>i (12) меньше ai (25); bi
заносится в начало нового файла с (ci). На рисунке пересылка bi из b в Ci списка с изображена полужирной линией.
Выбор очередной записи. Пусть требуется сравнить i-ю запись ai из а и j-ю запись b;
из b. На рис. 5.4.3 дугой показано сравнение аi иbJ с учетом значения ключа последней запи-
5-11
си ci+j-2 из общего списка. В данном случае обе записи больше Ci+j-2 (почему?). Поэтому в
новом файле с записью Сi+j-1 становится запись с наименьшим ключом.
Исчерпан один из файлов. Рано или поздно хотя бы в одном файле будут просмотрены -все записи. На рис. 5.4.в результирующий файл с помещается последняя запись bm из b.
записей в b больше нет и все оставшиеся записи из а в том же порядке помещаются в С. Эта
операция называется сбросом. Ключи всех оставшихся записей из a больше ключа bm (почему?).
Файлы, состоящие из упорядоченных подфайлов
На рис. 5.4.5 показано слияние двух файлов, состоящих из упорядоченных подфайлов а и b в результирующий файл с. В каждом файле имеется запись, в которой есть две исходящие дуги инет входящих. Эта запись является начальной записью (a5 и b5,) следующего
подфайла (а и b соответственно). Записи a5 и b5 меньше
соседних с ними записей (принадлежащих к разным
файлам). Они называются пороговыми и отделяют
упорядоченные подфайлы в файле. Если ключ очередной записи меньше предыдущего, значит, эта очередная
запись является пороговой.
В зависимости от числа пороговых записей в а возможны четыре различных способа
слияния, которые рассматриваются ниже
Пороговая запись отсутствует. На рис. 5.4.6 показана ситуация, когда в подфайлах еще не встретились пороговые записи. Обе рассматриваемые записи ai (17) и bj (10)
больше последней записи Cj+1-a. На рис. 5.4.5 это записи а^, b4 и С4. В общем случае в
качестве очередной записи Ci-)-]-i выбирается наименьшая из записей ai и bj (почему?). В
нашем примере b4 (10), меньше, поэтому она становится записью с?,
Одна пороговая запись. В ситуации, представленной на рис. 5.4.7, имеется лишь
одна пороговая запись D]. На рис. 5.4.5 этой ситуации соответствуют записи ал, bs и
Ст. Запись bs (5) ;
меньше последней из рассматриваемых ранее b4 (10). Следова-1 тельно, она
5-12
меньше и последней записи Ст из с. Кроме того, а4 1 записей из него до тех пор, пока
не встретится пороговая запись »
в а. Запись &\ выбирается как очередная для с (она
больше Ст). ^Теперь результирующий упорядоченный подфайл передается в выходной
подфайл. Начало следующего упорядоченного подфайла в а определяется пороговой
записью.
Если пороговая запись встретилась только в а, то в с выбираются записи из Ь,
пока в последнем не встретится пороговая запись.
Две пороговые записи. Ситуация с двумя пороговыми яяпигями—в РПИРКЯУ а и h—иллотгтпипуется
пиг.- 5.48. Тпебуется слить два подфайла из а и Ь и получить один упорядоченный подфайл из с. Последняя ' запись из результирующего "подфайла (17) всегда больше следующей записи ai из
а (3) или Ь) из Ь (5), ведь последние записи из обоих списков
Для следующего слияния в качестве
первой записи выОираем наименьшую из двух
пороговых записей (3). Пороговых записей
больше нет.
Завершающий
сброс. Как показано на
рис. 5.4.4, после того как последняя запись из Ь передана в результирующий ' файл, все
записи из а передаются в с, т. е. происходит сброс. Эта операция выполняется независимо от того, есть ли пороговые записи (так как в а может быть несколько упорядоченных под' файлов). Аналогичная операция выполняется и для Ь.
Многопутевое слияние
'""''•
|
Мы рассмотрели операцию слияния двух списков, содержащих упорядоченные
подсписки. Если усложнить программу, то можно выполнить слияние нескольких таких
списков. Число списков | пппрлеляет число путей слияния• i Пример слияния трех файлов а, Ь и с, состоящих из упорядо-ченных подфайлов, в файл d приведен на рис. 5.4.9.
применима и в случае четырех, пяти и т. д, файлов. Входные файлы а, Ь и с здесь такие же, как и на рис. 5.4.9. Входные записи обозначены своими индексами из списков, которым они принадлежат;
ai, bj и ср. Последняя выходная запись обозначена через di. Следующей, будет запись
di+i.
Для удобства анализа записи на рисунке располагаются горизонтально, а не вертикально. Наименьшей начальной записью из трех файлов является сь, она заносится в di+i.
Это вполне допустимо, так как пороговые записи отсутствуют, и все записи превышают по-
5-13
следнюю выходную.
Пороговая запись. При достижении наименьшей записи,
ла. На рис. 5.4.11 изображена одна Пороговая запись в с. Ключ 7 в ci меньше
ключа 23 в di. Начиная с этой записи выполняется
На рис. 5.4.12 показан случай с двумя порогами. Пороговые ааписи имеются и в
а, И в с. Тогда в результирующий файл заносятся записи только ия h. Эта опрпяиия выполняется, так как записи в другом файле меньше последней (36) из всех подлежа
щих выводу.
Если нам попадутся одновременно три пороговые записи, мь
продолжим слияние до тех пор, пока вновь не встретим один ил(
два порога и т. д.
Сброс. При исчерпании одного из файлов, что определяет
ся индикатором конца файла, для оставшихся слияние будет про
должаться (но с меньшей мощностью). В случае слияния тре;
5.6. БИНАРНЫЙ ПОИСК
Введение
Бинарный поиск является весьма эффективным, поскольку при каждом последовательном обращении число просматриваемых записей сокращается вдвое. Это позволяет
быстро достигнуть искомой записи. Единственный недостаток такого поиска — между двумя просмотрами необходимо проводить определенные вычисления, что увеличивает его общее время. К тому же его выгодно использовать только для плотных упорядоченных файлов,
а файл в любом случае должен бытьупорядоченным,
5-14
Поиск начинается приблизительно с середины списка. Ячейки, разделяющая последний на- две части,' называется рубежом. , Сравнивая ключ рубежа (ключ записи в ячейке
рубежа) с искомым, мы определяем, к какой части списка следует обращаться.
Выделенная половина списка опять некоторым образом делится пополам. Разделяющая ячейка в этом случае называется вторым рубежом. Ключ второго рубежа определяет, в какой части этого нового списка будет возобновлен поиск.
Продолжая разбиение, выделяем одну восьмую, шестнадцатую и т. д. части списка,
пока во всех подсписках в верхних и нижних частях, разделенных рубежами, не останется
ровно по одной ячейке. Тогда следующее обращение будет последним. Сравнение последнего ключа рубежа с требуемым либо даст искомую запись, либо определит ее отсутствие
Пример. На рис. 5.6.1 в списке L ищем запись с ключом k. Сначала находим рубеж
Fi; его ключ (Fip) = /in сравниваем с k:
• еслиГщ == k, то запись найдена;
• если fin < k, то нижняя часть L становится aL;
• если fin > k, то верхняя часть L становится zL.
Далее осуществляем поиск Рд в sL и /ак сравниваем с k, определяя »L. Затем в sL
ищем Рз и определяем 4!-. В конце концов достигаем n-iL, в котором содержится три записи с Fn-i посредине. Это ключ рубежа. Если он ае
является искомым, с его помощью можно определить, какая запись (верхняя или
нижняя) станет последним рубежом Fn. Если мы уверены в том, что искомая запись в списке
присутствует, то проверять Fn не требуется. Последнее обращение определяет, является ли
запись (Fn) = fa искомой или последняя вообще отсутствует.
С каждым новым обращением вероятность того, что рубеж содержит иск-;)-мую запись, увеличивается, так как уменьшается число ячеек списка. Мы никогда не сможем обратиться к Fn, если искомая запись содержится в Fi, i < п.
Идеальный размер списка
5-15
Идеальным считается такой размер списка, при котором на, любом шаге поиск выполняется надлежащим образом. Чтобы
Download