给定一堆数字,我试图确定在数字非常密集的地方是否存在“团块”。
为了使事情更准确,我想我会问一个更具体的问题:给定一组数字,我想确定是否存在n
具有标准偏差 <=的大小子集s
。如果有很多这样的子集,我想找到具有最低标准偏差的子集。
所以问题#1:这个正式的问题定义是否有效地捕捉到了密集数字“团块”的直观概念?
- 编辑:我实际上并不关心确定哪些数字属于这个“团块”,我更感兴趣的是确定团块的中心位置,这就是为什么我认为
n
提前指定是可以的。但请随时纠正我!
问题 #2:假设确实如此,实现这样的事情的最佳方法是什么(特别是,我想要一个时间复杂度最低的解决方案)?到目前为止,我认为我有一个可以运行的解决方案n log n
:
- 首先,请注意,给定大小的最低标准偏差拥有子集必须由连续数字组成。所以第1步是对数字进行排序(这是
n log n
) 其次,取第一个
n
数字并计算它们的标准差。如果我们的数字数组是从 0 开始的,那么第一个n
数字是[0, n-1]
. 要获得标准偏差,请计算s1
和s2
如下:s1 = sum of numbers
s2 = sum of squares of numbers
然后,维基百科说标准差是
sqrt(n*s2 - s1^2)/n
. 将此值记录为迄今为止看到的最高标准偏差。[1, n]
找到,[2, n+1]
, ...的标准差,[3, n+2]
直到找到最后一个n
数字。如果您跟踪s1
和s2
运行总计,则每次计算只需要恒定的时间:例如,要获得 的标准差,只需从和总计[1, n]
中减去第 0 个元素并添加第 n 个元素,然后重新计算标准偏差。这意味着算法的整个标准偏差计算部分需要线性时间。s1
s2
所以总时间复杂度n log n
。
我的评价对吗?有一个更好的方法吗?我真的需要它在相当大的场景上快速运行,所以越快越好!空间不是问题(我认为)。