Re: [問題] C++ 讀檔(.dat)>跨行計算>輸出

看板C_and_CPP作者 (吉爾摩)時間4年前 (2020/01/01 13:21), 4年前編輯推噓0(001)
留言1則, 1人參與, 4年前最新討論串3/3 (看更多)
原文恕刪 -- 如果看到這樣的需求, 我覺得可以分成兩個部分來想: 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
queue是FIFO stack才是LIFO
01/01 16:32, 1F
嗯嗯打錯惹,感激 ※ 編輯: iaminanl (1.200.60.168 臺灣), 01/01/2020 17:14:28
文章代碼(AID): #1U32n9or (C_and_CPP)
文章代碼(AID): #1U32n9or (C_and_CPP)