У меня такая ситуация, когда у меня есть N временные рамки, каждая из которых содержит блоки. Блоки содержат токены с определенным индексом и знают их максимальные и минимальные индексы токенов. Кроме того, индексы сопоставляют первые индексы с парой (временной шкалой, блоком). Вот пример:Какая лучшая структура данных для хранения диапазонов для быстрых запросов?
Timeline 1: [1 2 5 8 9 11] [14 17 18 21] [22 23 25 26] ...
Timeline 2: [3 4 6 7 10 12] [13 15 16 19 20 24] [27 28 34 45] ...
Index:
1 -> timeline 1, block 1
3 -> timeline 2, block 1
13 -> timeline 2, block 2
14 -> timeline 1, block 2
22 -> timeline 1, block 3
27 -> timeline 2, block 3
Как вы можете видеть, отсутствует пропущенный токен (без пробелов).
Те структуры данных, что я изначально. Какова была бы лучшая альтернативная структура данных для оптимизации запросов определенного индекса токена? Скажем, я хочу получить токен 19. Теперь мне нужно сделать следующее: дихотомический поиск в индексе, чтобы найти хорошие блоки для каждой временной шкалы, а затем полный поиск в каждом блоке. С помощью маркера 19 дихотомический поиск приведет к блокам (1, 2) и (2, 2), которые могут содержать 19, а затем выполнить полный линейный поиск для поиска маркера 19 (здесь не существует дихотомического поиска внутри блоков, поскольку маркеры имеют различные размеры и пока не содержатся в какой-либо структуре данных).
Спасибо!
Редактировать: Я думаю об использовании дерева интервалов, содержащих интервалы всех временных рамок. Проблема в том, что запрос все равно приведет к множеству интервалов. Кроме того, он не оптимизирует слишком много по сравнению с бинарными поисками.
Что ожидается результат при запросе данных? Например, запрос равен 19 - каков результат? Это номер временной шкалы, блок и позиция в блоке? –
@Draco: Точно. Блок - это большой блоб, и единственный способ поиска n-го токена внутри него - начинать с первого и читать последовательно. – eepp
@eepp Вы не можете переместить индексы токенов в блок в начале блока?Если вам нужно найти определенное значение, например «\ 0», чтобы узнать, когда заканчивается токен, он может работать, и это приведет к уменьшению поиска только к одному из N временных графиков. –