(Это не домашнее задание класса CS, даже если оно похоже на одно)
Я использую битовые поля для представления диапазонов от 0 до 22. В качестве входных данных, например, у меня есть несколько разных диапазонов (порядок не имеет значения). Я использовал .
для 0
и X
для 1
для лучшей читаемости.
.....XXXXX..............
..XXXX..................
.....XXXXXXXXXXXXXXX....
........XXXXXXX.........
XXXXXXXXXXXXXXXXXXXXXXXX
Число диапазонов битовых полей обычно меньше 10, но потенциально может достигать 100. На основе этих входных данных я хочу вычислить взаимоисключающие смежные диапазоны, например:
XX......................
..XXX...................
.....X..................
......XX................
........XX..............
..........XXXXX.........
...............XXXXX....
....................XXXX
(опять же, порядок вывода не имеет значения, они просто должны быть взаимоисключающими и смежными, т.е. в них не может быть дыр. .....XXX.......XXXXX....
необходимо разделить на два отдельных диапазона).
Я попробовал несколько алгоритмов, но все они оказались довольно сложными и неизящными. Что очень помогло бы мне, так это способ обнаружить, что .....XXX.......XXXXX....
имеет дыру, и способ определить индекс одного из битов в дыре.
Изменить: диапазон битового поля представляет уровни масштабирования на карте. Они предназначены для использования для вывода таблиц стилей XML для Mapnik (системы рендеринга листов, которая, среди прочего, используется OpenStreetMap).