楼主: microtan
1314 7

[问答] 求一个序列的子串,目前效率太低,求高效方法? [推广有奖]

  • 0关注
  • 0粉丝

高中生

47%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
194 点
帖子
18
精华
0
在线时间
16 小时
注册时间
2012-5-25
最后登录
2017-9-14

楼主
microtan 发表于 2012-5-28 16:34:49 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
一段一亿长“acgt”序列序列L,目标是寻找这条序列里面长度为n长的子串个数。目前我的算法就是遍历一遍,然后取出每个子串,之后用R的table()函数得出结果。table()的效率很高,慢就慢在循环上面,请教高手指点!谢谢!

L="acgt...............gcta..................................aaccgt" #总共是1亿长
a=c("")  

   for(i in 1:100000000)
    {
       a[i]=substr(L,i,i+n-1)
     }
    b=table(a)
    print(b)

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:SUBSTR Table print ABLE subs 云台山 龙门

沙发
qoiqpwqr 发表于 2012-5-28 19:30:07
建议用C

藤椅
trier2006 发表于 2012-5-28 19:59:47
向量化
最好的医生是自己,最好的药物是时间……

板凳
qoiqpwqr 发表于 2012-5-28 22:16:34
你原来那个用循环的方法#1太慢。
#2用的apply,速度也不行
#3走了个捷径,速度好一些,长度1千万的用了两分钟

len <- 10000000
L <- sample(c("a", "c", "g", "t"), size = len, replace = T)
L <- paste(L, collapse = "")
a <- c("")
n <- 4

# 1
#system.time(for(i in 1:(len-n+1)) a[i]=substr(L,i,i+n-1))

# 2
ind1 <- 1:(len-n+1)
ind2 <- n:len
ind <- cbind(ind1, ind2)
getString <- function(nn) substr(L, nn[1], nn[2])
ptm <- proc.time()
out <- apply(ind, 1, getString)
proc.time() - ptm

# 3
ptm <- proc.time()
L <- strsplit(L, split = "")[[1]]
mat <- matrix(NA, nrow = (len-n+1), ncol = n)
for (i in 1:n) {
   mat[, i] <- L[i:(len-n+i)]
}
out2 <- apply(mat, 1, paste, collapse = "")
proc.time() - ptm

已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
babymafia + 1 + 1 + 1 热心帮助其他会员
ltx5151 + 20 + 1 python would be better. a comprise betwe

总评分: 经验 + 20  学术水平 + 1  热心指数 + 2  信用等级 + 1   查看全部评分

报纸
microtan 发表于 2012-5-28 23:53:13
qoiqpwqr 发表于 2012-5-28 22:16
你原来那个用循环的方法#1太慢。
#2用的apply,速度也不行
#3走了个捷径,速度好一些,长度1千万的用了两 ...
非常感谢!我测试了一下 耗时主要在substr()这句上面。1千万2分钟,那么一个亿 就得20多分钟,如果我的n in 1:20 的话也就意味着要400分钟。不知道用R调用C 或者perl 能否快些?谢谢!

地板
qoiqpwqr 发表于 2012-5-29 00:04:20
microtan 发表于 2012-5-28 23:53
非常感谢!我测试了一下 耗时主要在substr()这句上面。1千万2分钟,那么一个亿 就得20多分钟,如果我的 ...
C会快很多。Perl不知道,没用过。

7
qoiqpwqr 发表于 2012-5-29 00:05:18
microtan 发表于 2012-5-28 23:53
非常感谢!我测试了一下 耗时主要在substr()这句上面。1千万2分钟,那么一个亿 就得20多分钟,如果我的 ...
如果你只用一次的话,其实几百分钟也还好了。

8
xu823317513 发表于 2012-5-30 12:45:43
DNA sequence,哈哈

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 17:29