C语言数组相似度比对,C语言实验报告:碱基相似度比较

C 语言实验报告:碱基序列相似度比较 ByLegstrong Cannon 一.实验背景: 生物的基因是由碱基对排列而成的,庞大的遗传信息蕴含在碱基 A,T,C,G 的的排列顺序之中。然而现代人类科技的发展水平尚且 不能根据生物的碱基序列预测生物的遗传性状,我们的能力仅限于在 多个具有相同形状的个体中寻找近似度最高的一段基因序列。所以, 基因序列的比较工作在重多科研与医疗领域有重大作用。 二.实验目的: 通过 C 语言的程序设计,模拟基因链之间相似度的比较。 三.实验原理: 1.通过 1~4 随机正整数的生成,和 1-A、2-T、3-C、4-G 的数字与 碱基的对应关系,生成给定长度的碱基序列。 2.当两条链的位置暂定时,通过循环结构可以实现两条相似度的 比较。 四.实验步骤: 实验Ⅰ: 1.在 main 函数之外定义代表总基因链的全局字符数组 whole[N](define N100000)、和代表基因单链的全局字符数组 single[M](defineM100)、 以及代表基因单链某次与总基因链对比后相同碱基的个数的全集整 数数组 similarity[M-N+1],明显比较的次数是 M-N+1。 2.利用循环结构生成 N 个 1~4 内的随机整数,并按照 1-A、2-T、3-C、 4-G 的对应关系,将这一串字母写入名为 whole_gene_string.txt 的文 件夹,代表总基因链的生成;长度为 M 的基因单链的生成方法同理, 写入名为 single_gene_string.txt 的文件夹。 3.利用循环结构把 whole_gene_string.txt 里的碱基顺序读入字符数组 whole[N],把 single_gene_string.txt 里的碱基顺序读入字符数组。 4.定义计数变量 count=0,利用上述两字符数组各位包含的碱基的对 比开始单链与总链的对比工作: 1)利用循环结构,单链的第一位首先与总链第一位进行比较,之 后依次是单链的第二位和总链的第二位......直到单链的第 M 位与总链 的第 M 位完成比较.。比较过程中若两碱基相同则计数变量加一,完 2)利用循环结构,单链的第一位与总链的第二位进行比较,之后 依次是单链的第二位和总链的第三位......直到单链的第 M 位与总链的 第 M+1 位完成比较。比较过程中若两碱基相同则计数变量加一,完 成比较后计数变量的值赋予 similarity[1],计数变量清零; 3)利用循环结构重复上述步骤,直到单基因链的最后一位与总基因链 最后一位完成比较。 5.定义 max 的初始值为 0,利用循环结构依次比较 similarity[N-M+1] 的每一项与 max 的大小关系,当 similarity[i]的值大于 max 时,把 similarity[i]的值赋予 max。如此可找到 similarity[i]的最大值,即在步骤 4 的比较中相同次数最多的一次比较的相同次数。 6.实现步骤 5 之后 max 的值即是数组 similarity[]的最大值,利用循环 结构再次比较每一位与 max 值的大小关系,当 similarity[k]的值与 max 的值相等时 k+1 的值即是单链开始与总链上相同长度的基因片段有 最大相似度时总链上该片段的第一个碱基的位置。 7.输出最大相似度 a=max/M*100%. 从总链的第 k+1 位开始有最大相 似度 。 某次实验的实验结果: 实验ⅠⅠ: 通过分析不难发现,如果我们按顺序从 A 链抽取长度为 100 的子 链,然后去 B 链中分别比较,那么实验二便可以参照实验一的方法进 行。 具体步骤如下: 1.在 main 函数之外定义代表 A 链的全局字符数组 str_a[A](define A 10000)、和代表 B 链的全局字符数组 str_b[B](defineB100)、代表从 A 链中抽取的子链 str_temp[N] (defineN 100)以及代表某个子链某次与 总 基 因 链 对 比 后 相 同 碱 基 的 个 数 的 全 集 整 数 数 组 simi[(A-N+1)][(A-N+1)];,明显比较的次数是(M-N+1)^2。 2.利用循环结构生成 N 个 1~4 内的随机整数,并按照 1-A、2-T、3-C、 4-G 的对应关系,将这一串字母写入名为 gene_string_a.txt 的文件夹, 代表 A 链的生成;长度为 B 的 B 链的生成方法同理,写入名为 gene_string_a.txt 的文件夹。 3.利用循环结构把 gene_string_a.txt 里的碱基顺序读入字符数组 str_a[A],把 gene_string_a.tx 里的碱基顺序读入字符数组 str_b[B]。 4.利用循环结构从 A 链中提取(A-N+1)个子链:方法为分别以序号 为 1 至 N-A 的碱基作为起始点,将起始点后 N 位的字符存入数组 str_temp 中,其中每一个起始点对应一个 str_temp,共有(A-N+1) 个。 5.定义计数变量 count=0,利用上述两字符数组各位包含的碱基的对 比开始子链与 B 链的对比工作: 1)利用循环结构,按照顺序取出一个子链。 2)利用循环结构,子链的第一位首先与 B 链第一位进行比较,之 后依次是单链的第二位和总链的第二位......直到单链的第 M 位与总链 的第 M 位完成比较.。比较过程中若两碱基相同则计数变量加一,完 3)利用循环结构,子链的第一位与 B 链的第二位进行比较,之后 依次是单链的第二位和总链的第三位......直到单链的第 M 位与总链的 第 M+1 位完成比较。比较过程中若两碱基相同则计数变量加一,完 成比较后计数变量的值赋予 simi[(A-N+1)][(A-N+1)],其中二维数组前一 项代表所取子链序号,后一项代表所匹配的碱基序号。计数变量清零; 4)利用循环结构重复上述步骤,直到单基因链的最后一位与总基 因链最后一位完成比较。 6 定义 max 的初始值为 0, 利用循环结构依次比较 simi[(A-N+1)][(A-N+1)] 的每一项与 max 的大小关系,当 simi[(A-N+1)][(A-N+1)]的值大于 max 时,把 simi[(A-N+1)][(A-N+1)]的值赋予 max。如此可找到 similarity[i] 的最大值,即在步骤 5 的比较中相同次数最多的一次比较的相同次数。 7.实现步骤 6 之后 max 的值即是数组 simi[(A-N+1)][(A-N+1)]的最大值, 利用循环结构再次比较每一位与 max 值的大小关系, simi[(j)][(k)]的值 与 max 的值相等时 j+1 即是子链的起始碱基亦即 A 链匹配开始的位置。 k+1 的值即是子链开始与 B 链上相同长度的基因片段有最大相似度时 总链上该片段的第一个碱基的位置。 8.输出最大相似度 a=max/M*100%. 从 A 链的第 j+1 位从, B 链的第 k+1 位开始有最大相似度。 五.分析总结 实验Ⅱ中设立了全局的二维整数数组来记录每次比较的相似度, 然而 C 语言允许设立的二维数组不能超过 1000*1000.所以 A,B 链的 长度并不能达到一百万。 用 C 语言编写的的 BLAST 算法同样用到二维整数数组,所以同样会存在可比较 的序列长度不够的问题。了解到真正投入应用的 BLAST 算法程序是用 java 语言 编写的,或许这一问题会在不同的语言结构中有所改善。

展开阅读全文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值