Я бы хотел, чтобы структура данных эффективно хранила длинную последовательность чисел. Цифры всегда должны быть целыми целыми числами, пусть говорят длинными.
Особенность входных данных, которые я хотел бы использовать (чтобы требовать "эффективности" ), заключается в том, что долготы будут в основном последовательными. Могут отсутствовать значения. И значения могут взаимодействовать с не по порядку.
Я бы хотел, чтобы структура данных поддерживала следующие операции:
- addVal (n): добавить одно значение, n
- addRange (n, m): добавить все значения между n и m, включительно
- delVal (n): удалить одно значение, n
- delRange (n, m): удалить все значения между n и m, включительно
- containsVal (n): возвращает ли одно единственное значение n в структуре
- содержит Range (n, m): возвращает ли все значения между n и m, включая, существуют в структуре
По сути, это более конкретный тип структуры данных Set, который может использовать непрерывность данных для использования меньше, чем O (n) памяти, где n - это количество сохраненных значений.
Чтобы быть ясным, хотя я считаю, что эффективная реализация такой структуры данных потребует, чтобы мы хранили внутренние интервалы, которые не видны или релевантны пользователю. Существуют несколько деревьев интервалов, которые хранят несколько интервалов отдельно и позволяют операциям находить количество интервалов, которые перекрываются с данной точкой или интервалом. Но с точки зрения пользователя это должно вести себя точно как набор (за исключением операций на основе диапазона, поэтому массовые добавления и удаления можно эффективно обрабатывать).
Пример:
dataStructure = ...
dataStructure.addRange(1,100) // [(1, 100)]
dataStructure.addRange(200,300) // [(1, 100), (200, 300)]
dataStructure.addVal(199) // [(1, 100), (199, 300)]
dataStructure.delRange(50,250) // [(1, 49), (251, 300)]
Мое предположение заключается в том, что это лучше всего реализовать с помощью некоторой древовидной структуры, но у меня нет большого впечатления о том, как это сделать. Я хотел узнать, есть ли какая-то обычно используемая структура данных, которая уже удовлетворяет этому варианту использования, поскольку я бы предпочел не изобретать колесо. Если нет, я хотел бы услышать, как вы думаете, что это лучше всего реализовать.