JavaScript 上萬關鍵字瞬間匹配

來源:互聯網
上載者:User

  發一篇之前寫的文章,平時還是經常用到的,尤其是河蟹詞特別多的聊天系統裡。

  -------------------------------------------------

  提到關鍵字搜尋,首先聯想到的無非就是使用一些indexOf,replace之類的字元函數,最多加上一些Regex而已.實現起來雖然很簡單,但是這背後的效率問題可曾仔細考慮過?例如論壇中的關鍵字過濾,一般情況下需過濾的關鍵字數量及檢測的文本長度都不大,所以這一瞬間的過程沒有太多值得關注的地方。但若關鍵字數量不在是屈指可數,而是有成千上萬, 並且待檢測的文本也是一長篇大論,結果可不再是那麼樂觀了。大家都知道,每多一個關鍵字,就要增加一次全文的檢索,最終花費的時間將遠遠超出可接受的範圍內。

  

  既然考慮的是那種極端的關鍵字搜尋,通常的逐個遍曆搜尋顯然是行不通的。如今用的是JavaScript,若不使用Hash表實在是太對不起這門語言了。有著對錶特天獨厚的支援,不妨就拿出少量的空間來換取大量的時間吧。

  

  先看個例子,比如有如下的關鍵字: foo1,foo2,bar1,bar2,既然要用空間換時間,因此搜尋之前先將他們預先處理。前面提到了JS靈活又高效的表,顯而易見,使用樹的結構是最有優勢的。即使不明白,也沒關係,最終實現結構正如如下的代碼,熟悉JSON同樣很親切:

var Root ={    f:    {        o:        {            o:            {                1: true,                2: true            }        }    },    b:    {        a:        {             r:            {                1: true,                2: true            }        }    }};

  

  這一層層的結構正如一棵樹,每個字元便是樹的一個分枝,到了最後一個字元便是樹葉,不再有新的節點。

  此時你應該明白了,只要對文章的每個字沿著這棵樹往下搜就是了。能到達樹葉的,就說明當前字元就是關鍵字的一個;中途尋找不到對應枝乾的,當然就不是關鍵字。

  例如foo1,順著Root結構向下訪問,最終到達Root['f']['o']['o']['1'],即完成了一次匹配。之後跳過foo1的長度,繼續往後檢索。

  因此,整篇文章只需一次檢索,即可找出每個關鍵字的位置。

  由於JS的hash表效能非常高,所以所謂的尋找枝幹也就非常的快了。因為JS的靈活性,實現此效果的代碼同樣很簡短。

  大家可以在我的空間裡預覽:

  http://www.etherdream.com/funnyscript/Keyword/Keyword.html

  

  事實上可以發現,關鍵字的數量與搜尋的時間並沒太多的關係,那僅僅影響了樹的寬度而已,只有文章的長度才是決定搜尋的時間。

  

  來一次極限測試:

  關鍵字: 成語全集(19830條)

  內容:誅仙全集.txt (1659219字)

  用時:935ms

  (Chrome26 / i3-2312的CPU)

  160萬字的文章,匹配2萬個關鍵字,還不到1秒的時間。可見,充分利用JavaScript的靈活性,仍能發揮很大的潛力。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.