解题思路
核心思路是按题面把 Bi-K-means 原样模拟出来,而不是求某种最优划分。外层从单个簇 C0 出发,每次在当前簇集合里选一个簇做 K=2 的 K-means,直到簇数达到 N。被选中的簇用「x 最小点 / x 最大点」当初始质心,禁止随机初始化。选簇的关键字是:SSE_Grad 最大,其次设备数最多,再次生成时间最早。SSE_Grad 定义为父簇 SSE 减去两个子簇 SSE 之和,SSE 是簇内各点到质心的欧氏距离平方和。
实现方法:用数组保存每个簇的点集和出生序号。每一轮对每个仍可分裂(至少两点)的簇试跑一遍 2-means,记下子簇划分和下降量,再按上述三关键字选出要真分裂的那个。2-means 迭代里,点到两质心距离相等时归入 x 较小的初始质心一侧;用欧氏距离衡量质心偏移,偏移小于 1e−6 或全体归属不再变化时停止。每次分裂后把原子簇换成两个子簇(先左后右),并按簇规模降序输出一行。第 0 行是尚未分裂时的 L。
复杂度分析
设路由器数为 L,目标簇数为 N。每一轮要对当前所有簇试分裂,单次 2-means 最多扫描 O(L) 个点并迭代常数到较少次数,外层最多 N−1 次分裂,因此时间复杂度为 O(NL⋅I),其中 I 为 2-means 迭代次数(本题 L≤100,N≤20,远小于时限)。空间复杂度 O(L)。