Давайте рассмотрим простой случай:
В соответствии с вашим пониманием вы создадите дерево сегментов с 11 - 1 = 10 узлами в основании, что-то вроде этого:
Обратите внимание, у нас есть только 9 узлов в базе, потому что первый узел для интервала [1,2], следующий для интервала [2,3] ии так далее
И когда вы вводите какой-либо прямоугольник, вы обновляете его диапазон на основе его координат y, поэтому после встречи с первым из них при x = 0 дерево вашего сегмента будет выглядеть так:
Нам также потребуется использовать то, что называется ленивым распространением, для обновления активных интервалов в дереве, чтобы все активные интервалы вносили 1 в сумму.
Таким образом, сложность вашего текущего подхода - это что-то вроде O (K log K), где K = max (y) -min (y)
. Мы можем легко уменьшить это значение до O (n log n), где n - числопрямоугольники.
Обратите внимание, что существуют только важные координаты y, поэтому в этом примередостаточно 1,3,6,11
Также обратите внимание, что таких координат не более 2 * n
Так что мы можем сопоставить все координаты некоторым целым числам, чтобы они лучше подходили для дерева сегментов.
Это называется сжатием координат, это можно сделать примерно так:
- Сохранить все координаты y в массиве
- отсортировать массив и удалить дубликаты
- используйте map или hashMap, чтобы отобразить исходные координаты в их положение в отсортированном массиве
Так что в нашем примере это будет:
[1,3,6,11]
- нет дубликатов для удаления, так что массив все еще
[1,3,6,11]
mp[1]=1, mp[3]=2, mp[6]=3, mp[11]=4
Так что теперь алгоритм остается прежним, но мы можем использовать дерево сегментов с не более чем 2 * n узлами вэто база.
Также нам нужно было бы немного изменить наше дерево сегментов, вместо того, чтобы сохранять, какие координаты y включены или выключены, теперь мы будем сохранять, какие интервалы координат y включены / выключены
Так что мы будемиметь узлы для интервалов [y0, y1], [y1, y2], ... для всех уникальных отсортированных значений y.
Также все узлы будут вносить y [i] -y [i-1] всумма (если они находятся в диапазоне и активны) вместо одного.
Таким образом, наше новое дерево сегментов будет выглядеть примерно так: