У меня есть набор данных 2D точек (из них ~ 500 тыс.), По которым я хотел бы провести какой-то анализ числа квадратов. Основа подсчета квадратов состоит в том, чтобы разделить ваше 2D-пространство на регулярную сетку (каждая ячейка имеет размер SxS
) и подсчитать количество точек в каждой ячейке.
По какой-то причине я хотел бы сделать небольшое изменение: вместо того, чтобы использовать обычную сетку, я хочу построить сетку так, чтобы каждая ячейка содержала максимум K
точек.
Я сделал следующее: я начинаю со всего пространства и делю его на 4 ячейки («разрезая» каждое измерение пополам). Затем я подсчитываю количество точек в каждой ячейке. Для тех, которые содержат более K
баллов, я делю их снова и т. Д., Пока я не закончу.
Я пробовал как рекурсивные, так и итеративные реализации этого простого алгоритма, но ни одна не работала хорошо при применении ко всему набору данных. Очевидно, что основным узким местом является счетная часть, поэтому мне было интересно, какая структура данных позволила бы мне сделать это эффективно?
(Сейчас я просто использую «условную индексацию» в Python: points = points[points[,1] > x1 and points[,1] <= x2 and points[,2] > y1 and points[,2] <= y2,]
)
Кроме того, у вас может быть другая идея о том, как я мог бы построить свою сетку?
РЕДАКТИРОВАТЬ: Другими словами, какую структуру данных я мог бы использовать для быстрого подсчета (и получения) точек, которые попадают в данный прямоугольник ((x1, y1), (x2, y2))
?