【发布时间】:2013-01-08 23:00:57
【问题描述】:
我正在为考试而学习,但我无法解决这个问题:
我们得到一组 n 个点和一个整数 d。任务是创建两个不相交的点集 A_1 和 A_2(给定联合集 n 个点),使得距离A_i(对于 i = 1 或 2)的每对点之间的 (欧几里得) 小于或等于 d。如果不可能,打印 -1。
例如输入:
d = 3,点数:
(5,3), (1,1), (4,2), (1,3), (5,2), (2,3), (5,1)
我们可以创造:
A_1 = { (2,3), (1,3), (1,1) }
A_2 = { (5,3), (4,2), (5,2), (5,1) }
因为来自 A_i 的每一对点(对于 i = 1 或 2)都足够接近。
我真的很想知道如何解决它,但不知道。由于n很小,算法甚至可以是O(n^2 log n),但我不知道如何开始。我在想可能从计算每对点之间的距离开始,然后取两个最大距离的点并将它们放入不同的集合中(如果它们的距离大于 d)。然后对其余的对重复此步骤,但问题是如何决定我可以合法地将下一个点放在哪里。谁能帮忙解决这个算法?
【问题讨论】:
-
k-means 不能保证收敛到最优解。不过k-means++启动算法比较好,机会大:en.wikipedia.org/wiki/K-means%2B%2B
标签: algorithm