Предполагая, что ваши данные действительно состоят из цепочек ДНК длиной 3 (или более общей длины N , где N довольно мала), вы можете сделать это очень эффективно, используя -gram таблица, которая является специализированной хеш-таблицей с размером таблицы 4 N и следующей функцией хеширования:
// Disregard error codes.
int char2dna_lookup[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x0 – 0xF
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x10 – 0x1F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x20 – 0x2F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x30 – 0x3F
0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, // A – P
0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Q – 0x5F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x60 – 0x6F
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x70 – 0x7F
}
unsigned int hash(string const& dna) {
unsigned int ret = 0;
for (unsigned int i = 0; i < dna.length(); ++i)
ret = ret * 4 + char2dna_lookup[dna[i]];
return ret;
}
Теперь вы можете очень эффективно индексировать ваш массив.
ifstream ifs("data.txt");
string line;
if (not ifs >> line)
exit(1);
unsigned* frequencies = new unsigned int[line.length()];
frequencies[hash(line)] = 1;
while (ifs >> line)
++frequencies[hash(line)];
// Print the frequencies …
delete[] frequencies;
В качестве альтернативы используйте для таких задач библиотеку, такую как SeqAn .