2016-04-07 39 views
1

假設我們有兩個文本輸入。 「input1」是小說中的一個頁面。 「輸入2」是一個隨機的句子「你好嗎?」。我需要驗證這個輸入2是否可以使用input1中的單詞構造。我只能解決這個問題,就像這樣。如何驗證輸入2是否可以使用Java在輸入1中使用單詞構造?

步驟0:創建布爾標誌並將值設置爲true。

step1:將第一個輸入分成標記並存儲每個詞在散列圖中出現的次數。

step2:將第二個輸入拆分爲令牌並遍歷令牌。

step3:在循環內部,檢查當前令牌是否存在於地圖中。如果不是,則將布爾標誌設置爲false並退出循環。如果是,請檢查從Map返回的條目的值。如果它爲零,則將布爾標誌設置爲false並退出循環。如果值是一個或多個,則將其減1並繼續循環。

step4:一旦循環完成,返回布爾標誌的值。

正如您所看到的,如果輸入很大,步驟1和步驟3可能需要很長時間。有什麼解決這個問題的方法可以有更好的運行時間?

回答

5

你正在墮入「過早優化」(查看它)。你的方法是合理的,實施一些東西並看看它是如何執行的。 Java Map的速度可能會有多快,並且分成令牌(單詞)將不會很耗時。

只有在確定您遇到性能問題後,才需要進行優化,然後僅優化您的分析工作確定爲有問題的代碼。任何其他方法都會浪費您的時間,這比幾萬億次CPU週期要貴很多。

編輯在在註釋的額外信息光:

如果你知道(在這個問題「隨機句」)的目標短語

一個改進可以作出總是比主文本短了很多。翻轉解決方案並將目標詞語放在Map中,並在掃描主文本時使用類似的算法。您的搜索空間會更小,只要您在正文中找到足夠的單詞,就可以停下來。

但是,只有目標短語始終短於未明確指定的主文本時,纔會更快。對於指定數量級的文本大小(一頁一句),性能差異幾乎不可測量。

+0

這是非常合理的建議,你對過早優化絕對正確。我在一次採訪中被問到這個問題,採訪者堅持認爲他們是解決這個問題的更好的解決方案。只是試圖找出它是什麼......(在面試結束時我忘了問他) – RKodakandla

+0

如果您在原始問題中包含了所有相關信息,這將有所幫助。我編輯了我的答案,以提供一個替代解決方案。 –