Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПособиеСтруктДанн.doc
Скачиваний:
7
Добавлен:
01.03.2025
Размер:
1.51 Mб
Скачать

9.1. Последовательные таблицы

Новые записи помещаются в конец таблицы в порядке поступления. Поиск осуществляется перебором записей. Пусть таблица содержит N записей. Для успешного поиска единственной записи требуется просмотреть в среднем N/2 запи­сей; в случае неудачного поиска придется просмотреть всю таб­лицу, то есть N записей. Поиск по вторичному ключу требует просмотра N записей. В любом случае время поиска пропорционально размеру таблицы.

Для того, чтобы физически удалить запись из таблицы, требуется выполнить сдвиг на одну позицию вверх всех нижележащих записей, что требует значительного времени. Как правило, так не поступают. Вместо этого запись помечают как удаленную в специально отводимом для этого байте. Операция упаковки, то есть физического удаления помеченных на удаление записей производится изредка. Такова, например, дисциплина работы со старейшим форматом файлов баз данных – dbf – форматом. Удаленные записи можно "сшить" в стек свободного пространства и использовать для вставки новых записей.

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

Контрольные вопросы

  1. Напишите функцию, выполняющую физическое удаление записей из последовательной таблицы, помеченных символом ‘*’ в 1-м байте.

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

  3. Напишите функцию, помещающую новую запись в первую удалённую позицию последовательной таблицы, или в конец таблицы, если удалённые позиции отсутствуют.

9.2. Сортированные таблицы

9.2.1. Алгоритмы поиска в сортированной таблице

В обсуждаемых ниже алгоритмах для упрощения предполагается, что ключи – это целые числа, что никак не сказывается на сути дела. Примеры алгоритмов, свободных от каких – либо допущений будут приведены позже. Отметим, что для любого метода организации таблицы решение задачи поиска может быть сформулировано как решение уравнения Ключ=F(Адрес) относительно адреса при заданном ключе.

9.2.1.1. Бинарный поиск (дихотомия)

Бинарный поиск в сортированной таблице – это разновидность метода деления интервала пополам для решения уравнения f(x)=0.

Действительно, если ключи интерпретировать как числа, то в сор­тиро­ванной таблице они следуют в неубывающем порядке, например, как это изображено на рис. 31.

Рис.31. Постановка задачи поиска в сортированной таблице

Приведенный ниже алгоритм отыскивает индекс заданного целого числа в массиве сортированных целых чисел.

Int BinSearch(int Key, int n, int t[]){

// int t[] - массив длиной n, в котором производится поиск

// ключа Key

// в случае успеха функция возвращает индекс найденного

// элемента, а в случае неудачи - тот индекс, на котором

// находился бы ключ, если бы он был в таблице

int i,j,k;

i=0;j=n-1;

while(j>i+1){

k=(i+j)/2; // середина интервала

if(t[k]==Key) return k;

if(t[k]<Key){

i=k;

} else {

j=k;

}

}

if(t[i]<Key){

k=j;

} else {

k=i;

}

return k;

}

Очевидно, что число делений интервала пополам не превышает . Это и есть оценка быстродействия бинарного поиска. Функция bsearch, выполняющая бинарный поиск, входит состав библиотек, поставляемых практически с любым компилятором, и имеет прототип: