Кластеризация 2-х точек

Дано: Дано набор из N точек в 2D-плоскости (координаты x и y) и набор из N радиусов соответствующий каждой точке. Мы будем называть точечный диск диском с центром в точке с его радиусом.

Проблема: Сгруппируйте точки. Кластер точек таков, что каждая точка ЛИБО попадает в диск по крайней мере одной другой точки в кластере ИЛИ по крайней мере одна другая точка в кластере попадает в его диск. Кластеры отдельных точек не считаются кластерами.

Мне нужен алгоритм для эффективного вычисления (желательно без использования сложных методов пространственного хеширования, таких как kd-деревья). Я могу согласиться на время работы O (N ^ 2), но определенно не более O (N ^ 3). Я чувствую, что это должно быть просто, но я зацикливаюсь на невзаимной природе моего условия кластеризации.

По сути, я хочу заполнить прототип функции C:

int cluster_points(
    size_t n,
    point_t *pt, // length n list of points
    double *radius, // length n list of radii for each point
    int *cluster, // length n list of cluster indexes; -1 if not clustered
    size_t *ncluster // number of clusters (number of distinct non -1 entries in cluster)
);

Это не домашнее задание. Мне это нужно как часть матричного алгоритма кластеризации комплексных чисел.

19
задан Victor Liu 14 October 2010 в 21:16
поделиться