Гадасин_Д_В_Методические_указания_по_выполнению_практических_занятия
.pdf
Рис.4 Структура записи с 308 байтами
Задание 3
Группирование записей постоянной длины в блоках
Записи, представляющие кортежи отношения, хранятся в дисковых блоках и перемещаются в оперативную память при необходимости их считывания или обновления.
Структура блока, содержащего записи отношения.
Рис5. Структура типичного блока записей.
Блок может быть снабжен необязательным заголовком, способным содержать следующую информацию:
- ссылки на один или несколько других блоков, являющихся частью сети блоков,
которая используется для создания структур индексов;
-сведения о функции, выполняемой блоком в составе подобной сети блоков;
-данные о том, кортежи какого отношения представляются записями текущего блока;
-таблицу со значениями смещения каждой записи от начала блока;
-идентификатора блока;
-значения моментов времени последнего обращения к блоку и/или его модификации.
В простейшем случае блок содержит записи, отвечающие кортежам одного отношения и формат этих записей фиксирован. Поэтому вслед за заголовком в блоке располагается такое количество записей, которое удается уместить; оставшееся пространство блока не используется.
11
Задача к решению 3.
Необходимо упаковать в блоки размером A байт содержимое отношения типа Работник; каждый кортеж отношения представляется записью, структура которого должна соответствовать рис.1. Значение длины записи необходимо взять из решения задания 1.2
своего варианта. Под заголовок блока отводится число, соответствующее длине заголовка из задания 2 своего варианта. Необходимо найти количество записей и количество оставшихся байт.
Исходные данные для задачи – 25 вариантов
Вариант |
Заголовок |
Блок |
|
|
|
0 |
12 |
4096 |
|
|
|
1 |
18 |
1024 |
|
|
|
2 |
24 |
2048 |
|
|
|
3 |
12 |
3072 |
|
|
|
4 |
18 |
4096 |
|
|
|
5 |
24 |
5120 |
|
|
|
6 |
12 |
6144 |
|
|
|
7 |
18 |
7168 |
|
|
|
8 |
24 |
8192 |
|
|
|
9 |
12 |
9216 |
|
|
|
10 |
18 |
1024 |
|
|
|
11 |
24 |
2048 |
|
|
|
12 |
12 |
3072 |
|
|
|
13 |
18 |
4096 |
|
|
|
14 |
24 |
5120 |
|
|
|
15 |
12 |
6144 |
|
|
|
16 |
18 |
7168 |
|
|
|
17 |
24 |
8192 |
|
|
|
18 |
12 |
9216 |
|
|
|
19 |
18 |
1024 |
|
|
|
20 |
24 |
2048 |
|
|
|
21 |
12 |
3072 |
|
|
|
22 |
18 |
4096 |
|
|
|
23 |
24 |
5120 |
|
|
|
24 |
12 |
6144 |
|
|
|
25 |
18 |
7168 |
|
|
|
Разбор 0 варианта
1.Для того, чтобы рассчитать количество записей необходимо от размера
общего блока отнять размер заголовка блока, который равен размеру заголовку записи
12
4096 − 12 = 4084
2. После того как мы получили фактический размер блока, в котором мы можем размещать записи мы можем посмотреть сколько записей у нас влезает в этот объем:
4084
308 = 13,25
3. Получается, что можно вместить 13 записей, округление происходит в меньшую сторону, так как мы не можем выйти за выделенный объем.
4. Осталось посчитать остаток, так как числа получись не целыми. Для этого из размера блока без заголовка отнимаем количество байт, которое будет занимать 13 записей.
4084 − 308 13 = 80 байт Для размещения записей возможно использовать 4084 байта, в которых поместятся 13
записей, 80 байта остаются свободными.
Задача 4
Плотные индексы
Плотным называют индекс, содержащий ключи для каждой записи файла данных.
Записи файла плотного индекса упорядочиваются таким же образом, как и записи файла данных. Поскольку ключи и указатели занимают существенно меньшее пространство,
нежели полные записи, можно ожидать, что для хранения индекса потребуется гораздо меньше дисковых блоков. Плотный индекс позволяет системе с успехом обрабатывать запросы, в которых предполагается отыскание записей по заданному значению ключа.
Система просматривает блоки индекс в поисках значения К ключа, а затем, когда запись индекса с ключом К найдена, обращается по указателю, адресующему запись данных с тем же ключевым значением. Для отыскания записи индекса с ключом К, система не должна просматривать каждый блок индекса, т.к. существует ряд факторов, которые позволяют увеличить производительность операций поиска по индексу.
1.Размер файла индекса обычно существенно меньше объема файла данных.
2.Поскольку ключи хранятся в упорядоченном виде, для отыскания значения К уместно использовать алгоритм бинарного поиска. Если индекс содержит n блоков, системе придется обратиться только к log2n из них.
3.Индекс может быть настолько мал, что его удастся целиком загрузить в оперативную память и хранить здесь в течение такого промежутка времени, какой требуется, в этом случае для отыскания ключа поиска К достаточно выполнить ряд операций в оперативной памяти, не обращаясь к диску.
13
Рис 6. Плотный индекс для последовательного файла
Задача к решению 4.
Пусть дано отношение, содержащее A кортежей, причем для хранения 10
используется блок B байт. Длина ключевого поля равна С, Указатель D, Заголовок блока E.
Необходимо найти:
1.количество пар «ключ-указатель»
2.количество блоков для построения плотного индекса
3.по алгоритму бинарного поиска определить количество операций, которое потребуется совершить, чтобы достать запись.
Исходные данные для задачи – 25 вариантов
Вариант |
A |
B |
C |
D |
E |
|
|
|
|
|
|
0 |
1000000 |
4096 |
32 |
8 |
96 |
|
|
|
|
|
|
1 |
1000000 |
1024 |
12 |
4 |
0 |
|
|
|
|
|
|
2 |
1000000 |
2048 |
96 |
2 |
88 |
|
|
|
|
|
|
3 |
1000000 |
3072 |
14 |
8 |
124 |
|
|
|
|
|
|
4 |
1000000 |
4096 |
47 |
4 |
16 |
|
|
|
|
|
|
5 |
1000000 |
5120 |
37 |
2 |
50 |
|
|
|
|
|
|
6 |
1000000 |
6144 |
76 |
8 |
96 |
|
|
|
|
|
|
7 |
1000000 |
7168 |
30 |
4 |
28 |
|
|
|
|
|
|
8 |
1000000 |
8192 |
61 |
2 |
2 |
|
|
|
|
|
|
9 |
1000000 |
9216 |
68 |
8 |
20 |
|
|
|
|
|
|
10 |
1000000 |
1024 |
52 |
4 |
16 |
|
|
|
|
|
|
14
11 |
1000000 |
2048 |
32 |
2 |
8 |
|
|
|
|
|
|
12 |
1000000 |
3072 |
71 |
8 |
70 |
|
|
|
|
|
|
13 |
1000000 |
4096 |
79 |
2 |
46 |
|
|
|
|
|
|
14 |
1000000 |
5120 |
22 |
2 |
32 |
|
|
|
|
|
|
15 |
1000000 |
6144 |
65 |
8 |
12 |
|
|
|
|
|
|
16 |
1000000 |
7168 |
24 |
4 |
28 |
|
|
|
|
|
|
17 |
1000000 |
8192 |
13 |
2 |
2 |
|
|
|
|
|
|
18 |
1000000 |
9216 |
34 |
8 |
60 |
|
|
|
|
|
|
19 |
1000000 |
1024 |
34 |
4 |
74 |
|
|
|
|
|
|
20 |
1000000 |
2048 |
73 |
2 |
23 |
|
|
|
|
|
|
21 |
1000000 |
3072 |
37 |
8 |
12 |
|
|
|
|
|
|
22 |
1000000 |
4096 |
61 |
4 |
66 |
|
|
|
|
|
|
23 |
1000000 |
5120 |
85 |
2 |
74 |
|
|
|
|
|
|
24 |
1000000 |
6144 |
40 |
8 |
192 |
|
|
|
|
|
|
25 |
1000000 |
7168 |
73 |
4 |
7 |
|
|
|
|
|
|
Разбор 0 варианта:
1. Для начала нам необходимо найти количество пар «ключ-указатель» Так как длина ключевого поля равна 32 байтам, а размер указателя – 8 байтам, с учетом расходов на заголовок блока в 96 байт и размером блока 4096-байтовый заголовок тогда поместить
100 пар «ключ-указатель».
4096 − 96
32 + 8
= 100
2. Теперь перейдем к количеству блоков, которое понадобится для построения плотного индекса, для этого изначальное количество кортежей необходимо разделить на количество пар «ключ-указатель»:
1000000
100
= 10000
3. Теперь перейдем к количеству операций, которое понадобится для нахождения ключа. Для построения плотного индекса потребуется 10 000 блоков, или 40
Мбайт. Такой индекс при определенных обстоятельствах вполне может быть загружен в буферы оперативной памяти – все зависит от ее общего объема и размеров области,
свободной от других данных.
По алгоритму бинарного поиска
log2(10000) = 13,28
Для отыскания нужного ключа придется выполнить 13 или 14 обращений к блокам индекса. Так как при использовании любого варианта бинарного поиска адресуется только небольшое подмножество всех блоков, например, блок в середине списка, далее блоки на
позициях 1/4 и 3/4, затем на позициях 1/8, 3/8, 5/8, 7/8 и т.д.) даже в том случае, если
15
разместить весь индекс в памяти нельзя, загрузить основные блоки все-таки удастся и поэтому для извлечения записи с любым ключом потребуется в худшем случае 14
операций.
Задача 5
Разреженные индексы.
В том случае, если плотный индекс оказывается слишком большим, то целесообразно воспользоваться структурой разреженного индекса, что позволит уменьшить размер файла ценой вероятного увеличения промежутка времени, необходимого для отыскания записи по заданному значению ключа. Разреженный индекс содержит только по одному указателю на каждый блок файла данных, а ключами индекса являются ключевые значения первых записей каждого блока данных. Пусть файл данных отсортирован, значениями ключа служат по четыре пары вида «ключ-указатель». Поэтому первый блок индекса включает элементы, соответствующие начальным записям первых четыре блоков данных, т.е. 10, 30, 50 и 70. Аналогично, второй индексный блок содержит значения ключа для первых записей блоков данных с номерами 5-8, а это 90, 110, 130 и 150. На рисунке изображен и третий блок индекса, указатели которого ссылаются на первые записи гипотетических блоков данных 9-12.
Рис7. Разреженный индекс для последовательного файла Разреженный индекс занимает намного меньше дискового пространства, нежели чем
плотный. В предыдущей задаче на 10000 блоков на каждый блок индекса приходилось по
100 пар «ключ-указатель» и если вместо плотного индекса создать разреженный, то для
16
хранения потребуется только 1000 блоков и всего 4 мегабайта пространства. Однако плотный индекс позволяет системе обрабатывать запросы вида «существует ли запись с ключевым значением К?», не требуя загрузки всего блока с искомой записью, тот факт, что значение К присутствует в ключевом поле плотного индекса, служит гарантией существования записи данных с ключом К.
Что бы с помощью разреженного индекса отыскать запись данных с ключом К,
следует найти запись индекса с наибольшим ключевым значением, меньшим или равным К. Поскольку файл индекса отсортирован по ключу, указанный элемент индекса нетрудно обнаружить, применив модифицированный вариант алгоритма бинарного поиска.
Указатель, соответствующий найденному ключу, адресует определенный блок данных.
Обратившись к этому блоку, система должна найти в нем записи с ключом К. Форматы описания блока и записи данных должны предоставлять соответствующую информацию,
достаточную для идентификации записи внутри блока и отдельных элементов содержимого самой записи.
Задача к решению 5.
Пусть, каждый блок позволяет размещение A записей данных или B пар вида «ключ-
указатель», но допускается существование дубликатов значений ключа поиска.
Максимальное количество дубликатов для одного ключа равняется C. Пусть имеется плотный индекс, но для каждого различного значения ключа существует только один элемент индекса, указывающий на первую по пордку запись данных, обладающих этим ключом. Если изначально ни один из блоков в оперативную память не загружен:
1. Вычислите необходимое количество операций, требуемых для отыскания всех записей данных с заданным значением К ключа поиска. Положение блока индекса,
содержащего элемент с ключом К, на диске известно заранее.
2. Решить задание 1, при наличии плотного индекса, содержащего соответствующую пару «ключ-указатель» для каждой записи, включая и те, которые обладают повторяющимися значениями ключа.
Исходные данные для задачи – 25 вариантов
Вариант |
A |
B |
C |
|
|
|
|
0 |
3 |
10 |
3 |
|
|
|
|
1 |
20 |
31 |
7 |
|
|
|
|
2 |
26 |
45 |
11 |
|
|
|
|
3 |
15 |
23 |
4 |
|
|
|
|
4 |
30 |
60 |
15 |
|
|
|
|
17
5 |
13 |
24 |
8 |
|
|
|
|
6 |
63 |
70 |
12 |
|
|
|
|
7 |
81 |
93 |
16 |
|
|
|
|
8 |
36 |
58 |
7 |
|
|
|
|
9 |
62 |
82 |
19 |
|
|
|
|
10 |
50 |
61 |
15 |
|
|
|
|
11 |
26 |
35 |
8 |
|
|
|
|
12 |
31 |
47 |
13 |
|
|
|
|
13 |
64 |
88 |
16 |
|
|
|
|
14 |
75 |
90 |
9 |
|
|
|
|
15 |
11 |
20 |
4 |
|
|
|
|
16 |
28 |
44 |
9 |
|
|
|
|
17 |
32 |
39 |
12 |
|
|
|
|
18 |
37 |
48 |
8 |
|
|
|
|
19 |
16 |
22 |
5 |
|
|
|
|
20 |
12 |
19 |
7 |
|
|
|
|
21 |
44 |
63 |
13 |
|
|
|
|
22 |
46 |
57 |
17 |
|
|
|
|
23 |
68 |
81 |
15 |
|
|
|
|
24 |
82 |
99 |
19 |
|
|
|
|
25 |
63 |
76 |
8 |
|
|
|
|
A – количество записей данных в одном блоке
B– количество пар «ключ-указатель» в одном блоке
C– максимальное количество дубликатов
Разбор 0 варианта
ТУТ НИЧЕГО НЕТ, ЕСЛИ ЧТО!
Задание 1
1.Так как заранее известно, в каком индексном блоке содержится ключ К,
сначала необходимо найти ключ в этом блоке.
2. Для поиска применяется вариация алгоритма бинарного поиска, сложность которого log2 , где n – количество элементов, среди которых осуществляется поиск. Так как в индексном блоке 10 элементов, а log2 10 ≈ 3.32, то для поиска понадобится максимум
4операции.
3.Далее необходимо найти все записи в блоках данных с ключом К. Эти записи будут располагаться после той, которую мы нашли на предыдущем шаге по указателю из
18
индексного файла. Так как максимально возможное количество копий ключа К равняется трем, необходимо будет проверить три записи. На это уйдет 3 операции.
4.Поэтому для поиска потребуется 4 + 3 = 7 операций.
Задание 2
1.Так как заранее известно, в каком индексном блоке содержится ключ К,
сначала необходимо найти ключ в этом блоке.
2.Так как файл данных может содержать дубликаты, а в индексном файле содержатся пары «ключ-указатель» для каждой записи, то и в индексном файле будет содержаться дубликаты, что делает его неуникальным.
3.В индексном файле 10 записей, поэтому при помощи бинарного поиска можно найти один экземпляр ключа К за 4 операции (так как log2 10 ≈ 3.32). Но из-за возможного существования максимум трех дубликатов, после нахождения ключа К,
необходимо будет проверить еще три записи рядом с ним.
4.Таким образом для поиска потребуется 4 + 3 = 7 операций.
Задача 6
В-дерево
Структура В-дерева орагнизована в виде древовидного графа. В-дерево является сбалансированным, т.е. длины всех путей от корневой веришины до любой из вершин-
листьев равны. Типичное В-дерево содержит три уровня: корневую вершину,
промежуточные вершины и листья, в общем случае В-дерево может содержать произвольное количество уровней
Рис 8. Типичная вершина В-дерева
Каждому В-древовидному индексу поставлен в соответствие параметр n,
определяющий свойства компоновки блоков В-дерева. Каждый блок обладает
19
пространством, достаточным для размещения n значений ключа поиска и n+1 указателей.
Блок В-дерева по существу схож с индексными блоками, за исключением того, что наряду c n парами вида «ключ-указатель» он содержит дополнительный, n+1 указатель. Величина n выбирается таким образом, чтобы обеспечить возможность хранения в блок n+1
указателей и n ключевых значений.
Существует ряд правил, регламентирующих состав содержимого блоков В-дерева:
-ключевые значения, указанные в вершинах-листьях, являются копиями ключей записей файла данных. Ключи распределелны по вершинам-листьям слева направо в порядке возрастания значений;
-корневая вершина содержит, самое меньшее два указателя, адресующих блоки-
вершины следущего уровня В-дерева;
- последний указатель вершины-листа ссылается на очередную вершину-лист справа,
т.е. на блок, содержащий следующую по порядку порцию ключевых знчений. По меньшей мере (n 1) / 2 из n указателей в блоке-листе используются для ссылки на запси данных,
а остальные считаются свободными и интерпретируются так, будто они обладают значениями null; i-й указатель, если он используется, адресует запись с i-м ключом.
- все n+1 указателей в промежуточной верщине могут применяться для ссылки на блоки очередного уровня В-дерева, хотя реально должны использоваться по меньшей мере
(n 1) / 2 |
из них, т.к. независимо от величины n, корневая вершина может содержать |
|
|
|
|
не менее 2 указателей, используемых по назначению. Если действующими являются j
указателей, им соответствует j-1 ключеий. Первый указатель адресует ту часть В-дерева,
которая позволяет отыскать записи с ключевыми значениями, меньшими К1. Второй указатель ссылается на фрагмент дерева, ответственный за обнаружение записей со значениями ключа, не меньшими К1 и строго меньшими К2. Наконец, j-й указатель приводит к ветви дерева, которая соответствет запсям с ключесывми значениями, равными или большими Кj-1. Запси с ключами, намного меньшими К1 или далеко правышающими Кj-1 из текущего блока, возможно, не достижимы - в таком случае им должны соответствоват определенные соседние блоки, относящиеся к тому же уроню дерева.
Задача к решению 6.
Пусть дисковый блок способен хранить А записей данных либо (В-1) ключей и В указателей, и блок вершины В-дерева заполнен в среднем на С% (если В = 100, а С = 70, то блок содержит только 69 ключей и 70 указателей). В-деревья можно использовать как составную часть различных структур. Полагая, что никакая информация изначально в
20
