實現方案優劣的思考
之前我們的實現方案的優點是一旦目標詞庫的簽名建立後,則變位詞的查詢會變得簡單而快速;缺點是由於在生成目標詞庫時,要為每個詞都生成簽名,導致生成詞庫的時間會變慢,同時會消耗空間。對於那些沒有被查詢到的字串的簽名實際上是浪費的。
測試結果:在cpu為inter core i3-2328m,記憶體為6gb的pc上生成數量為1萬的目標詞庫平均時間為377毫秒,查詢變位詞的平均時間為11毫秒。
第二種方案
在生成目標詞庫的時候並不生成簽名,而是在查詢的時候生成簽名。
function search(str)測試結果:生成數量為1萬的目標詞庫平均時間為130毫秒,查詢變位詞的平均時間為530毫秒。}return mathstr; //返回找到的變位詞
}
該方案雖然提高了生成目標詞庫的速度,並節省空間,但是查詢的速度太慢,與第一種方案相比較慢了約50倍。分析**發現每次查詢都需要為目標詞庫重新建立一遍簽名,效率太過低下,考慮優化。
第二種方案的優化
針對第二種方案的不足之處,考慮做如下優化:如果兩個詞互為換位詞,那麼這兩個詞的長度必定相同,同時組成這兩個詞的字母的asscii編碼之和也必定相同,因此在遍歷目標詞庫時,首先判定這兩個條件,如果滿足則再獲取其簽名來作比較。獲取字母的ascii編碼採用charcodeat()函式。
function search(str)}}經測試,優化後的查詢速度平均為43毫秒,速度提公升還是很有效果的!return mathstr;
}//獲得字串的ascii碼之和
function get_asciicode_total(str)
return i;
}
總結
該題主要是偏向於對問題的思考、解決方案的制定、實現與選擇、**優化等方面,在實際工作中,往往乙個問題的解決會有多套方案,大家應該學會從各方面來衡量、測試,最終選擇解決的問題的最優方案。該題主要涉及到隨機數的操作、排序演算法的掌握、ascii編碼的掌握。
當然,以上兩種方案仍有優化的空間,對於第一種,可以考慮將簽名陣列按照簽名來排序,這樣就無需每次都遍歷整個簽名陣列,如果生成的目標詞庫數量巨大,還可以考慮將簽名陣列分段索引,以便能更快的找到簽名;對於第二種,可以將查詢中已生成的簽名儲存下來,這樣下次查詢再遇到該字串該就無需再生成簽名了,因為在整個程式中,最影響效能的就是生成簽名,我們應儘量減少生成簽名的操作。
示例**
變位詞的查詢(上)
這次我們聊乙個比較有意思的話題 變位詞的查詢,這個話題在 程式設計珠璣 現,此書很經典,偏向於演算法,大家如果能通讀的話,肯定受益匪淺!什麼是變位詞 不同的單詞,如果其組成的字母相同的話,那麼這些單詞就互為變位詞,譬如pots stop tops這三個單詞就是互為變位詞,都是由字母p o t s組成...
尋找變位詞
程式設計珠璣 五 尋找變位詞 今天的問題是關於變位詞的,首先來看問題的描述 給定一本英語單詞詞典,請找出所有的變位詞集。所謂的變位詞是指,組成各個單詞的字母完全相同,只是字母排列的順序不同。比如,pots stop tops就是變位詞。將變位詞程式組織成三段式的 管道 結構,前乙個程式的輸出檔案將是...
變位詞排序
請編寫乙個方法,對乙個字串陣列進行排序,將所有變位詞合併,保留其字典序最小的乙個串。這裡的變位詞指變換其字母順序所構成的新的詞或短語。例如 和 integral 就是變位詞。給定乙個string的陣列str和陣列大小int n,請返回排序合併後的陣列。保證字串串長小於等於20,陣列大小小於等於300...