использование хэш-карты для каждого элемента в диапазоне кажется слишком широким, что, если диапазон (1-2 ^ 20)?а что если это двойной?хранить их будет слишком дорого.
Вы можете использовать обычный список пропусков / дерево, которое будет содержать нижнюю и верхнюю границы каждого диапазона.обратите внимание, что при поиске в двоичном дереве значения, если оно не существует, ваш поиск завершится, когда вы достигнете следующего значения до / после поиска, например: если у вас есть ключи диапазона 1,4, и вы выполняете поиск 3, поиск закончится, когда вы достигнете 1 или 4., чтобы мы могли сохранить верхние / нижние границы диапазона в дереве.
Теперь нам также нужно будет сохранить для каждого из них истинный диапазон (поэтомуесли у нас есть 1-4,8-9 и мы ищем 7, мы узнаем, что это недействительно, когда мы достигнем 4/8).поэтому, если ключ находится в допустимом диапазоне, мы достигнем его верхней / нижней границы при поиске!
и в заключение, просто добавьте нижнюю и верхнюю границы, когда вы ищете, найдите ключ и посмотритеесли граница соответствует.
ops должен быть примерно таким (псевдокод):
add (lower,upper,value):
tree.add(lower/*key*/,(lower,upper,value))
tree.add(upper/*key*/,(lower,upper,value))
search (key):
node = tree.search(key)
if node.lower <= key <= node.upper:
return node.value
return KEY_NOT_IN_TREE_ERROR
del(lower,upper):
tree.del(lower)
tree.del (upper)
каждый из этих операций будет O (logn), медленнее, чем хеш, но он будет потреблятьнамного меньше места.