确定是否存在大小为n的子集,其具有标准偏差< = s

时间:2013-06-24 00:34:25

标签: time-complexity subset standard-deviation

鉴于一堆数字,我试图确定在数字密集的地方是否存在“丛”。

为了使事情更精确,我想我会问一个更具体的问题:给定一组数字,我想确定是否有一个大小为n的子集,其标准偏差<1。 = s。如果有很多这样的子集,我想找到标准差最小的子集。

问题#1:这个正式的问题定义是否有效地捕获了密集数字“丛”的直观概念?

  • 编辑:我实际上并不关心确定哪个数字属于这个“丛”,我对确定丛集中心的位置更感兴趣,这就是为什么我认为提前指定n没关系。但随意纠正我!

问题#2:假设确实如此,实现这样的事情的最佳方法是什么(特别是,我想要一个时间复杂度最低的解决方案)?到目前为止,我认为我有一个在n log n中运行的解决方案:

  • 首先,请注意,给定大小的最低标准偏差的子集必须由连续的数字组成。因此,第1步是对数字进行排序(这是n log n
  • 其次,取第一个n数字并计算其标准偏差。如果我们的数字数组是从0开始的,则第一个n数字是[0, n-1]。要获得标准偏差,请按以下方式计算s1s2

    • s1 = sum of numbers
    • s2 = sum of squares of numbers

    然后,wikipedia表示标准差为sqrt(n*s2 - s1^2)/n。将此值记录为目前为止看到的最高标准偏差。

  • 找到[1, n][2, n+1][3, n+2]的标准偏差...直到您点击最后n个数字。如果你跟踪s1s2运行总计,那么每次计算只需要一个恒定的时间:例如,要获得[1, n]的std dev,只需从{{中减去第0个元素1}}和s1总计并添加第n个元素,然后重新计算标准偏差。这意味着算法的整个标准差计算部分需要线性时间。

总时间复杂度s2

我的评估是对的吗?有一个更好的方法吗?我真的需要这个在相当大的集合上运行 fast ,所以越快越好!空间不是问题(我认为)。

1 个答案:

答案 0 :(得分:1)

最近一直在研究类似的问题,团块的定义和提议的实施似乎都是合理的。

另一个合理的定义是找到n个数的所有范围的最小值。因此,鉴于数字列表x已排序,人们只能找到x[n]-x[1]x[n+1]-x[2]等的最小值。这比查找标准偏差要快一些,因为它会避免乘法和平方根。实际上,即使通过找到最小方差(标准偏差的平方)而不是sd本身来寻找最低标准差,也可以避免平方根。

谨慎的是,最大丛的位置可能对n的选择非常敏感。如果有先验选择特定n的原因,则不会出现问题。但是,如果没有,则可能需要进行一些实验来选择n的值,该值可以相当可靠地找到您要查找的块,无论您是按范围还是按标准偏差选择。有关这方面的一些想法可以在在线书籍ABC of EDA的第6章中找到。