Интересующие вас структуры данных являются деревьями метрик. То есть они поддерживают эффективный поиск в метрических пространствах. Метрическое пространство образовано набором объектов и определенной между ними функцией расстояния, удовлетворяющей неравенству треугольника. Затем, при наличии набора объектов и элемента запроса, цель состоит в том, чтобы извлечь эти объекты достаточно близко к запросу.
Поскольку проблемы поиска буквально повсюду в компьютерных науках, существует огромное количество различных метрических деревьев. Тем не менее, их можно разделить по крайней мере на две группы: на основе сводной и кластерной (и, конечно же, есть гибриды). Хороший обзор - Э. Чавес и др., Поиск в метрических пространствах, 2001 . См., Например, главу 5 «Современные решения метрических пространств», стр. 283.
Там, в таблице 1, Чавес и соавт. рассмотрим 16 разных метрических деревьев. Они представляют сложность пространства, сложность конструкции, заявленную сложность запроса и дополнительное время запроса ЦП для каждого (если известно). Если вас не слишком волнует сложность построения, сложность запроса для BK-дерева равна , где зависимости от диапазона поиска и структуры пространства. , Или, если у вас нет большого количества элементов, взгляните на AESA (аппроксимирующее устранение алгоритма поиска). Он неприемлемо медленен для создания и хранения огромных пространств ( времени и пространства), но экспериментально было показано, что время запроса.O(nα)0<α<1O ( 1 )O(n2)O(1)
Чавес и соавт. также дайте хороший обзор других деревьев и, естественно, больше ссылок, если какой-либо из них вызывает у вас интерес. На практике производительность разных деревьев часто оценивается экспериментально. Это, я думаю, во многом зависит от структуры пространства. Поэтому трудно сказать, какое именно дерево будет наиболее эффективным в вашем случае. Тем не менее, я думаю, что это хорошая идея, чтобы сначала пойти с самым простым. Если BK-деревья проще всего построить, сначала попробуйте их. Если они не удовлетворяют вашим требованиям, потратьте время (и, возможно, время программирования) на сбор большего количества фактов о вашем пространстве, которые могут помочь вам принимать более обоснованные решения.