我有一个DNA序列的文件(A,T,G和C);它没有空格,逗号或行分隔符。我必须从中读取前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
错误
当我执行它时,请帮助我。
答案 0 :(得分:1)
首先将所有 10000个值读入内存,然后仅对内存数据进行操作。
至于查找序列,它基本上是简单的子串搜索。一个天真的解决方案是从前五个字符开始,然后从第二个字符搜索相同的子字符串,然后从第三个字符搜索,然后从第四个字符搜索,依此类推。计算找到子字符串的次数。
然后做同样的事情,但从第二个角色开始,向前五个角色。从第三个字符,第四个字符中查找子字符串,依此类推。
在两次首次搜索后,您将有两个计数,一个大,一个小。如果在下一次搜索期间发现一个子字符串的计数大于当前两个子字符串,则删除最小的子字符串并保存当前子字符串(及其计数)。等等,直到你检查了整个字符串。
这将是很多循环,并不是非常有效,但应该给你想要的结果。