我正在尝试用C编写Waterman算法。 现在,当序列的长度超过35时,程序就会滞后。 我不知道从哪里开始寻找,尝试但没有解决任何问题。
以下是代码:
{{1}}
答案 0 :(得分:1)
由于null使用gen_random
终止s[len] = 0;
中的序列,因此应为每个序列分配1个字节:
X = malloc(sizeof(*X) * (length1 + 1));
Y = malloc(sizeof(*Y) * (length2 + 1));
但是,既然您为其他变量定义了可变长度数组,那么您也可以将它们定义为:
char X[length1 + 1], Y[length2 + 1];
然而另一件事导致我的笔记本电脑崩溃:您的嵌套循环从i = 0
迭代到i <= m
,j = 0
到j <= n
。这一步太多了,你将界限超出L
。
以下是更正后的版本:
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
生成的代码执行速度非常快,其复杂度在时间和空间上均为O(m*n)
,但m
和n
在35
处相当小。它运行时间不到50毫秒,1000 x 1000。
是否正确实施Smith-Waterman算法是另一个问题。