近日在閱讀吳軍博士的《數(shù)學之美》,覺得他的思想是:“獲得的大量的數(shù)據(jù),然后采用概率和統(tǒng)計的方法,找出這些數(shù)據(jù)的規(guī)律”。受該思想的影響,對近一段工作上的一個問題加以改進:
假設,一個系統(tǒng),每秒鐘采集到一個數(shù)字,形成一個輸入序列,如: 37, 37, 36, 37, 38, 37, 35, 37, 37....(用人的眼睛看,很容易看到,其穩(wěn)定的數(shù)值是37)。但如果這個采集到的數(shù)字序列顯示到屏幕上,如果不采用任何處理的方式,就會看到跳動和變化的37 36 35,這個問題的解決思路呢?
1. 設定一個先進先出FIFO的隊列,隊列的緩沖長度,就這個示例可以設為5,每采集到一個數(shù)字,進入這個隊尾,如果長度大于了5,對頭出隊,這樣就形成了一個移動著的“滑窗”,等待后續(xù)處理。
在C/C++語言中,直接使用std::list數(shù)據(jù)結構,來完成上述FIFO的滑窗,入隊:list::push_back,出隊:list::pop_back,判斷隊列中的元素數(shù)量:list::size。當然std::deque,vector也可以,使用vector時,注意其效率,因為滑窗中的數(shù)據(jù)元素移動復制,最好使用指針類型的數(shù)據(jù)結構。
2. 有了這個“滑窗”,就可以找出里面“出現(xiàn)概率最大的元素”。如果是C/C++語言,直接使用std::multiset來實現(xiàn)尋找最大值,將該滑窗序列的元素依次加入到該集合中,成員mulitset::count直接報出每個元素出現(xiàn)的個數(shù)。