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