我有100米的那种形式:
(point_index, cluster_index)
目标是为每个群集选择(第一个并不重要)m
点。群集的数量为16k,最大值。如何有效地做到这一点?
m
应小,< = 100。
我的第一次尝试:
cluster_index
。m
点
选择当前集群,然后打印点,否则什么都不做
直到找到下一个群集。这会产生一个:
O(nlogn)
时间复杂度,其中n = 100米。但是请注意,我只对实际应用感兴趣,而不是例如对于具有巨大常量的下界!该算法将通过笔记本电脑在javascript中执行。
答案 0 :(得分:1)
具有以下假设的解决方案:
遵循这些假设,随机取点可以快速得出结果。 要进行随机排列,您可以使用@zerkms算法。
采取素数p> Ñ
clustercount = Array(size = c, filled_with = 0)
i = randint(0, p)
complete = 0
while (complete < c*m) {
if (clustercount[points[i].cluster] < m) {
clustercount[points[i].cluster] = 1 + clustercount[points[i].cluster]
plot(points[i])
complete = complete + 1
}
i = i + p % n
}
平均而言,此方法需要c*log(c) + m * c * log(log(c)) + O(c)
次迭代。