在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

列劃分算法,使得這個本就很牛的算法性能直接提高一倍

算法與數據結構 ? 來源:未知 ? 作者:李倩 ? 2018-09-23 14:36 ? 次閱讀

前言

我最近一直在公司做檢索性能優化。當我看到這個算法之前,我也不認為我負責的檢索系統性能還有改進的余地。但是這個算法確實太牛掰了,足足讓服務性能提高50%,我不得不和大家分享一下。其實前一段時間的博客中也寫到過這個算法,只是沒有細講,今天我準備把它單獨拎出來,說道說道。說實話,本人數學功底一般,算法證明不是我強項,所以文中的證明只是我在論文作者的基礎上加入了自己的思考方法,并且還沒有完全證明出來,請大家見諒 ! 歡迎愛思考的小伙伴進行補充。我只要達到拋磚引玉的作用,就知足了。

回歸正題,我們的檢索服務中用到了最小編輯距離算法,這個算法本身是平方量級的時間復雜度,并且很少人在帖子中提到小于這個復雜度的算法。但是我無意中發現了另外一個更牛的算法:列劃分算法,使得這個本就很牛的算法性能直接提高一倍。接下來進入正題。

列劃分算法

這個算法比較難理解,出自如下論文:《Theoretical and empirical comparisons of approximate string matching algorithms》。In Proceedings of the 3rd Annual Symposium on Combinatorial Pattern Matching, number 664 in Lecture Notes in Computer Science, pages 175~184. Springer-Verlag, 1992。Author:WI Chang ,J Lampe。所以有必要先給大家普及一些共識。

編輯矩陣最小編輯距離在計算過程中使用動態規劃算法計算的那個矩陣,了解這個算法的都懂,我不贅述。但是我們的編輯矩陣有個特點:第一行都是0,這么做的好處是:只要文本串T中的任意一個子序列與模式串P的編輯距離小于某個固定的數值,就會被發現。

給大伙一個樣例,文本串T=annealing,模式串P=annual:

注意,第一行都是0,這是與傳統最小編輯距離的最大區別,其余的動歸方程完全相同。

對角線法則編輯矩陣沿著右下方對角線方向數值非遞減,并且至多相差1。

行列法則每行每列相鄰兩個數至多相差1。

觀察編輯距離矩陣,我們發現如下事實:每一列是由若干段連續數字組成。所以我們把編輯矩陣的每一列劃分成若干連續序列,如下圖所示:

紅色框中就是一個一個的序列,序列內部連續。

序列-δ 定義對于編輯矩陣的每一個元素D[j][i] (j是行,i是列),若 j – D[j][i] = δ,我們就說D[j][i]屬于i列上的 序列-δ,我們還觀察到隨著j增大,j – D[j][i]是非遞減的。如下圖所示:

序列-δ終止位置每個序列都會有起始和終止位置。序列-δ的終止位置為j,如果j是序列-δ的最小橫坐標,并且滿足D[j+1][i]屬于序列-ε,并且ε>δ(即j+1-D[j+1][i]>δ)。

長度為0的序列我們發現如果按照如上定義,每一列上δ的值并不一定連續,總是或有或無的缺少一個數值。所以我們定義長度為0的序列:當D[j+1][i] < D[j][i]時,我們就在序列-δ和序列-(δ+2)之間人為插入一個長度為0的序列-(δ+1)。如下圖所示:

所以,我們按照這個定義,就可以對編輯矩陣的每列進行一個劃分,劃分的每一段都是一串連續數字。

說了這么多,這個定義有什么用呢?假若,我們每次都能根據前一列的列劃分情況直接推導出后一列的列劃分情況,那么就可以省去好多計算,畢竟每一個劃分中的每一段的數字都是連續的,這就暗示我們可以直接用一個常數時間的加法直接得到某一個編輯矩陣的元素值,而不用使用最小編輯距離的動態規劃算法去計算。

接下來的重點來了,我們介紹這個推導公式,請打起十二分精神!我們按照序列-δ長度是否為0來介紹這個推論。由于其中一個推論文字描述太繁瑣,不容易理解,所以我畫了個圖:

接下來燒腦開始。

推論1:如果列i上長度為0的 序列-δ 的結束位置為j,則列i+1上的 序列-δ 的結束位置為 j+1。

證明:由推論前提我們知道 δ = j – D[j][i] + 1 (想想前面說的δ值不連續,我們就人為插入一個中間值,只不過長度為0)。我們觀察編輯矩陣就會發現如下兩個事實:

事實1:D[j+1][i+1] = D[j][i] ( 別問為什么, 自己觀察, 看看是不是都這樣, 其實可以用反證法,我們就不證明了)。

事實2:D[j+2][i+1] <= D[j][i]。

通過事實1,我們知道D[j+1][i+1]確實屬于 序列-δ,因為 j + 1 – D[j+1][i+1] = j + 1 – D[j][i] = δ。

通過事實2,我們知道列i+1上的序列δ,終止位置為j+1。

所以推論1證明結束。

推論2: 文字描述略,請看圖

證明:

設這個序列長度為L,除了每列的第一個序列外,其余序列的其余位置均是當前的編輯距離小于等于該列上一個位置的編輯距離:即D[j-L+1][i]<=D[j-L][i],所以,我們可以推出:D[j-L+1][i] <= D[j-L][i];

再根據編輯矩陣對角線非遞減我們知道,D[j-L+1][i+1] >= D[j-L][i];

綜上兩點我們得到如下大小關系:D[j-L+1][i+1] >= D[j-L+1][i]。

此外我們知道我們當前列的序列-δ截止位置為j,也意味著D[j+1][i] <= D[j][i],同樣根據對角線法則,我們得出D[j+2][i+1] <= D[j+1][i] + 1 <= D[j][i] + 1。

接下來到了最精彩的一步,我們知道列i當前序列-δ內的值是連續的,如果起始編輯距離為A,那么終止編輯距離為A+L-1。

而由我們的推導可以發現:D[j-L+1][i+1] >= A,D[j+2][i+1] <= (A+L-1) + 1 = A+L,而之間跨越的長度為 (j+2)-(j-L+1)+1= L+2。 我們可以推出列i+1上從行j-L+1到行j+2之間的序列一定不連續,否則D[j+2][i+1] >= A+L+2-1= A+L+1,與我們先前的推導矛盾。所以,在j-L+1和j+2之間一定有一個列終止,這樣才能消去一個序號。

此外我們還有一個疑問,列i+1上的序列-δ結束位置一定在j-L+1和j+1之間么?我們要證明這個事。

證明:

因為δ=j-D[j][i]=j-L+1-D[j-L+1][i]>=j-L+1-D[j-L+1][i+1],即列i+1上的 序列-δ的結束位置一定在j-L+1或者之后;

由于j+1-D[j+1][i]>δ,根據對角線法則D[j+2][i+1] <= D[j+1][i]+1,有j+2-D[j+2][i+1]>=j+2-(D[j+1][i]+1)=j+1-D[j+1][i] > δ, 固列i+1上的序列-δ的終止位置一定在j+2之前,即j-L+1到j+1之間。

后面推論2的分情況討論,我一個也沒證明出來,作者在論文中輕飄飄的一句話“后面很好證明,他就不去證明了”,但是卻消耗了我所有腦細胞。所以,如果哪位小伙伴把推論2剩下的內容證明出來了,歡迎給我留言,我也學習學習。

這個算法的時間復雜度是多少呢?作者用啟發式的方法證明了算法的復雜度約為$ O(mn/sqrt[2]{b}) $,其中b是字符集大小。

代碼實現

接下來說一下代碼實現,給出我總結出來的步驟,否則很容易踩坑。

編輯矩陣第一列,肯定只有一個序列。

每次遍歷前一列的所有序列,根據推論1和推論2計算后一列的劃分情況。

如果前一列遍歷完畢,但是下一列還有剩余的元素沒有劃分。沒關系,下一列剩下的元素都歸為一個新的序列。

預處理一個表,表中記錄T中的每個字符在P中的位置。可以直接用哈希算法(最好直接ascii碼)進行定位,如果位置不唯一,可以拉鏈。進行列劃分計算時,從前往后遍歷那一鏈上的位置,直到找到第一個符合條件的,速度出奇的快。盡可能少使用或者不要使用map進行定位,測試發現相當慢。

接下來做最不愿意做的事:貼一個代碼,很丑。

inlineintloc(intfind[][200],int*len,intch,intpos){for(inti=0;i=pos)returnfind[ch][i];}return-1;}intnew_column_partition(char*p,char*t){intlen_p=strlen(p);intlen_t=strlen(t);intfind[26][200];intlen[26]={0};intpart[200];//記錄每一個序列的結束位置//生成loc表,用來快速查詢for(inti=0;i=1if(len[t[i]-'a']>0&&(tmp=loc(find,len,t[i]-'a',b))!=-1&&tmp<=?e)?{??????part[next_cn++]?=?tmp?-?1;????}?else?if(pre_cn?>=2&&part[1]-part[0]!=0){part[next_cn++]=part[0]+1;}else{part[next_cn++]=part[0];}//每列第一個partition尾值tmp_value=part[0];//遍歷前一列剩下的partitionfor(intj=1;j0&&(tmp=loc(find,len,t[i]-'a',b))!=-1&&tmp<=?e)?{??????????part[next_cn++]?=?tmp?-?1;????????}?else?if(j?+?1?

結語

這個算法應用到線上之后,效果非常明顯,如下對比。

優化前CPU

優化后CPU:

能力有限,證明不充分,有興趣的小伙伴可以直接去看原版論文,歡迎交流,共同進步。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4684

    瀏覽量

    94391
  • 數值
    +關注

    關注

    0

    文章

    80

    瀏覽量

    14515

原文標題:死磕一周算法,我讓服務性能提高 50%

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    福音:日本電池新技術師電池能量密度提高一倍

    宣布,已經開發出新的鋰電池技術,在電池尺寸不變的情況下,新技術能讓電量增加一倍。據報道,日立采用種新開發的、基于硅的材料構成電池的負極,它可以將電池能量密度提高一倍。在2016年1月13日至15日
    發表于 01-05 15:35

    種新的基于晶體管級的電路劃分算法

    隨著VLSI 電路規模的不斷增加,為實現電路并行仿真所做的電路劃分算法的質量顯得日益重要。鑒于現有算法未能同時保證均衡的分塊間規模和最少的互聯信號數目,該文出了種新
    發表于 02-10 12:05 ?19次下載

    日立將錳類正極材料的產業用鋰離子電池壽命提高一倍

    日立將錳類正極材料的產業用鋰離子電池壽命提高一倍     日立制作所開發出了將正極采用錳(Mn)類材料的產業用鋰(Li)離子
    發表于 04-09 10:57 ?554次閱讀

    基于主題與連接的局部社區劃分算法_蔡國永

    基于主題與連接的局部社區劃分算法_蔡國永
    發表于 01-08 10:47 ?9次下載

    基于PSO的粗顆粒度可重構處理器時域劃分算法設計劉勰

    基于PSO的粗顆粒度可重構處理器時域劃分算法設計_劉勰
    發表于 03-17 08:00 ?0次下載

    基于局部模塊度的社團劃分算法

    針對大多復雜網絡社團劃分算法不能快速發現最優節點加入社團的問題,提出種利用節點親密度的局部社團劃分算法。引入節點親密度的概念量化社團與鄰居節點的關系,按照節點親密度由大到小選擇節點加入社團,最后以
    發表于 12-19 19:02 ?0次下載

    ARM Cortex-R8使SoC的性能提高一倍

    總部位于劍橋的IP公司推出的ARM Cortex-R8處理器有望幫助芯片設計人員將基于ARM的調制解調器和大容量存儲設備SoC的性能提高一倍
    的頭像 發表于 08-07 15:48 ?4043次閱讀

    特許半導體的目標是在兩年內將其代工能力提高一倍

    新加坡 - 特許半導體制造私人有限公司。去年大部分時間都在努力消除損失,同時準備在三家新晶圓廠開始生產。現在它再次盈利,這家全球第三大硅晶圓代工公司正在開始另輪激進的擴張,以在兩年內將其晶圓加工能力提高一倍
    的頭像 發表于 08-13 08:38 ?3267次閱讀

    AirPods Pro耳機火爆 蘋果要求制造商產量提高一倍

    據《日經新聞》消息稱,蘋果已要求制造商立訊精密Luxshare ICT將其中國工廠生產的AirPods Pro耳機產量提高一倍,達到每月200萬副,以滿足巨大的市場需求。
    發表于 11-28 14:33 ?905次閱讀

    LG化學計劃將中國的產量提高一倍以上

    據報道,消息人士稱,LG化學計劃明年將其為中國產特斯拉電動汽車生產的電池產能提高一倍以上,以滿足增長的需求。
    的頭像 發表于 12-02 09:50 ?1682次閱讀

    LG化學或將中國電池產能提高一倍以上

    12月1日,據路透社報道,為滿足特斯拉中國業務增長的需求,韓國動力電池企業LG化學計劃2021年將中國的電池產能提高一倍以上。知情人士稱,LG化學還計劃將中國、韓國增產的電池運往特斯拉德國和美國工廠。
    的頭像 發表于 12-06 09:20 ?1837次閱讀

    長江存儲或將2021年存儲芯片產量提高一倍

    據媒體報道,長江存儲計劃今年把產量提高一倍,計劃到下半年將每月的存儲芯片產量提高到10萬片晶圓,并準備試產192層NAND快閃記憶體晶片,最快將于2021年中試產,不過該試產計劃可能會推遲至2021下半年。
    的頭像 發表于 01-12 14:47 ?5482次閱讀

    基于狄利克雷問題的動態劃分算法

    傳統靜態的路網控制子區劃分算法難以適應復雜路網中交通流動態變化的特性。為此,基于狄利克雷問題提岀種動態劃分算法。根據密度峰值理論重新定義局部密度概念,用以識別控制子區的穩定塊。在此基礎上,將狄利克
    發表于 03-16 10:34 ?18次下載
    基于狄利克雷問題的動態<b class='flag-5'>劃分算法</b>

    基于節點多屬性相似性聚類的社團劃分算法SM-CD

    針對當前社團劃分算法存在劃分方式單劃分結果準確度低等問題,提出種基于節點多屬性相似性聚類的社團劃分
    發表于 03-30 09:47 ?7次下載
    基于節點多屬性相似性聚類的社團<b class='flag-5'>劃分算法</b>SM-CD

    基于雙曲網絡空間嵌入與極小值聚類的社區劃分算法

    真實復雜網絡節點度分布服從冪律分布,而雙曲空間能夠完整表現這特性。為此,提出種基于雙曲空間嵌入與極小值聚類的社區劃分算法MHE。將建模后的復雜網絡嵌入龐加萊圓盤模型,保留復雜網絡的全局拓撲信息
    發表于 04-01 15:18 ?11次下載
    基于雙曲網絡空間嵌入與極小值聚類的社區<b class='flag-5'>劃分算法</b>
    主站蜘蛛池模板: 天天综合色天天综合色sb | 理论片免费午夜 | 在线看你懂得 | 天天添天天射 | 欧洲妇女成人淫片aaa视频 | 中文字幕不卡免费高清视频 | 欧美国产精品主播一区 | 亚洲 欧美 自拍 另类 欧美 | 久久国产香蕉视频 | 五月天丁香婷婷网 | 亚洲码欧美码一区二区三区 | 男人呻吟双腿大开男男h互攻 | 亚洲爽爽网 | 11111日本网站 | 国产精品不卡片视频免费观看 | 女人69xxx| 三级三级三级网站网址 | 色一区二区 | 麻豆色哟哟网站 | 色天天色综合 | 国产欧美日韩视频免费61794 | 国内视频一区 | 奇米影视777欧美在线观看 | 美女把尿口扒开让男人桶出水 | 日本免费人成黄页网观看视频 | 一卡二卡三卡四卡无卡在线 | 天天爽夜夜爽人人爽曰喷水 | 99久久精品国产免费 | 天天天狠天天透天天制色 | 四虎国产精品永免费 | 五月婷婷在线视频观看 | 国产一卡二卡3卡4卡四卡在线 | 午夜精品视频在线观看 | 四虎影院视频 | 成年人一级片 | 爱情社保片鲁丝片一区 | 久久伊人草 | 免费看男女下面日出水视频 | 日本三黄色大 | 免费看黄色片的软件 | 国内真实实拍伦视频在线观看 |