Компактные вероятностные структуры данных для поиска
считайте, у нас есть алгоритм, который получает гипотетически длинный поток ключей. Затем он генерирует значение от 0 до 1 для каждого ключа, как мы его обрабатываем, для заднего извлечения. Входной набор достаточно велик, чтобы мы не могли позволить себе хранить одно значение для каждого ключа. Правило генерации значений не зависит от ключей.
теперь предположим, что мы можем допустить ошибку в заднем поиске, но мы все равно хотим свернуть разница в извлечь и оригинал значения (т. е. асимптотически над многими случайными извлечениями).
например, если исходное значение для данного ключа была 0.008, получение 0.06 намного лучше, чем получение 0.6.
какие структуры данных или алгоритмы можно использовать для решения этой проблемы?
фильтры цветения-самая близкая структура данных, которую я могу придумать. Можно квантовать выходной диапазон, использовать фильтр цветения для каждого ведра и как-то объединить их выход во время извлечения, чтобы оценить наиболее вероятное значение. Прежде чем я продолжу этот путь и изобрету колесо, существуют ли какие-либо известные структуры данных, алгоритмы, теоретические или практические подходы к решению этой проблемы?
Я идеально ищу решение, которое может параметризация компромисс между пространством и цены ошибки.
1 ответов
возможно, вариант фильтра Bloom называется Компактный Аппроксиматор: как фильтр цветения, но обобщенный, поэтому записи являются значениями из решетки. Эта решетка здесь просто плавает между 0 и 1 (она имеет больше структуры, чем просто решетка, но она удовлетворяет требованиям) или, Однако, вы храните эти числа.
обновление заменяет соответствующие записи на max между ним и запоминаемым значением, запрос вычисляет минимум всех его соответствующие позиции (примеры ниже). Результаты могут только переоценить истинное значение. Изменив порядок (обмен min и max и инициализация на 1 вместо 0), вы можете получить занижение, вместе давая интервал, содержащий истинное значение.
Так, например, используя первое приближение (завышение), ввод числа выглядит следующим образом:
index1 = hash1(key)
data[index1] = max(data[index1], value);
index2 = hash2(key)
data[index2] = max(data[index2], value);
... etc
и получение переоценки выглядит так:
result = 1
index1 = hash1(key)
result = min(data[index1], result);
index2 = hash2(key)
result = min(data[index2], result);
... etc