首頁  >  文章  >  web前端  >  JavaScript 上萬關鍵字瞬間匹配實作程式碼_javascript技巧

JavaScript 上萬關鍵字瞬間匹配實作程式碼_javascript技巧

WBOY
WBOY原創
2016-05-16 17:29:53978瀏覽

提到關鍵字搜索,首先聯想到的無非就是使用一些indexOf,replace之類的字符函數,最多加上一些正則表達式而已.實現起來雖然很簡單,但是這背後的效率問題可曾仔細考慮過?例如論壇中的關鍵字過濾,一般情況下需過濾的關鍵字數量及檢測的文字長度都不大,所以這一瞬間的過程沒有太多值得關注的地方。但若關鍵字數量不在是屈指可數,而是有成千上萬, 而待檢測的文字也是一長篇大論,結果可不再是那麼樂觀了。大家都知道,每多一個關鍵字,就要增加一次全文的檢索,最終花費的時間將遠遠超出可接受的範圍。
  
  既然考慮的是那種極端的關鍵字搜索,通常的逐個遍歷搜索顯然是行不通的。如今用的是JavaScript,若不使用Hash表實在是太對不起這門語言了。有著對錶特天獨厚的支持,不妨就拿出少量的空間來換取大量的時間。
  
  先看個例子,例如有如下的關鍵字: foo1,foo2,bar1,bar2,既然要用空間換時間,因此搜尋之前先將他們預處理。前面提到了JS靈活又有效率的表,顯而易見,使用樹的結構是最有優勢的。即使不明白,也沒關係,最終實現結構正如如下的程式碼,熟悉JSON同樣很親切:

複製程式碼 程式碼如下:

var Root =
{
    f:
    {
         o:
            {
: true,
: true
            }
        }
   🎜>        {
             r:
        
: true
         會樹的一個分枝,到了最後一個字符是樹葉,不再有新的節點。
  此時你應該明白了,只要對文章的每個字沿著這棵樹往下搜就是了。能到達樹葉的,就表示當前字元就是關鍵字的一個;中途尋找不到對應枝幹的,當然就不是關鍵字。

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

  因此,整篇文章只需一次檢索,即可找出每個關鍵字的位置。
  由於JS的hash錶性能非常高,所以所謂的尋找枝幹也就非常的快了。因為JS的靈活性,實現此效果的程式碼同樣很短。
  
  事實上可以發現,關鍵字的數量與搜尋的時間並沒太多的關係,那隻影響了樹的寬度而已,只有文章的長度才是決定搜尋的時間。
  
  來一次極限測試:
  關鍵字: 成語全集(19830條)
  內容:耦〦全集. 26 / i3- 2312的CPU)
160萬字的文章,符合2萬個關鍵字,還不到1秒的時間。可見,充分利用JavaScript的彈性,仍能發揮很大的潛力。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn