Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы к экзамену по БД (ВФ) / !Все ответы по БД v0.2.13.docx
Скачиваний:
189
Добавлен:
10.05.2014
Размер:
3.32 Mб
Скачать

37. Операция удаления элемента из в-дерева. Проблема антипереполнения. Методы решения. Пример

B-дерево - сбалансированное многоходовое дерево. Узлы В-дерева могут иметь свободное пространство, что упрощает операции вставки и удаления.

Определение B-дерева степени n:

1. Все пути от корня до любых листьев имеют одинаковую длину h, называемую также высотой В-дерева.

2. В каждом узле дерева, за исключением корня, должно располагаться минимум n, максимум 2n ключей.

3. В корне В-дерева может располагаться минимум 1, максимум 2n ключей.

4. Любой узел дерева, за исключением листьев, имеющий j ключей (n ≤ j ≤ 2n, для корня 1 ≤ j ≤ 2n), должен иметь j+1 подчиненный узел.

B-дерево. Структура вершины.

P0 R1 P1 R2 P2 … Pk-1 Rk Pk

P0, P1, P2, …, Pk – указатели на подчиненные узлы

R1, R2, …, Rk – записи (листы) (ключ и RowID)

B-дерево. Правила следования.

1. Ключи в текущем узле упорядочены по возрастанию;

2. Записи в левом поддереве текущего узла имеют ключи, меньшие, чем ключи текущего узла;

3. Записи в правом поддереве текущего узла имеют ключи, большие, чем ключи текущего узла;

При удалении возможны две ситуации:

  • Удаляемый элемент находится в листе;

  • Удаляемый элемент находится в промежуточном узле: тогда он заменяется следующим за ним (минимальный ключ из правого поддерева) или предшествующим ему (максимальный ключ из левого поддерева) элементом либо левое и правое поддеревья объединяются и их родителем становится ближайший левый от удаляемого ключа и ближайший правый от удаляемого ключа ключ.

Нормальное удаление - когда в листе содержится более чем n элементов (n – степень дерева).

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

1. Перераспределение ключей;

2. Слияние узлов.

Перераспределение ключей. Удаление из листа. Метод возможно применить, если существует соседний лист (находящийся рядом с целевым и имеющий такого же родителя), который содержит больше n ключей (n – степень дерева, т.е. минимально возможное количество ключей), тогда выбираем ключ из этого соседа, который является разделителем между оставшимися ключами узла-соседа и исходного узла (то есть не больше всех из одной группы и не меньше всех из другой). Пусть это ключ k1. Выберем ключ k2 из узла-родителя, который является разделителем исходного узла и его соседа, который мы выбрали ранее. Удалим из исходного листа нужный ключ (который необходимо было удалить), спустим k2 в этот узел, а вместо k2 в узле-родителе поставим k1.

Пример: фрагмент В-дерева степени 3; удаляется ключ 276

В соседнем листе больше n ключей. Значит, удаляем 276 из нужного листа, перемещаем ключ-родитель 253 в этот лист, а на место родителя помещаем максимальный элемент листа-соседа 211. Результат:

Удаление из промежуточного узла. Метод возможно применить, если у хотя бы одного дочернего узла количество ключей больше n. Ситуация: удаляем ключ k из узла x. Если левый дочерний узел (содержащий ключи, предшествующие ключу k ) содержит больше n ключей, то находим k1 – максимальный элемент левого дочернего узла. Удаляем k. Заменяем место k в узле x на k1. Проделываем аналогичную работу, если правый дочерний узел (содержащий ключи, бОльшие ключа k ) имеет больше n ключей.

Пример. Фрагмент В-дерева степени 3; удаляется ключ 253 из узла.

Ключ 253 мы можем заменить лишь ключом из левого дочернего узла, так как правый содержит ровно n ключей, а левый n+2 ключа (5 ключей). Максимальный элемент левого дочернего узла 211. Удаляем ключ 253, и на его место ставим ключ 211. Результат:

Слияние листьев. Удаление из листа. Метод применим, если все соседние листы имеют ровно n ключей. Тогда целевой лист (из которого удаляем) мы объединяем с каким-либо соседом, удаляем нужный ключ. И тот ключ из узла-родителя, который был разделителем для этих двух «бывших» соседей, переместим в новообразовавшийся лист (очевидно, он будет в нём медианой, то есть находиться между ключами одного листа и другого листа).

Пример. Фрагмент В-дерева степени 2; удаляется ключ 15.

Перераспределить ключи нельзя, так как в соседнем листе тоже минимально возможное количество ключей – 2. Удаляем ключ 15. Перемещаем из родителя ключ 32 в левое поддерево. Сливаем лист с соседним узлом. Получаем:

Удаление из промежуточного узла. Метод возможно применить если у обоих дочерних узлов количество ключей равно n. Ситуация: удаляем ключ k из узла x. Если оба (левый и правый дочерние узлы) имеют по n ключей, то объединяем этих детей, удаляем ключ k.

Пример. Фрагмент В-дерева степени 2; удаляется ключ 32.

Оба поддерева содержат n ключей, перераспределить нельзя. Сливаем оба узла в один, удаляем ключ 32, а следующие за ключом 32 ключи смещаем влево. Результат:

38. В+ дерево. Основные свойства. Операция вставки элемента в В+ дерево.

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

Чтобы устранить недостатки, свойственные В-дереву при выполнении последовательной выборки данных, было введено В+ дерево. В+ дерево во многом аналогично В-дереву. Как и В-дерево, В+ дерево является сбалансированным. Для В+ дерева устанавливаются те же ограничения на количество ключей в каждой вершине дерева, зависящие от порядка дерева. Различие между В+ деревом от В-деревом заключается в следующем. В В-дереве все вершины дерева равноправны и содержат ключи и ассоциированные с ними данные. В В+ дереве выделяются два типа вершин: промежуточные вершины индексов и листья. Ключи и ассоциированные с ними данные размещаются только в листьях. Листья объединяются в связанное последовательное упорядоченное множество. Это позволяет эффективно выполнять последовательные запросы. Доступ к листьям осуществляется через промежуточные вершины В+ дерева, организованные в виде обычного В-дерева индексов.

Два типа узлов В+ дерева: внутренние узлы–представляют собой В - дерево индексов; содержат только ключи • листья–объединены в двухсвязный список; содержат все ключи и ассоциированные с ними данные (RowID).

Основные свойства: 1) Для любой вершины В+ дерева, включая листья, выполняются те же ограничения на количество ключей и указателей (в зависимости от порядка дерева), что и в В-дереве. 2) Все ключи в В+ дереве хранятся в листьях. Для обеспечения правильного доступа отдельные ключи могут дублироваться и в промежуточных вершинах индексов. 3) Доступ к информации в В+ дереве выполняется всегда за h шагов, где h – высота В+ дерева. 4) Выполнение операций включения и удаления в В+ дереве несколько отличается от выполнения соответствующих операций в В-дереве.

Операция вставки в B+ дерево: В+ дерево также растет от листьев к корню. Включение начинается с листьев. Также в случае переполнения выполняется расщепление вершины, но в В+ дереве по-разному выполняется расщепление листа и расщепление промежуточной вершины дерева. При расщеплении листа в В+ дереве ключ, расположенный в средней позиции листа, перемещается в родительскую вершину и остается в листе – в правом или левом, но в каком-то одном для всех операций вставки. Расщепление промежуточной вершины В+ дерева выполняется точно так же, как и в В-дереве.

1) Включение первых двух элементов ничем не отличается от их включения в В-дерево;

2) Включение третьего элемента вызывает переполнение листа: 12, 20, 48. Элемент из средней позиции перемещается в родительскую вершину, в результате чего создается новый корень В+ дерева. Но так как в В+ дереве все ключи должны находиться в листьях, перемещаемый элемент остается и в одном из двух листьев – например, в левом (примем для определенности).

3) Включение следующего элемента (3) также вызывает переполнение левого листа: 3, 12, 20. Элемент из средней позиции перемещается в родительскую вершину, в которой есть свободная позиция, и остается в левом листе

4) Элемент 5 также должен быть размещен в левом листе – возникает переполнение: 3, 5, 12. В результате расщепления вершины элемент из средней позиции перемещается в родительскую вершину, в которой возникает переполнение: 5, 12, 20, и сохраняется в левом листе. Переполнение родительской вершины обрабатывается по правилам В-дерева – образуются две вершины с элементами 5 в левой и 20 в правой, а элемент 12 перемещается в родительскую вершину – создается новый корень В+ дерева

5) Элемент 70 должен быть размещен в самом правом листе – в нем есть свободная позиция, поэтому реорганизация дерева не происходи

6) Включение последнего элемента (101) вызывает переполнение: 48, 70, 101. В результате расщепления вершины появляются два новых листа, элемент 70 сохраняется в левом листе и дублируется в родительской вершине, в которой есть свободная позиция

39. В+ дерево. Основные свойства. Операция удаления элемента из В+ дерева.

В+ - дерево – это особый вид сбалансированного m - арного дерева, которое позволяет выполнять операции поиска, вставки и удаления записей из внешнего файла с гарантированной производительностью для самой неблагоприятной ситуации. С формальной точки зрения В+ - дерево порядка m представляет собой m - арное дерево поиска, характеризующееся следующими свойствами:

  • Корень является листом, либо имеет по крайней мере двух сыновей.

  • Каждый узел, за исключением корня и листьев, имеет от (m/2) до m сыновей.

  • Все пути от корня до любого листа имеют одинаковую длину.

  • Указатели на записи файла с данными хранятся только в листьях.

В+ - дерево можно рассматривать как иерархический индексный файл, каждый узел в котором занимает блок во внешней памяти. Корень В+ - дерева является индексом первого уровня. Каждый внутренний узел в В+ - дереве имеет форму (p0, key1, p1, key2, p2 , . . . ,keyn, pn), где рi является указателем на i - го сына, 0 i n, а keyi – ключ, 1 i n. Ключи в узле упорядочены, поэтому key1 < key2 < . . . < keyn. Все ключи в поддереве, на которые указывает р0, меньше, чем k1. В случае 1 i < n все ключи в поддереве, на которое указывает рi, имеют значения не меньше, чем, keyi, и меньше, чем keyi+1. Все ключи в поддереве, на которое указывает pn, имеют значения, не меньшие, чем keyn.

Удаление записей из B+ - дерева

Если требуется удалить запись со значением ключа k, выполняется поиск листа L, содержащего запись с ключом k. Если такая запись существует, то она удаляется из L. Если это первая запись в L, то в узле - родителе Р, устанавливается новое значение первого ключа key1 из L. Но если L является первым сыном узла Р, то первый ключ из L не фиксируется в Р, а появляется в одном из предков Р. Таким образом, распространяется изменение значений ключей по наименьшему значению ключа из L в обратном направлении вдоль пути от L к корню.

Если блок листа L после удаления записи оказывается пустым, он удаляется. После этого корректируются ключи и указатели в Р, чтобы отразить факт удаления листа L. Если количество сыновей узла Р оказывается теперь меньшим, чем m/2, проверяется узел Р1, расположенный в дереве на том же уровне слева (или справа) от Р. Если узел Р1 имеет по крайней мере m/2+1 сыновей, то ключи и указатели распределяются поровну между Р и Р1 так, чтобы оба эти узла имели по меньшей мере m/2 потомков. Затем необходимо изменить значения ключей в родителе Р и, если необходимо, распространить изменения на всех предков узла Р, на которых это изменение отразилось.

Если же у Р1 имеется ровно m/2 - 1 ключей и m/2 сыновей, то нужно объединить Р и Р1 в один узел с 2m - 1 сыновьями на базе узла P. Затем необходимо удалить ключ и указатель на Р1 у родителя узла Р. В свою очередь у родителя узла P может остаться меньше m/2 сыновей и процесс удаления перейдет вверх по дереву. Этот восходящий процесс удаления может распространиться до самого корня и, возможно, придется объединить только двух сыновей корня. В этом случае новым корнем становится объединенный узел, а старый корень можно удалить. Высота В+ - дерева уменьшается на единицу.

А) до удаления

Б) после удаления

40. Хэш-индексы. Принципы построения. Обработка переполнения методом открытой адресации.

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

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

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

Разрешение коллизий разбивается на 2 составляющие: выявление свободного пространства в бакете, если бакет занят, то обрабатываем переполнение бакета. Решение коллизий методом открытой адресации: в случае заполнения бакета мы, последовательно, идём по ячейкам до нахождения первой свободной ячейки, куда и записываем данные. Когда мы доходим до конца списка бакетов, поиск свободных ячеек продолжаем сначала. В случае, если мы дойдём до того места, откуда мы начали поиск, это означает что мы заняли всю таблицу. Поиск осуществляется также как и запись. Удаление: Т.к. при удалении элемента, находящегося не в своём бакете возможны проблемы с поиском других элементов, вводится специальная метка, которая означает что место свободно для записи, но будет учитываться как занятое при поиске.

41. Хэш-индексы. Обработка переполнения методом срастающихся цепочек и методом раздельных цепочек.

• Для произвольного доступа к данным

• Строится на уникальных атрибутах

• Хэш функция отображает индекс в физический адрес хранения соответствующей строки таблицы

• Принцип отображения – m : 1

Принципы построения

1. Адрес, получаемый в результате, должен попасть в диапазон адресов, соответствующий выделенному пространству.

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

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

Правила построения хэш-функции:

1. первичный ключ обязательно входит в атрибуты, на которых строится хэш-индекс

2. хэш-функция должна использовать значения всех атрибутов первичного ключа.

Для k1 ≠ k2 hash(k1) = hash(k2)

k1, k2 – синонимы

Разрешение коллизий:

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

• обработка переполнения бакета

Метод срастающихся цепочек.

При закрытом (внутреннем) хешировании в хеш-таблице хранятся непосредственно сами элементы, а не заголовки списков элементов. Поэтому в каждой записи (сегменте) может храниться только один элемент. При закрытом хешировании применяется методика повторного хеширования. Если осуществляется попытка поместить элемент х в сегмент с номером h(х), который уже занят другим элементом (коллизия), то в соответствии с методикой повторного хеширования выбирается последовательность других номеров сегментов h1(х),h2(х),..., куда можно поместить элемент х. Каждое из этих местоположений последовательно проверяется, пока не будет найдено свободное. Если свободных сегментов нет, то, следовательно, таблица заполнена, и элемент х добавить нельзя.

Метод раздельных цепочек.

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

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

Сравнение методов индексирования.

В+ деревья

Хеш индексы

представляются объектами базы данных

не представляются объектами базы данных

не влияют на представление таблицы

влияют на представление таблицы

упорядоченное хранение строк таблицы

упорядоченность строк отсутствует

определены и операции < и > для сравнения ключей

определены только операции = и ≠ для ключей

Рекомендации.

• Если размер таблицы сильно изменяется – не хэш таблица

• Если часто организуется поиск по критериям < > – не хэш таблица

• Если используются справочники (мало изменяемые таблицы, поиск в них по =) –хэш таблицы