我要做一个流量统计,需要统计出流量的阀值 (以 MB 为单位).
下面是 12 天里每天的流量列表:
12 9 130 13 8 12 10 210 7 15 11 13
这些流量里,130和210是突发流量。怎么将突发的流量踢除并得到最高的阀值 (在这里的阀值是15)?
各位能否提供一个思路来,先谢谢了!
OT:阈 (yu) 值...不是 fa 值
[1,2,3,4].delete_if {|x| x > 3}.max
这样?显然这个并不是算法...
#2 楼 @hging 不好意思,我没表达清楚,其实突发流量是不一样的,有时有 3 个突发的,有时 1 个突发的。今天查了资料觉得聚类算法可以实现,我到时候看下能不能得到我预期的效果。
@ch3n 不好意思,书读得少,所以错别字多了点。谢谢你指出来
我想到两个方法:
array[i] - array[i-1] > threshold
avg
threshold = 15 arr.map{|ele| [threshold, ele].min }
#3 楼 @minix 我的意思是你怎么动态调整这个阈值的问题。就跟 4 楼方法一样。先计算平均值 然后把平均值当做阈值 然后把阈值之上的都删掉。求最大就好了。
@neel @hging 谢谢两位的提供的思路。根据你们的思路,我写了一个粗糙的版本,结果也是我想要的。
#!/usr/bin/env ruby new_arr = [] arr = [12, 9, 130, 13, 8, 12, 10, 210, 7, 15, 11, 13] avg = arr.inject{ |sum, el| sum + el }.to_f / arr.size arr.map { |item| new_arr << item if item < avg } puts new_arr.max
#7 楼 @minix 后面只需要 arr.delete_if{|x|x>=avg}.max 就行了。
arr.delete_if{|x|x>=avg}.max