DNA序列的k-merindex问题-基于Hash算法快速检索

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

2015山东科技大学数学建模竞赛承诺书我们仔细阅读了山东科技大学数学建模竞赛的竞赛规则.我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、网上咨询等)与队外的任何人研究、讨论与赛题有关的问题。我们知道,抄袭别人的成果是违反竞赛规则的,如果引用别人的成果或其他公开的资料(包括网上查到的资料),必须按照规定的参考文献的表述方式在正文引用处和参考文献中明确列出。我们郑重承诺,严格遵守竞赛规则,以保证竞赛的公正、公平性。如有违反竞赛规则的行为,我们将受到严肃处理。我们参赛选择的题号是(从A/B/C中选择一项填写):我们的参赛序号为:所属学院(请填写完整的全名):参赛队员(打印并签名):1.2.3.日期:年月日基于Hash表在大量DNA序列中快速索引查找k-mer的算法摘要:为了解决在大量DNA数据中快速查找到k-mer所在位置,我们基于Hash算法思想建立适合此题的快速索引方法(桶式定址法),利用四进制转十进制的方式()取得关键码值建立哈希表进行索引查询,8G内存限制下在codeblocks集成开发环境中,借助C语言进行编写使k支持1~14。针对问题将依次进行下列叙述:对建立索引的算法进行叙述和冲突分析;对建立索引算法的计算复杂度和空间复杂度进行分析;对索引查询进行叙述及性能分析;分析整套算法程序在不同k值下内存占用及极限分析。总结分析整套索引算法性能,对算法进行缺陷分析及改进方案。关键词:索引算法、Hash表、k-mer快速索引、数据结构一、问题重述1.1背景给定一个DNA序列,这个系列只含有4个字母ATCG,如S=“CTGTACTGTAT”。给定一个整数值k,从S的第一个位置开始,取一连续k个字母的短串,称之为k-mer(如k=5,则此短串为CTGTA),然后从S的第二个位置,取另一k-mer(如k=5,则此短串为TGTAC),这样直至S的末端,就得一个集合,包含全部k-mer。如对序列S来说,所有5-mer为{CTGTA,TGTAC,GTACT,TACTG,ACTGT,TGTAT}通常这些k-mer需一种数据索引方法,可被后面的操作快速访问。例如,对5-mer来说,当查询CTGTA,通过这种数据索引方法,可返回其在DNA序列S中的位置为{1,6}。1.2问题现在以文件形式给定100万个DNA序列,序列编号为1-1000000,每个基因序列长度为100。(1)要求对给定k,给出并实现一种数据索引方法,可返回任意一个k-mer所在的DNA序列编号和相应序列中出现的位置。每次建立索引,只需支持一个k值即可,不需要支持全部k值。(2)要求索引一旦建立,查询速度尽量快,所用内存尽量小。(3)给出建立索引所用的计算复杂度,和空间复杂度分析。(4)给出使用索引查询的计算复杂度,和空间复杂度分析。(5)假设内存限制为8G,分析所设计索引方法所能支持的最大k值和相应数据查询效率。(6)按重要性由高到低排列,将依据以下几点,来评价索引方法性能索引查询速度索引内存使用8G内存下,所能支持的k值范围建立索引时间二、问题分析在生物技术快速发展的今天,人类分析人类自身编码的需求也越来越高,人们利用计算机来处理分析大量DNA序列,k-mer快速查找也是处理大量数据的问题,所以必须依赖数据结构原理,建立模型构造算法,从而利用有限的资源解决复杂问题。针对问题一:按照给定k值,将所有数据按题目要求分组,求出每组数据的关键码值,并将关键码值与此组k-mer所在位置建立对应关系并存储到表中,从而建立哈希表。针对问题二:将要查找的k-mer序列求出其关键码值,直接输出其关键码值在表中对应位置信息,大大加快了索引查询速度。针对问题三:详见四-(二)-2,3。针对问题四:详见四-(三)-2,3。针对问题五:根据k值大小动态分配内存建立哈希表,最终实现k支持1~14的范围,因为直接关键码值寻址输出,所以索引查询速度非常快。针对问题六:按照重要性首先考虑索引查询速度,其次动态内存分配尽量减少索引对内存的消耗,在8G内存限制下,使k值支持1~14,最后优化添加计数器记录已经存在地址的k-mer个数,倘若达到所有k-mer种类数,则停止建立索引,索引成功建立。三、符号说明符号符号说明H(x)关键码值生成函数,其中x代表一个k-mer代表A,T,C,G中的任意一个与相对应的四进制数k一个k-mer的长度M内存空间占用(单位:GB)四、算法设计思路及性能分析(代码见附录一)(一)哈希表设计:1、k-mer关键码值生成函数H(x)由于DNA序列由4个字母排列而成,所以每个k-mer都是一个四进制数,H(x)函数根据这个特征将四进制数转为十进制数作为哈希表关键码值。x=“CTGTA”如上图为每个字母代表的四进制数字,例如一个5-mer“CTGTA”可以表示为四进制数21310,其十进制表示为628,628即为5-mer“CTGTA”在哈希表中的关键码值。关键码值计算的一般公式为:(1)2、哈希表结构将k-mer通过公式(1)转换为十进制的关键码值存入哈希表中的关键码值一列,并将关键码值与此k-mer所在位置建立对应关系,从而便于索引寻址。这里采用的方法是:桶定址法。桶:一片足够大的存储空间。桶定址:为表中的每个地址关联一个桶。如果桶已经满了,可以使用开放定址法来处理。如图。3、冲突处理方法开放地址法有一个公式:Hi=(H(key)+di)MODmi=1,2,...,k(k=m-1)其中,m为哈希表的表长。di是产生冲突的时候的增量序列。如果di值可能为1,2,3,...m-1,称线性探测再散列。如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,4,-4,9,-9,16,-16,...k*k,-k*k(k=m/2)称二次探测再散列。(二)建立索引的算法、计算复杂度及空间复杂度分析1、算法分析hash表初始化时,根据用户输入的k值,计算出存储哈希表需要的空间,利用内存动态分配函数动态分配内存,k-mer所在行数为1000000以内所以我们采用int型(占用4字节)存储,而其在行的第几个位置数在100以内,我们则采用char(占用1字节)型存储,充分减少空间损耗。哈希表初始化代码:求关键码值如上叙述采用四进制转十进制数作为关键码值存入哈希表用于位置索引。求关键码值代码:建立哈希表过程中先将传入的长度为100的字符串分成每k个字符一段的串,每分好一个就求一个关键码值存储哈希表,为了提高建立索引的速度,每个关键码值只对应一个位置信息,也就是说索引查询时只返回k-mer的一个位置信息。倘若每个关键码值都有其对应的位置信息了,就退出索引建立,索引建立完成。建立哈希表代码:2、计算复杂度分析不考虑8G空间限制,k在1~50的范围内每条DNA序列分段的循环不断增加,计算复杂度也随之增加,而50~100范围内循环则又开始减少。根据,建立索引的计算复杂度为3、空间复杂度分析逻辑上哈希表空间占用计算公式:(每条索引信息逻辑空间占用为5Byte)k值建立索引后空间占用(GB)10.0000000220.0000000730.0000003040.0000011950.0000047760.0000190770.0000762980.0003051890.00122070100.00488281110.01953125120.07812500130.31250000141.25000000155.000000001620.00000000由以上图表可以清晰的看到,索引建立的内存消耗随着k的增长幂指数增长,与k-mer排列组合种类数()相对应,所以减少每条索引数据的存储空间,可大大增加k的取值范围,k-mer所在行数为1000000以内所以我们采用int型(占用4字节)存储,而其在行的第几个位置数在100以内,我们则采用char(占用1字节)型存储,尽可能的缩小了每条索引数据的存储空间,最终使k支持1~14。但由上表可以看出,逻辑上k=15也能支持,但设备资源有限,未能实际测试。k=14时,索引建立实际内存消耗为1313924KB=1.2530555GB,与逻辑分析基本一致。如下图:(三)索引查询的算法、计算复杂度及空间复杂度分析1、算法分析索引查询需要将要查找的k-mer的关键码值求出来,然后直接从哈希表中输出对应关键码值的位置信息,求关键码值的函数同建立索引过程的函数,不再重复给出。索引查询代码如下:2、计算复杂度分析索引查询的过程中只有求关键码值时需要进行计算,其计算复杂度为:3、空间复杂度分析索引查询过程用到只一个存关键码值的中间变量,根据(临时占用存储空间大小的量度)可知,索引查询过程中空间复杂度为:(四)整套索引算法程序在不同k值下内存占用及极限分析k值k-mer种类数建立索引耗时(秒)索引查询耗时(秒)1400216003640042560.0010510240.0010640960.00807163840.03108655360.17092621441.06801010485768.29011419430433.5580121677721636.0830136710886439.31601426843545643.9470测量上表耗时数据设备参数:CPU:Intel酷睿i33110M2.4GHz双核心/四线程内存(RAM):DDR31600MHz8G硬盘:500G5400转比对以上两折线图不难发现建立索引耗时与k-mer种类数目变化趋势并不是一致的,原因有两点,第一点建立索引用事在9秒前几乎为零因为此算法在确认所有种类k-mer都有对应位置后索引就建立完成不管是否将所有数据都遍历过,9秒前k-mer种类较少,所以没有检索所有数据就已经完成了索引建立;第二点建立索引耗时并没有跟着k-mer种类指数上升而是放缓,原因是k-mer种类太多,将所有数据都遍历结束后,有的k-mer也没有找到与其匹配的位置,所以耗时基本就是遍历所有数据的时间。(五)缺陷分析及改进方案1、缺陷分析建立索引过程中会有一个k-mer与多个位置对应,由于hash表存储限制发生了冲突,只能返回k-mer的一个位置信息,不能将k-mer的所有位置信息都返回。2、改进方案针对这个缺陷,可以采取hash算法冲突处理方法——开放定址法,或采用hash的改进算法tri-树(字典树)算法,在这里我们采用冲突处理的方案对此算法进行改进,在内存有限制的情况下,放弃一点k值的范围,腾出部分空间来存储更多k-mer位置信息,从而弥补之前的缺陷,代码见附录二。五、参考文献[1]创建者:flyingmyself时间复杂度=4RJO-qHmJs867JEK2pvSfIKToIjcxIlypp734GUAleMJj00389L8k2m4V21p8caE2Fg8Yk_QvOXXWLBp_CaUva2015/04/24[2]创建者:raoping2005空间复杂度=LhNC_mrj6INewQsI83PqZIksI0sq8bHtHVtHYOfspfSVvpCxWcMIgmoddmicWAi8s5yNzwkVwyxhZO9kHXe9yq2015/04/24

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功