实现一个类似RRDTool的算法
RRDTool 中有一种算法:
- 每周的数据按每天汇总
- 每月的数据按每周汇总
- 每年的数据按每月汇总
或者说实现以下需求:
- 时间在三个月以内的,保留全部
- 时间在3-6个月的,每天保留一个
- 时间在6-9个月的,每周保留一个
基本的思路如下:
- 选取所定义的时间范围的所有内容
a[]
,时间差为s
- 将
a[0]
定义为基准元素 - 遍历元素,与基准元素时间差
< s
的,删除 - 与基准元素时间差
>= s
的,该元素成为新的基准元素
以下是一个演示程序,生成一个1-100的数组,然后按照一定的策略删除(置0)其中的元素。
package main
import (
"fmt"
)
var a []int
func init() {
for i := 1; i <= 100; i++ {
a = append(a, i)
}
}
func main() {
fmt.Println("Origin:", a, "\n")
b := make([]int, 0)
baseLine := a[0] // 基准值
for i, _ := range a {
if i < 10 {
b = append(b, a[i])
baseLine = a[i]
continue
}
if i >= 10 && i < 30 {
if a[i]-baseLine >= 2 {
baseLine = a[i] // 更新基准值
b = append(b, a[i])
continue
}
a[i] = 0
}
if i >= 30 && i <= 50 {
if a[i]-baseLine >= 5 {
baseLine = a[i]
b = append(b, a[i])
continue
}
a[i] = 0
}
if i >= 50 {
if a[i]-baseLine >= 10 {
baseLine = a[i]
b = append(b, a[i])
continue
}
a[i] = 0
}
}
fmt.Println("Proceed:", a, "\n")
fmt.Println("Human:", b)
}