1.做這個專案之前,因為之前在OO課中做過一些專案,這鐘演算法也非常熟悉,因此算上單純的詞法演算法,和C#語言中檔案操作的學習,預計一天之內應該可以寫好。
2.實際上做起來時,我發現c#與之前學過的java還是有些差別的,演算法非常簡單,但是學習使用c#花了許多時間,零零碎碎共做了2天。
3.原本一直認為程式的最大資源使用會是單詞按詞頻排序,但是經過演算法的分析,還是單詞+空格+單詞這種格式的判斷比較耗費時間
我的演算法是這樣的:讀入一個文字檔案的所有字元,以一個字串形式儲存。從頭到尾遍歷字串,認為大小寫字母和數字都是“字元”,其他都是分隔符,這樣整個字串就是這樣的形式:
字元+分隔符+字元+分隔符+...
將所有字元按順序儲存於一個陣列中,將所有分隔符也儲存在一個陣列中。
這樣第i個分隔符的左右兩個字元就是第i個字元和第i+1個字元(若i+1還在字元陣列的範圍內)
字元並不是等同於要求中的單詞,需要經過檢查。
建立單詞類,由一個字串“單詞” 和一個整形數“數量”組成。
功能1:新建單詞陣列,從前往後遍歷字元陣列,有符合單詞的條件的字元就加入陣列。陣列在加入單詞時檢查這個單詞(無視大小寫)是否存在過,若不存在新加單詞,若存在則數量加1並更新這個單詞的大小寫。然後陣列按單詞詞頻排序,數量相等的單詞按名稱字典序升序排序。
功能2:新建“雙單詞”陣列,遍歷分隔符陣列,若分隔符是單個空格,則檢查這個分隔符兩旁的字元是否都是單詞(若越界則不檢查),若都是單詞,將這個“左單詞”+“ ”+“右單詞”
的字串加入“雙單詞”陣列中,處理方法同功能1,輸出詞頻前10位。
功能3:新建“三單詞”陣列,遍歷分隔符陣列,若連續兩個分隔符都是單個空格,則檢查這兩個分隔符附近的三個字元是否都是單詞(若越界則不檢查),若都是單詞,將這個“左單詞”+“ ”+“中單詞”+“ ”+“右單詞”的字串加入“三單詞”陣列中,處理方法同功能1,輸出詞頻前10位。
4.測試用例:共取了紐約時報上的10篇文章,有些位於測試檔案目錄下,有些位於測試檔案目錄中的檔案目錄下
與我的隊友一起測試,將取得的結果進行對比。
5.要提高程式效率,一個好的演算法非常重要,這少不了程式設計前的細緻分析。另外,我注意到,我寫的程式的可移植性很差,整體來看功能是可以的,但是內部幾個部分的程式設計風格還是十分粘滯,我寫其他程式時經常要把已經寫過的功能再寫一遍。這並不是什麼好習慣,我在以後的程式設計過程中一定會注意。