鉴于一堆数字,我试图确定在数字密集的地方是否存在“丛”。
为了使事情更精确,我想我会问一个更具体的问题:给定一组数字,我想确定是否有一个大小为n
的子集,其标准偏差<1。 = s
。如果有很多这样的子集,我想找到标准差最小的子集。
问题#1:这个正式的问题定义是否有效地捕获了密集数字“丛”的直观概念?
n
没关系。但随意纠正我!问题#2:假设确实如此,实现这样的事情的最佳方法是什么(特别是,我想要一个时间复杂度最低的解决方案)?到目前为止,我认为我有一个在n log n
中运行的解决方案:
n log n
)其次,取第一个n
数字并计算其标准偏差。如果我们的数字数组是从0开始的,则第一个n
数字是[0, n-1]
。要获得标准偏差,请按以下方式计算s1
和s2
:
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
个数字。如果你跟踪s1
和s2
运行总计,那么每次计算只需要一个恒定的时间:例如,要获得[1, n]
的std dev,只需从{{中减去第0个元素1}}和s1
总计并添加第n个元素,然后重新计算标准偏差。这意味着算法的整个标准差计算部分需要线性时间。总时间复杂度s2
。
我的评估是对的吗?有一个更好的方法吗?我真的需要这个在相当大的集合上运行 fast ,所以越快越好!空间不是问题(我认为)。
答案 0 :(得分:1)
最近一直在研究类似的问题,团块的定义和提议的实施似乎都是合理的。
另一个合理的定义是找到n
个数的所有范围的最小值。因此,鉴于数字列表x
已排序,人们只能找到x[n]-x[1]
,x[n+1]-x[2]
等的最小值。这比查找标准偏差要快一些,因为它会避免乘法和平方根。实际上,即使通过找到最小方差(标准偏差的平方)而不是sd本身来寻找最低标准差,也可以避免平方根。
谨慎的是,最大丛的位置可能对n
的选择非常敏感。如果有先验选择特定n
的原因,则不会出现问题。但是,如果没有,则可能需要进行一些实验来选择n
的值,该值可以相当可靠地找到您要查找的块,无论您是按范围还是按标准偏差选择。有关这方面的一些想法可以在在线书籍ABC of EDA的第6章中找到。