2017-05-25 222 views
-3

我必須在C++中構建「文本校正器」。這意味着教師將使用隨機英文「.txt」文件並使用我們的程序來檢測和糾正錯誤。要做到這一點,我們提供了一個英文字典,類似...... 350k不同的單詞。每個單詞佔一行。如果單詞存在於dictionary.txt中,我們必須檢查他的.txt文件中的每個單詞。從大文件中讀取特定行

現在...這個的主要問題是如何使用字典。由於單詞的長度不同,因此我無法使用表格將它們全部加載,然後在需要查找單詞時在表格中進行二分查找。

我希望有一種方法可以簡單地在文件中移動。這裏的大多數答案都是圍繞文件說「循環」,但這不是一種可能性,因爲我們對執行速度進行了評估,文件有350k字。幾千次循環大約350k字來修正文件將會變得漫長。

知道文件的長度,我不能說「轉到文件中間,比較這個詞,移動到文件的四分之一(或三個)等」嗎?因爲我有這個文件,而且我知道確切的大小......就像「去排隊」或「去這個角色」 - 從那裏我可以簡單地移動幾個字符來獲得完整的單詞。

+0

*由於單詞的長度不同,我幾乎不能使用表格 - 再次考慮。我相信這裏沒有必要進行文件工作,除了在開始的時候,你正在閱讀字典中的文字。在這個時代,350k字是沒有的。只需將這些單詞存儲在'std :: unordered_map'中,然後對其執行「查找」以查看是否存在單詞。 – PaulMcKenzie

+0

將整個文件加載到內存中會更快。我不明白你爲什麼要移動文件的一部分。 – drescherjm

+0

對於這種事情,標準模板庫是最好的選擇。在這種特殊情況下,將字典加載到std :: set(http://www.cplusplus.com/reference/set/set/)中,然後從集合中的文本中查找單詞。 – ravenspoint

回答

2

我相信你的問題需要基數樹。 https://en.wikipedia.org/wiki/Radix_tree

它允許您創建,存儲和搜索單詞詞典,當涉及到這類問題時,地圖的效率會更高。當你看到字母'c','o','r'時,你可以探索每個分支,看看它可能與「核心」,「正確」或「公司」匹配,例。

如果你查看HackerRank等在線算法練習網站,或者已經被亞馬遜或微軟採訪過,那麼這個問題就會出現。