前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法(三)列举所有k-mer组合

算法(三)列举所有k-mer组合

作者头像
一只羊
发布2019-07-27 19:01:16
7130
发布2019-07-27 19:01:16
举报
文章被收录于专栏:生信了生信了

关键词:k-mer; recursive; trick;

什么是k-mer?

比如,“ATGC”的所有1-mer是:’A’, ‘T’, ‘G’, ‘C’。共4^1=4种组合。

而“ATGC”的所有2-mer是

“AA”, “AT”, “AG”, “AC”

“TA”, “TT”, “TG”,“TC”

“GA”, “GT”, “GG”,“GC”

“CA”, “CT”, “CG”,“CC”

共4^2=16种组合。

那么如何打印出所有的k-mer组合呢?如果是2-mer,我们可以用两个for循环来列出所有组合,如果是3-mer,可以用三个for循环。但是如果是10-mer呢?岂不是要10个for循环?那代码也太难看了。况且当k未知时,你都不知道要写几个for循环!

今天我们介绍两种来自Biostar论坛中(https://www.biostars.org/p/18096/)网友给出的方法,我们可以学习参考一下:

第一种:递归方法

递归(recursive)方法作为一种常规算法,自然是会想到的,简化后的代码如下:

第二种方法:trick~

第二种方法很有技巧性,十足的trick。简化后的代码如下:

该方法由lh3给出,简洁优美。其关键在于:经过k次“y>>2以及y&3”的运算后会生成k个介于[0, 3]的值,如果把这些值当做一个序列,当y不同时,生成的序列是不可能完全一样的。从而会生成不同的k-mer。

细细研读这段代码后,可以发现这种方法只适用于字符串长度为2的指数的情况。比如”AB”(长度为2), “ABCD”(长度为4)或”ABCDEFGH”(长度为8)等情形,而像”ABC”这种就不适用了。从普适性的角度讲,递归方法更胜一筹,因为它适用于任何长度的字符串。

最后

我们再给出列举“ABCDEFGH”的所有k-mer组合的代码:

如果任何问题欢迎交流!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信了 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档