Подтвердить что ты не робот

Scala диапазон/структура интервальной карты

У меня почти такой же вопрос, как упоминалось в структурах данных, которые могут отображать диапазон ключей в значение, но для Scala.

То есть, я хотел бы иметь изменяемую систему неперекрывающихся диапазонов 1D [a [i], b [i]), которые отображались бы на какое-то значение v [i]. Стандартная базовая структура данных для выполнения этой работы - это красно-черное дерево.

Операции, которые я хотел бы иметь, желательно, чтобы все они имели сложность O (log n):

  • Запросить и получить заданный диапазон (начало, конец, сохраненное значение) или его отсутствие, указав любую точку внутри него
  • Вставьте новый диапазон в эту структуру
  • Удалить диапазон из структуры

Итак, я предполагаю, что до сих пор я вижу следующие варианты, все из которых имеют свои минусы:

  • Roll-your-own-container поверх Java TreeMap - быстрый и грязный, но, вероятно, плохой в долгосрочной перспективе из-за отсутствия надлежащее обслуживание
  • Использовать Guava RangeMap - возможно, но будет довольно неудобно в мире коллекций Scala
  • Попытайтесь использовать Scala красно-черные реализации дерева и попробуйте выполнить roll-your-own, однако, я думаю, это было бы довольно сложно, учитывая, что Scala TreeMap является неизменяемым и пропускает простые методы поиска, такие как Java TreeMap floorEntry

Я что-то упустил? Существуют ли в Гуаве хорошо сохранившиеся библиотеки расширений коллекций, использующие Scala -центрические API, которые расширяют основные коллекции Scala?

Сильно связанные вопросы:

4b9b3361

Ответ 1

Я бы, скорее всего, инкапсулировал Guava RangeMap. Все, что вам нужно, это класс трех методов, за которым вы можете скрыть несквалентную коллекцию.

Мне было любопытно, как тяжело было бы свернуть мое собственное решение на основе Java NavigableMap, и это довольно тривиально:

  • определить класс MyValue, содержащий (начало, конец, сохраненное значение)
  • используйте карту, сопоставляющую начальную точку с соответствующим MyValue

Только с 40 строк в Java с Lombok (и, вероятно, меньше в Scala), я бы не боялся никакого обслуживания. Я написал очень рудиментарный test.