Este es el subalgoritmo que me falta por hacer:
void all_mostFreqKMers(const string &texto, unsigned k, All_KmerMF &all_kmer_mf);
que devuelve todos los k-mer mas frecuentes (all kmer mf) de texto . El tipo All KmerMF debe definirse como:
const unsigned MAX_KMERS = 10; // Maximo numero posible de kmers de tamaño k
typedef array <string, MAX_KMERS> KMers; // Array de cadenas para guardar los kmers mas frecuentes.
struct All_KmerMF
{
KMers kmers; // Listado de kmers (cadenas) mas frecuentes de tamaño k
unsigned num_kmers; // Numero de kmers mas frecuentes de tamaño k
unsigned frec; // Frecuencia de los kmers mas frecuentes de tamano k
};
Asi, en el ejemplo anterior, si llamamos al algoritmo all mostFreqKMers con k = 9, debe devolvernos los k-mers:
ATGATCAAG
CTCTTGATC
TCTTGATCA
CTTGATCAT
que tienen una frecuencia de 3 apariciones en el texto.
Aqui os dejo el codigo que he echo me compila bien , lo unico es que me devuelve por pantalla el mismo kmer , es decir , si pongo k = 9 , me devuelve 10 veces "CTTGATCAT" . Espero que me puedan echar una mano.
Código:
Código:
#include <iostream>
#include <string>
#include <tr1/array>
using namespace std ;
using namespace std :: tr1 ;
//Constantes y tipos
const unsigned MAX_KMERS = 10; // Maximo numero posible de kmers de tamaño k
typedef array <string, MAX_KMERS> KMers; // Array de cadenas para guardar los kmers mas frecuentes.
struct KmerMF
{
string kmer;
unsigned frec;
};
struct All_KmerMF
{
KMers kmers; // Listado de kmers (cadenas) mas frecuentes de tamano k
unsigned num_kmers; // Numero de kmers mas frecuentes de tamano k
unsigned frec; // Frecuencia de los kmers mas frecuentes de tamano k
};
//Cabecera subalgorimos
unsigned calc_frec(const string &texto, unsigned pos, const string &kmer) ; //Calcula la frecuencia de aparicion de un kmer en el texto
void mostFreqKMers(const string &texto, unsigned k , KmerMF &kmer_mf) ; //Devuelve el kmer (de longitud k) mas frecuente del texto
void all_mostFreqKMers(const string &texto, unsigned k, All_KmerMF &all_kmer_mf); //Devuelve todos los Kmer mas frecuentes del texto
//Algoritmo principal
int main ()
{
unsigned k ;
string texto = string("ATCAATGATCAACGTAAGCTTCTAAGCATGATCAAGGTGCTCACACAGTTTATCCACAAC") +
"CTGAGTGGATGACATCAAGATAGGTCGTTGTATCTCCTTCCTCTCGTACTCTCATGACCA" +
"CGGAAAGATGATCAAGAGAGGATGATTTCTTGGCCATATCGCAATGAATACTTGTGACTT" +
"GTGCTTCCAATTGACATCTTCAGCGCCATATTGCGCTGGCCAAGGTGACGGAGCGGGATT" +
"ACGAAAGCATGATCATGGCTGTTGTTCTGTTTATCTTGTTTTGACTGAGACTTGTTAGGA" +
"TAGACGGTTTTTCATCACTGACTAGCCAAAGCCTTACTCTGCCTGACATCGACCGTAAAT" +
"TGATAATGAATTTACATGCTTCCGCGACGATTTACCTCTTGATCATCGATCCGATTGAAG" +
"ATCTTCAATTGTTAATTCTCTTGCCTCGACTCATAGCCATGATGAGCTCTTGATCATGTT" +
"TCCTTAACCCTCTATTTTTTACGGAAGAATGATCAAGCTGCTGCTCTTGATCATCGTTTC";
All_KmerMF all_kmer_mf ;
cout << "Introduzca k: " ;
cin >> k ;
all_mostFreqKMers ( texto , k , all_kmer_mf ) ;
for ( unsigned i = 0 ; i < all_kmer_mf.num_kmers ; i++ )
{
cout << "Kmers: " << all_kmer_mf.kmers[i] << endl ;
}
cout <<" ; " << all_kmer_mf.frec << " ; " << all_kmer_mf.num_kmers << endl ;
}
unsigned calc_frec(const string &texto, unsigned pos, const string &kmer)
{
unsigned frec , t , k ;
t = unsigned ( texto.size() ) ;
k = unsigned ( kmer.size() ) ;
frec = 0 ;
for ( unsigned i = pos ; i < t ; i++ )
{
if ( texto.substr ( i,k ) == kmer )
{
frec = frec + 1 ;
}
}
return frec ;
}
void mostFreqKMers(const string &texto, unsigned k, KmerMF &kmer_mf)
{
unsigned frecuencia ;
kmer_mf.frec = 0 ;
for ( unsigned i = 0 ; i < ( int( texto.size() ) -k ) ; i++ )
{
frecuencia = calc_frec ( texto , 0 , texto.substr ( i , k ) ) ;
if ( frecuencia >= kmer_mf.frec )
{
kmer_mf.kmer = texto.substr ( i , k ) ;
kmer_mf.frec = frecuencia ;
}
}
}
void all_mostFreqKMers(const string &texto, unsigned k, All_KmerMF &all_kmer_mf)
{
KmerMF kmer ;
all_kmer_mf.num_kmers = 0 ;
for ( unsigned i = 0 ; i < MAX_KMERS ; i++ )
{
mostFreqKMers ( texto , k , kmer) ;
all_kmer_mf.kmers[i] = kmer.kmer ;
all_kmer_mf.frec = kmer.frec ;
all_kmer_mf.num_kmers++ ;
}
}