工作上一个改进:一个输入序列的稳定输出
扫描二维码
随时随地手机看文章
近日在阅读吴军博士的《数学之美》,觉得他的思想是:“获得的大量的数据,然后采用概率和统计的方法,找出这些数据的规律”。受该思想的影响,对近一段工作上的一个问题加以改进:
假设,一个系统,每秒钟采集到一个数字,形成一个输入序列,如: 37, 37, 36, 37, 38, 37, 35, 37, 37....(用人的眼睛看,很容易看到,其稳定的数值是37)。但如果这个采集到的数字序列显示到屏幕上,如果不采用任何处理的方式,就会看到跳动和变化的37 36 35,这个问题的解决思路呢?
1. 设定一个先进先出FIFO的队列,队列的缓冲长度,就这个示例可以设为5,每采集到一个数字,进入这个队尾,如果长度大于了5,对头出队,这样就形成了一个移动着的“滑窗”,等待后续处理。
在C/C++语言中,直接使用std::list数据结构,来完成上述FIFO的滑窗,入队:list::push_back,出队:list::pop_back,判断队列中的元素数量:list::size。当然std::deque,vector也可以,使用vector时,注意其效率,因为滑窗中的数据元素移动复制,最好使用指针类型的数据结构。
2. 有了这个“滑窗”,就可以找出里面“出现概率最大的元素”。如果是C/C++语言,直接使用std::multiset来实现寻找最大值,将该滑窗序列的元素依次加入到该集合中,成员mulitset::count直接报出每个元素出现的个数。