2017q3 Homework1(prefix-search) === contributed by <`TsengWen`> ## 作業要求 * 在 GitHub 上 fork [prefix-search](https://github.com/sysprog21/prefix-search),並修改 `Makefile` 以允許 `$ make bench` 時,可對 ternary search tree 的實作做出效能評比,涵蓋建立 tst 和 prefix search 的時間,應比照 [clz](https://hackmd.io/s/Hyl9-PrjW) 透過統計模型,取出 95% 信賴區間 * 測試程式碼應該接受 `--bench` 的執行參數,得以在沒有使用者輸入的前題下,對 tst 程式碼進行效能分析,應涵蓋 `cpy` 和 `ref` 兩種途徑 (詳情參閱 `tst.h` 的程式碼註解) * 解釋 tst 的優點和引入 tst 到電話簿或戶政管理系統的適用性 * 修改 [test_ref.c](https://github.com/sysprog21/prefix-search/blob/master/test_ref.c),參照裡頭標註 `TODO` 的部分,替換成真正有效的 API 和對應的程式碼,這裡要求你學習分析現有的程式碼並得以擴充 * 分析 `test_cpy` 和 `test_ref` 兩種方式 (copy/reference) 的效能,並且針對現代處理器架構,提出效能改善機制 * 指出目前實作中,針對各國城市的 prefix search 有無缺陷呢?比方說無法區分城市和國家,並提出具體程式碼的修正 * 引入 [phonebook](https://hackmd.io/s/HJJUmdXsZ) 的基礎工作,透過 [ternary search tree](https://en.wikipedia.org/wiki/Ternary_search_tree) 讓電話簿程式得以更符合人性,當使用者新增資料時,可以在居住地透過 prefix search 找出最接近的城市並避免輸入錯誤 * 詳細觀察 `tst.h` 和 `tst.c` 為何要 forward declaration 呢?分離介面和實作有何好處呢?這樣的思維又該如何運用於 [phonebook](https://hackmd.io/s/HJJUmdXsZ) 呢?提出想法並且實作 * 研究程式碼的 `tst_traverse_fn` 函式,並思考如何運用這個實作,注意到 [callback function](https://en.wikipedia.org/wiki/Callback_(computer_programming)) 的程式開發技巧/模式 * 將你的觀察、上述要求的解說、應用場合探討,以及各式效能改善過程,善用 gnuplot 製圖,紀錄於「[作業區](https://hackmd.io/s/HkVvxOD2-)」 ## 建立tst時間 ### [Github](https://github.com/TsengWen/prefix-search) ### 想法 - cities insert的順序如果不相同,所建tst所需的時間不相同 #### 使用 shuf 打亂順序 ``` $ shuf cities.txt -o cities1.txt ``` :::danger 使用外部工具時,檢驗過亂數分佈了嗎?是 PRNG,抑或能有更好的分佈呢? :notes: jserv ::: #### 使用sort先排序過 ``` $ sort -g cities.txt -o cities2.txt ``` #### 比較三種所花的時間 ``` ternary_tree, loaded 259112 words in 0.136866 sec shuffle, loaded 259112 words in 0.118725 sec sort, loaded 259112 words in 0.094033 sec ``` - 打亂過的還會比原本時間較長?? - 不過預先sort過的時間都是有明顯降低 :::danger 1. 避免用「有時候」這種不精確的話,理工人這樣做事嗎?及早脫離文組^TM^ 2. 你需要詳細描述測試方法 (以及對應的理論,機率統計學過),並確保這樣的實驗得以「解讀」,需要量化 :notes: jserv ::: ![](https://i.imgur.com/IJFDNMK.png) - [github](https://github.com/TsengWen/prefix-search/tree/Sort) ## REF 修改 ### 參考 - [st9007a同學](https://hackmd.io/s/SkeKQEq3Z) ### 過程 - 試著尋找改成REF之後所出現的問題原因,大概的想法是結束時給的空間為word的空間是不正確的。 :::danger 1. 上面這是合理的中文描述嗎?找出問題,卻講不清楚,根本不該是理工人的行為,重寫! 2. Git commit messages 寫不好,這是我們不能接受的事,重新閱讀指教材並且強化表達。修改記錄都無法寫好,實在無法想像日後如何做研究 :notes: jserv ::: ```clike ``` - 後來發現fscanf(),擷取到空格為止,許多城市名稱不夠完整,所以改成fget()一行一行取。 -