M-деревья - это древовидные структуры данных, похожие на R-деревья и B-деревья. Он построен с использованием метрики и основывается на неравенстве треугольника для запросов эффективного диапазона и k-ближайшего соседа (k-NN). Хотя M-деревья могут хорошо работать во многих условиях, дерево также может иметь большое перекрытие, и нет четкой стратегии, как лучше всего избежать перекрытия. Кроме того, его можно использовать только для функций расстояния, которые удовлетворяют неравенству треугольника, в то время как многие расширенные функции различия, используемые при поиске информации, этому не удовлетворяют.
Как и любая древовидная структура данных, M-Tree состоит из узлов и листьев. В каждом узле есть объект данных, который однозначно его идентифицирует, и указатель на поддерево, в котором находятся его дочерние элементы. На каждом листе есть несколько объектов данных. Для каждого узла есть радиус, определяющий шар в желаемом метрическом пространстве. Таким образом, каждый узел и лист, находящиеся в конкретном узле, находятся на максимальном расстоянии от него, и каждый узел и лист с родительским узлом сохраняют расстояние от него.
M-Tree состоит из следующих компонентов и подкомпонентов:
Основная идея заключается в первую найти лист узел N, где новый объект O принадлежит. Если N не является полным, то просто прикрепить его к N. Если N полон затем вызвать метод для разделения N. Алгоритм следующий:
Algorithm Insert Input: Node N of M-Tree MT, Entry Output: A new instance of MT containing all entries in original MT plus
's routing objects or objects if N is not a leaf then { /* Look for entries that the new object fits into */ let be routing objects from 's set of routing objects such that if is not empty then { /* If there are one or more entry, then look for an entry such that is closer to the new object */ } else { /* If there are no such entry, then look for an object with minimal distance from */ /* its covering radius's edge to the new object */ /* Upgrade the new radii of the entry */ } /* Continue inserting in the next level */ return insert(); else { /* If the node has capacity then just insert the new object */ if N is not full then { store() } /* The node is at full capacity, then it is needed to do a new split in this level */ else { split() } }
Если метод разделения достигает корня дерева, он выбирает два объекта маршрутизации из N и создает два новых узла, содержащих все объекты в исходном N, и сохраняет их в новом корне. Если методы сплит поступает к узлу N, который не является корнем дерева, метод выбора двух новых объектов маршрутизации из N, повторно организовать каждый маршрутизации объекта в N в двух новых узлов и, и хранить эти новые узлы родительского узла оригинального N. Разделение необходимо повторить, если не хватает емкости для хранения. Алгоритм следующий:
Algorithm Split Input: Node N of M-Tree MT, Entry Output: A new instance of MT containing a new partition.
/* The new routing objects are now all those in the node plus the new routing object */ let be NN entries of if N is not the root then { /*Get the parent node and the parent routing object*/ let be the parent routing object of N let be the parent node of N } /* This node will contain part of the objects of the node to be split */ Create a new node N' /* Promote two routing objects from the node to be split, to be new routing objects */ Create new objects and . Promote() /* Choose which objects from the node being split will act as new routing objects */ Partition() /* Store entries in each new routing object */ Store 's entries in N and 's entries in N' if N is the current root then { /* Create a new node and set it as new root and store the new routing objects */ Create a new root node Store and in } else { /* Now use the parent routing object to store one of the new objects */ Replace entry with entry in if is no full then { /* The second routing object is stored in the parent only if it has free capacity */ Store in } else { /*If there is no free capacity then split the level up*/ split() } }
В запросе диапазона указывается минимальное значение сходства / максимального расстояния. Для данного объекта запроса и максимального расстояния поиска диапазон запроса range (Q, r (Q)) выбирает все проиндексированные объекты таким образом, что.
Алгоритм RangeSearch начинается с корневого узла и рекурсивно просматривает все пути, которые не могут быть исключены из ведущих к квалифицируемым объектам.
Algorithm RangeSearch Input: Node N of M-Tree MT, Q: query object, : search radius
Output: all the DB objects such that
{ let be the parent object of node N; if N is not a leaf then { for each entry() in N do { if then { Compute ; if then RangeSearch(*ptr()),Q,); } } } else { for each entry() in N do { if then { Compute ; if ≤ then add to the result; } } } }
Запрос K Nearest Neighbor (k-NN) принимает мощность входного набора в качестве входного параметра. Для заданного объекта запроса Q ∈ D и целого числа k ≥ 1 запрос NN (Q, k) k-NN выбирает k индексированных объектов, которые находятся на кратчайшем расстоянии от Q в соответствии с функцией расстояния d.