欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript 上萬關(guān)鍵字瞬間匹配實現(xiàn)代碼

 更新時間:2013年07月07日 23:36:21   作者:  
發(fā)一篇之前寫的文章,平時還是經(jīng)常用到的,尤其是河蟹詞特別多的聊天系統(tǒng)里
提到關(guān)鍵字搜索,首先聯(lián)想到的無非就是使用一些indexOf,replace之類的字符函數(shù),最多加上一些正則表達(dá)式而已.實現(xiàn)起來雖然很簡單,但是這背后的效率問題可曾仔細(xì)考慮過?例如論壇中的關(guān)鍵字過濾,一般情況下需過濾的關(guān)鍵字?jǐn)?shù)量及檢測的文本長度都不大,所以這一瞬間的過程沒有太多值得關(guān)注的地方。但若關(guān)鍵字?jǐn)?shù)量不在是屈指可數(shù),而是有成千上萬, 并且待檢測的文本也是一長篇大論,結(jié)果可不再是那么樂觀了。大家都知道,每多一個關(guān)鍵字,就要增加一次全文的檢索,最終花費的時間將遠(yuǎn)遠(yuǎn)超出可接受的范圍內(nèi)。
  
  既然考慮的是那種極端的關(guān)鍵字搜索,通常的逐個遍歷搜索顯然是行不通的。如今用的是JavaScript,若不使用Hash表實在是太對不起這門語言了。有著對表特天獨厚的支持,不妨就拿出少量的空間來換取大量的時間吧。
  
  先看個例子,比如有如下的關(guān)鍵字: foo1,foo2,bar1,bar2,既然要用空間換時間,因此搜索之前先將他們預(yù)處理。前面提到了JS靈活又高效的表,顯而易見,使用樹的結(jié)構(gòu)是最有優(yōu)勢的。即使不明白,也沒關(guān)系,最終實現(xiàn)結(jié)構(gòu)正如如下的代碼,熟悉JSON同樣很親切:
復(fù)制代碼 代碼如下:

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


這一層層的結(jié)構(gòu)正如一棵樹,每個字符便是樹的一個分枝,到了最后一個字符便是樹葉,不再有新的節(jié)點。
  此時你應(yīng)該明白了,只要對文章的每個字沿著這棵樹往下搜就是了。能到達(dá)樹葉的,就說明當(dāng)前字符就是關(guān)鍵字的一個;中途尋找不到對應(yīng)枝干的,當(dāng)然就不是關(guān)鍵字。

  例如foo1,順著Root結(jié)構(gòu)向下訪問,最終到達(dá)Root['f']['o']['o']['1'],即完成了一次匹配。之后跳過foo1的長度,繼續(xù)往后檢索。

  因此,整篇文章只需一次檢索,即可找出每個關(guān)鍵字的位置。
  由于JS的hash表性能非常高,所以所謂的尋找枝干也就非常的快了。因為JS的靈活性,實現(xiàn)此效果的代碼同樣很簡短。
  
  事實上可以發(fā)現(xiàn),關(guān)鍵字的數(shù)量與搜索的時間并沒太多的關(guān)系,那僅僅影響了樹的寬度而已,只有文章的長度才是決定搜索的時間。
  
  來一次極限測試:
  關(guān)鍵字: 成語全集(19830條)
  內(nèi)容:誅仙全集.txt (1659219字)
  用時:935ms
  (Chrome26 / i3-2312的CPU)
160萬字的文章,匹配2萬個關(guān)鍵字,還不到1秒的時間??梢?,充分利用JavaScript的靈活性,仍能發(fā)揮很大的潛力。

相關(guān)文章

  • JS正則替換去空格的方法

    JS正則替換去空格的方法

    這篇文章主要介紹了JS正則替換去空格的方法,結(jié)合實例形式對比分析了針對全角與半角空格的刪除技巧,涉及replace正則替換的使用方法,需要的朋友可以參考下
    2017-03-03
  • 原生js canvas實現(xiàn)鼠標(biāo)跟隨效果

    原生js canvas實現(xiàn)鼠標(biāo)跟隨效果

    這篇文章主要為大家詳細(xì)介紹了原生js canvas實現(xiàn)鼠標(biāo)跟隨效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • JS+CSS實現(xiàn)炫酷算盤時鐘效果

    JS+CSS實現(xiàn)炫酷算盤時鐘效果

    這篇文章主要為大家詳細(xì)介紹了如何使用JavaScript和CSS實現(xiàn)炫酷算盤時鐘效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • ES6新特性之解構(gòu)、參數(shù)、模塊和記號用法示例

    ES6新特性之解構(gòu)、參數(shù)、模塊和記號用法示例

    這篇文章主要介紹了ES6新特性之解構(gòu)、參數(shù)、模塊和記號用法,結(jié)合實例形式分析了解構(gòu)、參數(shù)、模塊和記號的功能、用法及相關(guān)使用注意事項,需要的朋友可以參考下
    2017-04-04
  • document.write的幾點使用心得

    document.write的幾點使用心得

    一直用document.write()方法向瀏覽器中顯示數(shù)據(jù)用,把它當(dāng)做Alert()使用, 看來這樣用有些大材小用了,下面說說它的主要用處。
    2014-05-05
  • 使用JavaScript實現(xiàn)alert的實例代碼

    使用JavaScript實現(xiàn)alert的實例代碼

    本文通過實例代碼給大家介紹了js實現(xiàn)alert的方法,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-07-07
  • javascript彈出頁面回傳值的方法

    javascript彈出頁面回傳值的方法

    這篇文章主要介紹了javascript彈出頁面回傳值的方法,實例分析了由a1.html彈出的b1.html回傳值的實現(xiàn)方法,非常具有實用價值,需要的朋友可以參考下
    2015-01-01
  • JavaScript實現(xiàn)翻頁功能(附效果圖)

    JavaScript實現(xiàn)翻頁功能(附效果圖)

    這篇文章主要介紹了JavaScript實現(xiàn)翻頁功能(附效果圖),在項目需求中經(jīng)常遇到,今天小編抽時間給大家分享JavaScript實現(xiàn)翻頁功能實例代碼,需要的朋友參考下吧
    2017-02-02
  • Javascript 判斷Flash是否加載完成的代碼

    Javascript 判斷Flash是否加載完成的代碼

    網(wǎng)站加入flash廣告代碼,利用DIV層來控制進(jìn)度的狀態(tài),如果加載swf文件到100%的時候就顯示出flash,把AD層隱藏掉,請看下面實現(xiàn)方法。
    2010-04-04
  • 微信小程序人臉識別功能代碼實例

    微信小程序人臉識別功能代碼實例

    這篇文章主要介紹了微信小程序人臉識別功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評論