一種基于位圖的基因序列片段快速定位方法
【技術領域】
[0001] 本發(fā)明涉及基因測序技術,具體涉及一種基于位圖的基因序列片段快速定位方 法。
【背景技術】
[0002] 基因片段定位技術是當前高通量基因測序的基礎。通過對高通量測序,可以產(chǎn)生 大量基因序列片段,實際實驗發(fā)現(xiàn),其中大部分基因序列片段在較長參考基因序列中能夠 找到精確的完全匹配。參考基因序列可以看作是由A、C、G、T4個字母組成的一個連續(xù)的字 符串,其長度通常能夠遠超過1〇9個字符,從這樣長的參考基因序列中的每一個字符開始, 截取η個字符作為Key-Value數(shù)據(jù)庫中的Key,其所在參考鏈上的位置及其它附帶信息作為 Value,可以組織成一個龐大的Key-Value數(shù)據(jù)庫。
[0003] 通常來說,Key-Value存儲與查詢采用哈希并分桶的方式是效率較高的。但在一 個109個字符以上的Key-Value對中進行存儲與查詢,其操作的計算量仍舊非常巨大,尤其 若查詢的Key根本不在Key-Value數(shù)據(jù)庫中時,Key-Value數(shù)據(jù)庫為此需要查詢遍歷對應 桶內(nèi)的所有元素,其操作完成時間被最大化,導致大量計算與查詢浪費。若能在查詢前,通 過簡單計算,快速地判定一個待查詢Key-定不在數(shù)據(jù)庫中,并能給出對應桶內(nèi)的較為精 確地數(shù)據(jù)位置,則可以大大降低不必要的桶內(nèi)遍歷查詢操作。
[0004] BloomFilter(布隆過濾器)技術則用于通過簡單計算,快速地判定一個待查詢 Key-定不在數(shù)據(jù)庫中。BloomFilter技術是一種空間效率很高的隨機數(shù)據(jù)結(jié)構(gòu),它利用 位數(shù)組很簡潔地表示一個集合,并能判斷一個元素是否屬于這個集合。BloomFilter通過 極少的錯誤換取了存儲空間的極大節(jié)省。BloomFilter使用k個相互獨立的哈希函數(shù)(哈 希Function),它們分別將集合中的每個元素映射到{1,的范圍中。對任意一個元素 X,第i個哈希函數(shù)映射的位置h(X)就會被置為1 (1 <i<k)。在判斷y是否屬于這個集 合時,我們對y應用k次哈希函數(shù),如果所有(y)的位置都是1 (1 <i<k),那么我們就 認為y是集合中的元素,否則就認為y不是集合中的元素。綜上可知,BloomFilter的設 計的目的主要是面向絕大部分查詢數(shù)據(jù)都不命中數(shù)據(jù)庫中數(shù)據(jù)的情形,其缺點是:它經(jīng)過 k個復雜哈希函數(shù)的運算,只能給出一個簡單的"可能在"或者"一定不在"的結(jié)果,實際查 詢過程中,若絕大多數(shù)數(shù)據(jù)可以命中集合,那么BloomFilter的計算可能反而成為負擔。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明要解決的技術問題:針對現(xiàn)有技術的上述問題,提供一種既能夠快速濾除 不命中的查詢數(shù)據(jù),又能夠給出哈希桶內(nèi)較為精確地數(shù)據(jù)位置、大大加速哈希分桶方式組 織數(shù)據(jù)查詢過程,空間效率高、定位速度快、定位精確的基于位圖的基因序列片段快速定位 方法。
[0006] 為了解決上述技術問題,本發(fā)明采用的技術方案為:
[0007] -種基于位圖的基因序列片段快速定位方法,步驟包括:
[0008] 1)構(gòu)造用于存儲基因序列片段信息的位圖,位圖的每一個數(shù)據(jù)位被初始化為0;
[0009] 2)將基因參考鏈中各基因序列片段按位循環(huán)偏移生成多個基因序列片段向量,將 基因序列片段向量采用哈希函數(shù)映射到位圖中的唯一數(shù)據(jù)位并將數(shù)據(jù)位由〇置1,統(tǒng)計數(shù) 據(jù)位所在行R從第0列開始到數(shù)據(jù)位所在列之間所有數(shù)據(jù)位的出現(xiàn)1的次數(shù)t,將基因序列 片段向量及其附帶信息構(gòu)成的鍵值對<Keyt,Valuet>存放在數(shù)據(jù)庫中以該數(shù)據(jù)位的行號R 對應的哈希桶的第t個位置;如果某個基因序列片段的多個基因序列片段向量的所有數(shù)據(jù) 位全已被置1,則將該基因序列片段加入沖突集合ConflictSet中;
[0010] 3)將需要進行基因序列片段定位時,將待定位基因序列片段按位循環(huán)偏移生 成多個基因序列片段向量,將基因序列片段向量采用哈希函數(shù)映射到位圖中的唯一數(shù)據(jù) 位,如果數(shù)據(jù)位為1則統(tǒng)計數(shù)據(jù)位所在行R從第0列開始到數(shù)據(jù)位所在列之間所有數(shù)據(jù) 位的出現(xiàn)1的次數(shù)t,從數(shù)據(jù)庫中取出行號R對應的哈希桶的第t個位置存放的鍵值對 <Keyt,Valuet>,如果鍵值對<Keyt,Valuet>的鍵Keyt和待定位基因序列片段相同,如果相同 則返回鍵值對<Keyt,Valuet>的值Valuet,如果所有基因序列片段向量的數(shù)據(jù)位為0,則在 沖突集合ConflictSet中查找當前基因序列片段的鍵值對<Keyt,Valuet>,如果查找成功則 返回鍵值對<Keyt,Valuet>的值Valuet,否則判定當前基因序列片段一定不在基因參考鏈 中。
[0011] 優(yōu)選地,所述步驟2)的詳細步驟包括:
[0012] 2. 1)從基因參考鏈中取出一個基因序列片段作為當前基因序列片段;
[0013] 2. 2)將當前基因序列片段按位循環(huán)偏移生成多個基因序列片段向量,取出一個基 因序列片段向量作為當前基因序列片段向量;
[0014] 2. 3)通過哈希函數(shù)映射將當前基因序列片段向量的第一區(qū)間內(nèi)的數(shù)據(jù)映射至位 圖行范圍內(nèi)的整數(shù)空間,將哈希函數(shù)映射的結(jié)果為當前基因序列片段向量的行號;根據(jù)當 前基因序列片段向量的第二區(qū)間內(nèi)的數(shù)據(jù)計算當前基因序列片段向量的列號;
[0015] 2.4)讀取當前基因序列片段向量的行號、列號在位圖中對應的數(shù)據(jù)位,如果該數(shù) 據(jù)位的值為〇則將數(shù)據(jù)位置1 ;否則,判定當前基因序列片段向量無法索引到〇 ;
[0016] 2. 5)判斷當前基因序列片段的所有基因序列片段向量是否已經(jīng)處理完畢,如果尚 未處理完畢,則選擇下一個基因序列片段向量作為當前基因序列片段向量,跳轉(zhuǎn)執(zhí)行步驟 2.3);如果已經(jīng)處理完畢,則判斷當前基因序列片段的所有當前基因序列片段向量是否均 無法索引到〇,如果是均無法索引到〇,則將當前基因序列片段的鍵值對<Keyt,Valuet>加入 沖突集合ConflictSet中;
[0017] 2.6)判斷基因參考鏈是否已經(jīng)處理完畢,如果尚未處理完畢,則跳轉(zhuǎn)執(zhí)行步驟 2. 1);否則,掃描位圖,針對位圖中每一個被置1的數(shù)據(jù)位,統(tǒng)計位圖中數(shù)據(jù)位所在行R從第 〇列開始到數(shù)據(jù)位所在列之間所有數(shù)據(jù)位的出現(xiàn)1的次數(shù)t,將該數(shù)據(jù)位唯一對應的基因序 列片段向量及其附帶信息構(gòu)成的鍵值對<Keyt,Valuet>存放在數(shù)據(jù)庫中以該數(shù)據(jù)位的行號 R對應的哈希桶的第t個位置,在位圖全部掃描完畢后,位圖與鍵值對數(shù)據(jù)庫構(gòu)建完畢。
[0018] 優(yōu)選地,所述步驟3)的詳細步驟包括:
[0019] 3. 1)將需要進行基因序列片段定位時,將待定位基因序列片段按位循環(huán)偏移生成 多個基因序列片段向量;
[0020] 3. 2)取出一個基因序列片段向量作為當前基因序列片段向量;
[0021] 3. 3)通過哈希函數(shù)映射將當前基因序列片段向量的第一區(qū)間內(nèi)的數(shù)據(jù)映射至位 圖行范圍的整數(shù)空間,將哈希函數(shù)映射的結(jié)果為當前基因序列片段向量的行號;根據(jù)當前 基因序列片段向量的第二區(qū)間內(nèi)的數(shù)據(jù)計算當前基因序列片段向量的列號;
[0022] 3.4)讀取當前基因序列片段向量的行號、列號在位圖中對應的數(shù)據(jù)位,如果該數(shù) 據(jù)位的值為〇,則判斷定位失??;如果該數(shù)據(jù)位的值為1,則統(tǒng)計位圖中數(shù)據(jù)位所在行R從第 〇列開始到數(shù)據(jù)位所在列之間所有數(shù)據(jù)位的出現(xiàn)1的次數(shù)t,在數(shù)據(jù)庫中以該數(shù)據(jù)位的行號 R對應的哈希桶的第t個位置讀出鍵值對<Keyt,Valuet>,判斷鍵值對<Keyt,Valuet>的鍵 Keyt和待定位基因序列片段相同,如果相同則返回鍵值對〈Keyt,Valuet>的值Valuet,如果 和待定位基因序列片段不同,則跳轉(zhuǎn)執(zhí)行下一步;
[0023] 3. 5)判斷是否所有基因序列片段向量