个人项目【 完成总结】
?
一、針對《寫在前面》的補充
隨著對需求的深入了解,最后拋棄了使用trie樹,一是這個數據結構不利于處理大小寫敏感的問題,二是最后的排序首先是由出現的次數排的,需要對此樹進行遍歷也不方便編碼,遂棄之。
二、時間
完成文件讀取:20分鐘
正則匹配:1個小時
頻率分析:4個小時
模式二三:2個小時
調試與優化:1個小時
三、代碼部分解析
1.文件讀取
在網上搜到了c#語法中的一個方法,能夠將某個目錄下所有的文件建立一個字符串數組,如果在加上linq的使用,可以免去寫遞歸算法,只需要用一個語句就能把目錄中滿足要求的文件全部找到,由于是第一次寫c#的程序,對linq相關的用法還需要多學習,這里就不賣弄了。
2.正則匹配
這個我是參考班上同學的匹配寫的,也是我第一次在字符串處理中使用正則表達式,記得上學期面向對象寫Java的時候,對命令要求都是嵌套很多if去寫的,過去的天真亦不敢想= =
3.頻率分析
決定不用trie樹以后,自然想用到c#的hashtable或者dictionary,http://blog.163.com/jeson_lwj/blog/static/13576108320101187546107/ 參考此文后選擇了dictionary(也就是說,并沒有實現多線程),還有一個sorted dictionary,我留在優化的時候來說這個問題。
dictionary由<key,value>這個二元組完成每一項的構建,從本次作業的需求來講,對于每一個單詞需要存儲的不僅僅是它出現的次數,還有其已經出現過的ascii碼最靠前的形式,剛開始的時候我是用兩個dictionary實現的,完成創建以后首先對存有次數的dictionary進行排序,之后在對應的第二個dictionary中找到正確的形式,后來發現定義中的value是個object,想到能否用一個class的對象作為value,就只需要一個dictionary了。代碼便是如此實現的。排序仍然是用的c#的新語法,這都是本次項目完后我需要重點詳細學習的部分。
4.模式二三
主要思路就是將詞組當成一個匹配模式進行匹配,下一次匹配在當前匹配的index基礎上加上空格出現的地方,以兩個單詞的為例:對于how are you這三個詞,首先得到how are這個正確的匹配,將其加入dictionary,使匹配的起始位置從a開始繼續匹配,這時可以找到are you這個匹配,這應該就是模式二三比模式一需要多做的事情了。這一段代碼需要對正則regex的方法很熟捻,感謝高哥的幫助。
5.調試與優化
a.剛才提到了sorted dictionary,開始想到有一個按字典序輸出的要求,就用了對key自然有序的sorted dictionary,但是程序跑得非常慢,還是用了簡單的dictionary,排序就在后面用代碼實現了,其實也就是一行代碼。
b.講一個細節,在一個if循環里面,會交替用到一個單詞的原型和它的小寫形式,我在最開始寫的時候每次用小寫就會調用一次ToLower()方法,優化的時候用一個新的String先把小寫存起來,不再頻繁調用方法,直觀來看,在模式一下,程序快了3秒(針對一個36MB大小的測試用例)
?
四、test cases
分別對空文件、空目錄,各邊界值進行了測試,測試用例都很簡單,因此不再詳細地貼出測試用例了,值得說明的是在測試時發現了下劃線的問題,這還是應歸到正則表達式的學習上,也不再贅述了。
五、性能分析:
測試用例大小是一個36MB的txt文件夾(多個txt文件)
轉載于:https://www.cnblogs.com/code-dog-liou/p/3991718.html
總結
以上是生活随笔為你收集整理的个人项目【 完成总结】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svn安装的几种方法
- 下一篇: placeholder在IE8中兼容性问