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