記乙個n m演算法複雜度的優化過程

2021-06-28 02:54:22 字數 804 閱讀 2895

乙份關鍵字檔案按行儲存,數量大概在3-4萬。

乙份待查檔案按行儲存,大概在150萬行左右。

要求遍歷關鍵字檔案,找到待查檔案中包含該關鍵字的所有行,然後做聚合計算(本文不討論聚合計算的問題)。

由於遍歷查詢的過程是」包含「,因此按照傳統方法實現的演算法複雜度是n*m.這個實現方法明顯是不可接受的。

必須要想出優化方案。

由於本人之前對mysql研究比較多,於是想到了myisam引擎的全文索引。

具體實現方案是:

1、將待查檔案load data到myisam引擎的表裡面。

2、對相應的列建立全文索引。

3、遍歷關鍵字檔案,呼叫mysql查詢介面查詢全文索引表。

方案分析:

經過實踐這個方案主要時間消耗在建立索引上,因為mysql的全文索引是比較耗時的,查詢耗時也不少,平均在1.5秒左右。

不過比起最原始的方案,已經有了比較明顯的優化,但還是不能滿足最終效能的要求。

具體實現方案是:

1、對待查檔案每行進行分詞。

2、將切好的詞與待查檔案的每行建立對映關係,key:關鍵字,value:待查檔案的行的list.

3、查詢時之間map.get(key)就行。

主要講講分詞。

其實這就是乙個倒排序的過程,演算法複雜度由n*m降低到了n的複雜度。

對於分詞工具得選擇,我採用了mmseg4j,但mmseg4j有個弊端,如果詞庫中有中文+ask碼字元的詞時,它是不能按要求切分的。

於是看了下mmseg4j的原始碼,簡單的修改了下原始碼,實現了我的要求。

第一次寫部落格,如果有不準確的地方請大家多多指導。

如何來求取乙個演算法的時間複雜度?

如何計算時間複雜度 定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式 t n 稱為這一演算法的 時間複雜性 當輸入量n逐漸加大時,時間複雜性的極限情形稱為演算法的 漸近時間複雜性 我們常用大o表示法表示時間複雜性,注意它是某乙個演算法的時間複雜性。大o表示只...

乙個時間複雜度問題

有乙個字串陣列,將陣列中的每乙個字串按照字母序排序 之後再將整個字串陣列按照字典序排序。整個操作的時間複雜度是多少?假設最長的字串長度為 s 為什麼要假設最長字串呢?因為通常求的時間複雜度是上界,所以我們假象這個字串陣列中所有字串的長度都是最長的 s 這樣計算得出來的時間複雜度就是上界,包含了最壞的...

演算法的時間複雜度(一)

2.9 演算法的時間複雜度 2.9.1 演算法時間複雜度定義 在進行演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 t n o f n 它表示隨問題規模n的增大,演算法執行時間的增長...