【发布时间】:2016-08-03 11:57:12
【问题描述】:
我有一个 DNA 序列文件(A's、T's、G's 和 C's);它没有空格、逗号或行分隔符。我必须从中读取前 10,000 个值,并找到重复次数最多的两个五值模式。
到目前为止,我尝试将不同的模式存储在一个简单的结构中,如下所示:
typedef struct
{
char* pattern;
int count;
} pattern;
当我发现更多新模式时,我会通过以下循环存储它们:
int size = 10;
int pos = 0; //positions occupied
pattern* patrones = calloc(10, sizeof(pattern));
char temp[6];
FILE* file = fopen("dnaChain.txt", "rb");
while(file != NULL)
{
bool has = false;
fgets(temp, 6, file);
for(int i = 0; i <= pos; i++)
{
pattern p = patrones[i];
char* content = p.pattern;
int comp = strcmp(content, temp);
if(comp == 0)
{
has = true;
p.count = p.count+1;
}
}
if(!has)
{
pattern new;
new.pattern = temp;
new.count = 1;
if(pos == size-1)
{
patrones = realloc(patrones, size+10);
size += 10;
}
else{
patrones[pos] = new;}
pos++;
}
}
但是我的代码是错误的并给了我一个segmentation fault 错误
当我执行它时,请帮助我。
【问题讨论】:
-
好吧,我们不能给你一个向你介绍 C 编程的答案。你必须达到一定的水平,并就你遇到的具体问题提出问题。我们无法为您提供这样的帮助!
-
@JohnnyMopp 这是 C++ 参考,而不是 C。我宁愿将 OP 指向
man fread。 -
@MarcusMüller 该 wiki 有 C 和 C++ 参考,链接指向 C 参考。
-
@sjsam:不确定,但我没有一个好的选择。集合 {A, C, G, T} 中有 4^5 也就是 1024 个可能的 5 个字母序列。您可以运行 KMP 1024 次。我不确定这是否有效(实际上,我确定这不是有效的)。该问题可以通过单次遍历数据和具有 1024 个条目的辅助数据结构来解决(线性时间,但使用的空间在模式长度上是指数级的,因此它不能很好地扩展到处理 10 个序列, 20, 100, … 个字符)。 OTOH,字符串较长的重复次数较少;使用稀疏哈希表?