每个群集选择m个点

时间:2016-09-06 04:38:00

标签: javascript algorithm data-structures time-complexity bigdata

我有100米的那种形式:

(point_index, cluster_index)

目标是为每个群集选择(第一个并不重要)m点。群集的数量为16k,最大值。如何有效地做到这一点?

m应小,< = 100。

我的第一次尝试:

  1. cluster_index
  2. 对对进行排序
  3. 线性地遍历对,如果小于m点 选择当前集群,然后打印点,否则什么都不做 直到找到下一个群集。
  4. 这会产生一个:

      

    O(nlogn)

    时间复杂度,其中n = 100米。但是请注意,我只对实际应用感兴趣,而不是例如对于具有巨大常量的下界!该算法将通过笔记本电脑在中执行。

1 个答案:

答案 0 :(得分:1)

具有以下假设的解决方案:

  • 没有特定的数据结构,只有带有群集的点列表
  • 群集大小均衡
  • m<< n / c其中n是点数,c是簇数

遵循这些假设,随机取点可以快速得出结果。 要进行随机排列,您可以使用@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)次迭代。