Re: [問題] C++ 讀檔(.dat)>跨行計算>輸出
原文恕刪
--
如果看到這樣的需求,
我覺得可以分成兩個部分來想:
1. 把數字讀進來
2. 算出rolling average
讀數字的部分,如果不考慮data cleaning之類的,
我覺得基本上就是一行一行,用各種方法找到想要的欄位,
通常我應該是會用STL string搭配stringstream,
但考慮到這個檔案的delimiter是空白,用ifstream就可以
找到欄位後就是看要用什麼資料結構來存,
考慮到檔案長度未知,全部讀進來有一些風險,
比如記憶體用量,或是buffer overflow之類常見的array/pointer問題,
我覺應該是思考怎麼樣在讀進一個數的時候,
就可以算出相對應的rolling average,
也就是這個資料結構跟算rolling average的演算法有關連
--
算n筆數據的rolling average有各種作法,比較核心的是「要記得最近的n筆資料」,
而且要「把最舊的那筆去掉,然後放進最新的一筆資料」,
因此使用queue是很自然的作法,利用他FIFO的特質,自動保存歷史紀錄,
新的資料進來的時候pop掉最前面的就好
這樣的好處是不用自己維護歷史紀錄,反正都在queue裡面;
而且不用把所有的資料都存起來,可以避免潛在的記憶體問題
但為了要得到rolling average,你要有這些歷史資料的總和,
因此利用另外一個變數儲存目前的總和,就可以得到平均值
而每次新的資料進來時,就更新總和就好,
畢竟queue可以很快的讀取「最舊的那筆資料」,
搭配新進來的資料,就只是加加減減的問題,是constant time
因此記憶體用量是O(rolling avg的n),
速度是O(資料大小)。
--
以下為sample code:
https://ideone.com/3E7EhU
因為網路上的compiler通常沒有提供local file system,
所以請自己產生.dat檔,然後改掉58行的檔名就好
然後目前是n = 2的rolling avg,
要改成別的n就修改第11行就好
以上
--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.200.60.168 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1577856073.A.CB5.html
→
01/01 16:32,
4年前
, 1F
01/01 16:32, 1F
嗯嗯打錯惹,感激
※ 編輯: iaminanl (1.200.60.168 臺灣), 01/01/2020 17:14:28
討論串 (同標題文章)