[ Foro de C++ ]

Contar subsecuencias

30-Oct-2013 12:26
Invitado (burnssss)
1 Respuestas

Tengo una duda.
El siguiente codigo me calcula cuantas veces se repite una subcadena a partir de una cadena binaria.
La longitud de las subcadenas en este ejemplo es de 4. ¿ Como modificaria el codigo para obtener subcadenas de longitud desde 5 a 20?


#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <vector>
#include <string>

using namespace std;

int main() {
	string cadena;
	char pr;
//	ofstream fo ("entreno.txt");
	ifstream fi("entreno.txt");
	int numero;
	int patron_int;
	//vector<int> v(1050000);
//	for (int i=0; i<170000; i++) {
//		//cout << v[i];
//		num=rand()%2;
//		fo<<num;
//   }
//  fo.close();
	getline(fi, cadena);
	vector<int>v(cadena.size()); 
	vector<int>patron(4);
	vector<long long>patrones(16);
	float N;
	
	//cout << cadena;
	//numero = Int32.Parse(cadena[0]);
	//pr=cadena[0].c_str();
	//cout << numero;
	//cout << cadena[0];
	for(int i=0; i<cadena.size(); i++) {
//		if (cadena[i]=='1') v[i]=0;
//		else if (cadena[i]=='1') v[i]=1;
		v[i]=cadena[i]-48;
//		cout << v[i];
	}
	
	for(int i=0;i<v.size()-3;i++) {
		for(int j=i;j<v.size()-3;j++) {
			patron[3]=v[i];
			patron[2]=v[j+1];
			patron[1]=v[j+2];
			patron[0]=v[j+3];
			//cout << patron[3] << patron[2] << patron[1] << patron[0] << endl;
			patron_int= patron[0] + patron[1]*2 + patron[2]*4 + patron[3]*8;
			//cout << patron_int << endl;
			patrones[patron_int]++;
			//if(i==v.size()/5) system("pause");
			
			//system("pause");
		}
		N=(100*i)/(v.size()-3);
	//	cout << N << "%" << endl;
		
	}
	
	for(int i=0; i<patrones.size(); i++) {
		cout << i << " se repite " << patrones[i] << " veces." << endl;	
	}
	//cout << v.size();	
	system("pause");
	fi.close();
	return 0;
}



01-Nov-2013 13:29
Nacho Cabanes (+84)

Ese fuente da un poco de miedo, porque no hay ni un solo comentario que explique la lógica de lo que se pretende, y, por el contrario, hay muchas líneas de código que sí están comentadas.

Aun así, en un primer vistazo se puede esperar que la parte que extrae esas subcadenas de longitud 4 sea la que tiene valores numéricos que van de 0 a 3:


	for(int i=0;i<v.size()-3;i++) {
		for(int j=i;j<v.size()-3;j++) {
			patron[3]=v[i];
			patron[2]=v[j+1];
			patron[1]=v[j+2];
			patron[0]=v[j+3];


Es de suponer que esa es la parte que deberías cambiar para otras longitudes (mejor usando un "for" que repitiendo 20 líneas distintas).

Pero insisto: no entiendo el fuente y no me gusta cómo está hecho. Por ejemplo, tal y como está no parece comprobar la longitud, sino que da por sentado que va a ser de 4 o más, y fallará si la longitud real es de 3 o menos.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)