基于fmd索引和快表的跨越式種子查找算法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及生物序列數(shù)據(jù)庫(kù)搜索的技術(shù)領(lǐng)域,特別涉及一種基于FMD索引和快表的跨越式種子查找算法。
【背景技術(shù)】
[0002]要搜索在生物序列數(shù)據(jù)庫(kù)和查詢序列之間長(zhǎng)度至少為w的完全匹配的種子,現(xiàn)有的解決方案可以歸為三類。
[0003]第一類算法對(duì)查詢序列構(gòu)建一個(gè)快表。該快表是一個(gè)Hash表,每個(gè)表項(xiàng)是一個(gè)線性鏈表,記錄了一個(gè)長(zhǎng)度為k的序列在查詢序列中出現(xiàn)的所有位置。這類算法接著對(duì)數(shù)據(jù)庫(kù)序列進(jìn)行跨越式的掃描??缭绞降膾呙柚傅氖敲扛魒-k+Ι個(gè)位置就檢測(cè)一次長(zhǎng)度為k的子序列。檢測(cè)過程包括通過快表找出這個(gè)子序列在查詢序列中出現(xiàn)的位置,每個(gè)位置對(duì)應(yīng)一個(gè)長(zhǎng)度為k的種子,然后比較每個(gè)k種子的左右兩邊的區(qū)域,檢查這個(gè)k種子是否包含在一個(gè)w種子種。這種種子查找算法被應(yīng)用于MegaBLAST中。
[0004]第二類算法對(duì)數(shù)據(jù)庫(kù)構(gòu)建快表,這類快表也是一個(gè)Hash表,每個(gè)表項(xiàng)對(duì)應(yīng)一個(gè)長(zhǎng)度為k的短序列,典型的解決方案有兩種。第一種解決方案以Indexed MegaBLAST為代表,對(duì)數(shù)據(jù)庫(kù)每隔w-k+Ι個(gè)位置取出一個(gè)長(zhǎng)度為k的子序列,將其位置加入相應(yīng)的Hash表項(xiàng)中。算法然后檢測(cè)查詢序列中所有長(zhǎng)度為k的子序列,找到k種子,然后通過方案一的做法,檢查這些k種子是否包含在w種子中。第二種解決方案以BLAT為代表,取出數(shù)據(jù)庫(kù)序列中所有互不重疊的長(zhǎng)度為w的子序列,將其位置記錄在相應(yīng)的Hash表項(xiàng)中,然后檢查查詢序列的所有長(zhǎng)度為w的子序列,在Hash表中找出其位置鏈表,鏈表中的每個(gè)位置對(duì)應(yīng)一個(gè)w種子。
[0005]第三類解決方案對(duì)數(shù)據(jù)庫(kù)建立FM索引或FMD索引,利用該索引查找長(zhǎng)度至少為w的最大匹配區(qū)域。最大匹配區(qū)域指的是不能繼續(xù)向左右兩邊延伸的一段完全匹配區(qū)域。序列比對(duì)軟件Cushaw2用FM索引,從查詢序列的第一個(gè)字符開始,每一步從右邊添加一個(gè)字符,直到搜索結(jié)果為空集為止。算法接著從上一步停止的地方開始,繼續(xù)上述過程。序列比對(duì)軟件BWA-MEM利用FMD查找超級(jí)最大匹配,超級(jí)最大匹配也是最大匹配,但是它們?cè)诓樵冃蛄猩系膮^(qū)段不能被其他最大匹配在查詢序列上的區(qū)段覆蓋。
[0006]上述第一種方案屬于最初被提出的方案,也是這三類解決方案中效率最低的種子查找方案。第二種方案中,Indexed MegaBLAST在小型數(shù)據(jù)庫(kù)和短查詢序列上可以運(yùn)行得很快,然而在大型數(shù)據(jù)庫(kù)和長(zhǎng)查詢序列上,快表將會(huì)變得非常龐大,而且性能會(huì)急劇下降,以至于比MegaBLAST還要低效。BLAT不是精確的算法,它無法保證找出所有w種子。第三類解決方案雖然性能好,然而它們同樣不能保證能夠找出所有長(zhǎng)度至少為w的種子,從而導(dǎo)致最終搜索精度的下降。
【發(fā)明內(nèi)容】
[0007]本發(fā)明的主要目的在于克服現(xiàn)有技術(shù)的缺點(diǎn)與不足,提供一種基于FMD索引和快表的跨越式種子查找算法。
[0008]為了達(dá)到上述目的,本發(fā)明采用以下技術(shù)方案:
[0009]基于FMD索引和快表的跨越式種子查找算法,包括下述步驟:
[0010]S0、構(gòu)建數(shù)據(jù)庫(kù)FMD索引的快表,這個(gè)快表是一個(gè)Hash表,每一個(gè)表項(xiàng)對(duì)應(yīng)一個(gè)長(zhǎng)度為k的短序列,保存的是在FMD索引中搜索這個(gè)短序列所得到的雙區(qū)間;
[0011]S1、計(jì)算查詢序列中k子序列的Hash值,并從快表中取出其相應(yīng)的長(zhǎng)度為k的種子(簡(jiǎn)稱K種子)的雙區(qū)間;
[0012]S2、這個(gè)步驟通過向后搜索算法,逐步擴(kuò)大k種子左邊的匹配區(qū)域;
[0013]S3、對(duì)步驟S2中縮小前的區(qū)間執(zhí)行向前搜索算法,以找出k種子右邊的匹配區(qū)域;
[0014]S4、檢查當(dāng)前檢測(cè)位置是否位于查詢序列的尾部,如果是,則算法終止,否則,執(zhí)行步驟S5 ;
[0015]S5、將當(dāng)前檢測(cè)位置向前跳躍w-k+Ι個(gè)位置,重復(fù)執(zhí)行步驟S2-S5,其中w是要查找的種子的長(zhǎng)度。
[0016]優(yōu)選的,F(xiàn)MD索引具體為:
[0017]核酸序列的一個(gè)長(zhǎng)度為k的子序列稱為k子序列,查詢序列與數(shù)據(jù)庫(kù)序列之間的一段長(zhǎng)度為w的完全匹配區(qū)段稱為w種子,在數(shù)據(jù)庫(kù)的FMD索引中搜索序列P,其搜索結(jié)果以雙區(qū)間的形式表示,而雙區(qū)間則由三個(gè)整數(shù)表示,給定核酸序列P的雙區(qū)間和字符a,a為A、C、G、T中的其中一個(gè),由向后搜索算法,可以得到aP的雙區(qū)間;由向前搜索算法,可以得到Pa的雙區(qū)間,雙區(qū)間中元素的個(gè)數(shù)稱為該區(qū)間的大小,它表示P在數(shù)據(jù)庫(kù)中出現(xiàn)的次數(shù),如果P的雙區(qū)間為空區(qū)間,則表示P沒有在數(shù)據(jù)庫(kù)中出現(xiàn)。
[0018]優(yōu)選的,所述快表的大小是固定的,每個(gè)字符只能是A、C、G、T中的一個(gè),故該快表一個(gè)有4 ~k個(gè)表項(xiàng)。
[0019]優(yōu)選的,所述步驟S2中,在向后搜索過程中,如果出現(xiàn)雙區(qū)間縮小或者雙區(qū)間為空的情況,就表明某些k種子向左擴(kuò)展時(shí)遇到了不匹配的字符對(duì),對(duì)縮小前的區(qū)間,算法還需要通過向前搜索算法找出其對(duì)應(yīng)的種子右邊的匹配部分,試圖找出長(zhǎng)度為w的種子。
[0020]優(yōu)選的,所述步驟S3中,在向前搜索過程中,如果出現(xiàn)搜索區(qū)間為空的情況,就說明查詢序列中的這段區(qū)域在數(shù)據(jù)庫(kù)中不存在;否則的話,將得到查詢序列中w子序列的雙區(qū)間,算法將其作為結(jié)果輸出。
[0021]優(yōu)選的,所述步驟S5中,并不需要檢測(cè)查詢序列中所有的k子序列,相反,它只需每隔w-k+Ι個(gè)位置檢測(cè)一次即可。
[0022]本發(fā)明與現(xiàn)有技術(shù)相比,具有如下優(yōu)點(diǎn)和有益效果:
[0023]1、本發(fā)明提出的快表與現(xiàn)有的基于線性鏈表的快表的區(qū)別之處在于,基于線性鏈表的快表的大小會(huì)隨著數(shù)據(jù)庫(kù)的增長(zhǎng)而增加,在大型數(shù)據(jù)庫(kù)中,這種快表將占用非常大的存儲(chǔ)空間,長(zhǎng)的線性鏈表也會(huì)使得種子查找過程非常耗時(shí)。與基于FM索引構(gòu)建的快表相比,本發(fā)明提出的快表保存的是短序列的雙區(qū)間,而基于FM索引構(gòu)建的快表保存的則是后綴數(shù)組區(qū)間。
[0024]2、本發(fā)明提出的種子查找算法與現(xiàn)有的算法相比,具有精度高、效率快的優(yōu)勢(shì)。傳統(tǒng)的種子查找算法有的無法找出所有的w種子,無法保證搜索精度。有的雖然也采用了跨越式的掃描方式,但在大型數(shù)據(jù)庫(kù)和長(zhǎng)的查詢序列下性能低下,它們只能逐個(gè)檢查k種子是否包含在W種子中。
[0025]3、本發(fā)明提出的種子查找算法同樣采用跨越式的掃描方式,但是它能夠一次檢查一批k種子是否包含在w種子中,這使得它具很好的性能優(yōu)勢(shì)。
【附圖說明】
[0026]圖1是本發(fā)明基于FMD索引和快表的跨越式種子查找算法的流程圖。
【具體實(shí)施方式】
[0027]下面結(jié)合實(shí)施例及附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)的描述,但本發(fā)明的實(shí)施方式不限于此。
[0028]實(shí)施例
[0029]本實(shí)施例主要包括兩個(gè)部分:基于FMD索引的快表和種子查找算法。構(gòu)建快表針對(duì)的是上述【背景技術(shù)】中第二類算法所采用的快表的缺點(diǎn)。在這類算法中,快表的每個(gè)表項(xiàng)都是一個(gè)線性鏈表,這使得快表在大型數(shù)據(jù)庫(kù)中將會(huì)占用非常巨大的存儲(chǔ)空間。一些算法例如BLAT等,為了減少快表的大小從而采用索引部分短序列的方式,這會(huì)犧牲搜索精度。本發(fā)明的快表每個(gè)表項(xiàng)均保存一個(gè)雙區(qū)間,每個(gè)雙區(qū)間只需由三個(gè)數(shù)字表示,因此快表的大小是固定的,不會(huì)隨著數(shù)據(jù)庫(kù)的增長(zhǎng)而發(fā)生變化。
[0030]種子查找算法針對(duì)的是上述第二、第三類算法中的缺點(diǎn)。這類算法中,IndexedMegaBLAST能夠找出所有的w種子,但其在大型數(shù)據(jù)庫(kù)下的效率不高,因?yàn)檫@時(shí)候線性鏈表會(huì)非常長(zhǎng),從而需要頻繁地檢查k種子是否包含在w種子種。其他算法為了提高效率從而采用了犧牲精度的方式,它們只能夠找出部分的w種子。本發(fā)明的種子查找算法采用了第一類算法中的跨越式掃描方式,能夠檢查一批k種子是否包含在w種