Аннотация
Либо используйте алгоритм сортировки по наименьшему значению X прямоугольника, либо сохраните ваши прямоугольники в R-дереве и найдите его.
Прямой подход (с сортировкой)
Обозначим low_x()
- наименьшее (самое левое) значение X прямоугольника, а high_x()
- самое высокое (крайнее правое) значение X прямоугольника.
Алгоритм:
Sort the rectangles according to low_x(). # O(n log n)
For each rectangle in sorted array: # O(n)
Finds its highest X point. # O(1)
Compare it with all rectangles whose low_x() is smaller # O(log n)
than this.high(x)
Анализ сложности
Это должно работать на O(n log n)
на равномерно распределенных прямоугольниках.
Наихудшим случаем будет O(n^2)
, например, когда прямоугольники не перекрываются, а располагаются один над другим. В этом случае обобщите алгоритм так, чтобы он содержал low_y()
и high_y()
тоже.
Подход с использованием структуры данных: R-Trees
R-деревья (пространственное обобщение B-деревьев ) являются одним из лучших способов хранения геопространственных данных и могут быть полезны в этой задаче. Просто сохраните ваши прямоугольники в R-дереве, и вы сможете находить пересечения с простой O(n log n)
сложностью. (n
поисков, log n
время для каждого).