算法 流量阀值统计求助

minix · 2016年05月15日 · 最后由 hging 回复于 2016年05月18日 · 7856 次阅读

我要做一个流量统计,需要统计出流量的阀值 (以 MB 为单位).

下面是 12 天里每天的流量列表:

12 9 130 13 8 12 10 210 7 15 11 13

这些流量里,130210是突发流量。怎么将突发的流量踢除并得到最高的阀值 (在这里的阀值是15)?

各位能否提供一个思路来,先谢谢了!

OT:阈 (yu) 值...不是 fa 值 😂

[1,2,3,4].delete_if {|x| x > 3}.max

这样?显然这个并不是算法...

#2 楼 @hging 不好意思,我没表达清楚,其实突发流量是不一样的,有时有 3 个突发的,有时 1 个突发的。今天查了资料觉得聚类算法可以实现,我到时候看下能不能得到我预期的效果。

@ch3n 不好意思,书读得少,所以错别字多了点。谢谢你指出来

我想到两个方法:

  1. 先对数组排序,再遍历一遍,当array[i] - array[i-1] > threshold时,array[i] 就是你想要的阈值?
  2. 前提是突发的流量占据少数,所以先计算所有元素的平均值 avg, 之后遍历数组,当某个元素远大于 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 就行了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号