Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Como contar los datos repetidos en un arreglo de memoria , C++

Estas en el tema de Como contar los datos repetidos en un arreglo de memoria , C++ en el foro de C/C++ en Foros del Web. Estoy creando un programa de optimizacion, el problema de la mochila, en una matriz por columna ingreso datos referentes a un objeto, me eh eoncontrado ...
  #1 (permalink)  
Antiguo 14/11/2014, 22:38
 
Fecha de Ingreso: junio-2011
Mensajes: 19
Antigüedad: 12 años, 9 meses
Puntos: 0
Como contar los datos repetidos en un arreglo de memoria , C++

Estoy creando un programa de optimizacion, el problema de la mochila, en una matriz por columna ingreso datos referentes a un objeto, me eh eoncontrado un problema y es que eh creado para cada objeto una fila en la matriz que le da una categoria a cada objeto con fines para identificar que objetos pertenecen a una misma categoría, entonces esta fila dentro de la matriz, quiero saber que datos tiene (por esto no hay problema) pero tambien necesito saber cuantas veces se repiten tales datos, por ejemplo que en la matriz fila de categorias esten los datos [ 1 , 3, 5 , 2 , 1 ,5] y me devuelva las cuentas de categoria 1 = 2, catecoria 2 = 1, categoria 3 = 1, categoria 5 = 2, eh echo mil intentos y ninguno me da resultado.
  #2 (permalink)  
Antiguo 15/11/2014, 05:21
 
Fecha de Ingreso: octubre-2013
Mensajes: 44
Antigüedad: 10 años, 5 meses
Puntos: 5
Respuesta: Como contar los datos repetidos en un arreglo de memoria , C++

Puedes utilizar una función recursiva que calcule el número de apariciones como esta:

Código C++:
Ver original
  1. int count(int number, int array[], int length) {
  2.     if (length == 0)
  3.         return 0;
  4.     return (number == *array) + count(number, array+1, length-1);
  5. }

Le pasas el número que quieres buscar, y el array con su tamaño. Saludos
  #3 (permalink)  
Antiguo 15/11/2014, 06:14
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Como contar los datos repetidos en un arreglo de memoria , C++

La solución puede pasar por usar un mapa. Quizás algo tal que

Código C++:
Ver original
  1. std::map<int,int> contador;

De esta forma puedes iterar sobre tu array e ir realizando el conteo de apariciones:

Código C++:
Ver original
  1. for( int i=0; i<n; i++ )
  2. {
  3.   contador[categorías[i]]++;
  4. }

"Categorías" se asume que es el array o la fila donde están las categorías. Tras ejecutar este bucle, en contador[0] tendrás el total de veces que se repite el elemento 0 y así.

Perdón di soy un poco escueto en el ejemplo. Estoy con el móvil y aquí cuesta mas escribir código.

Un saludo
  #4 (permalink)  
Antiguo 16/11/2014, 00:02
 
Fecha de Ingreso: junio-2011
Mensajes: 19
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Como contar los datos repetidos en un arreglo de memoria , C++

Gracias por la ayuda!, apenas me doy cuenta de las respuestas, ayer estuve buecando la manera, y se me ocurrio clonar los datos del array a otro e ir contando los datos de uno y escribiendo la cantidad en otro, se me hace mas facil de entender, ya que como soy nuevo aun desconosco varias, cosas, la de las funciones recursivas se como funciona, voy a intentarlo pero la idea del mapa voy a tener que investigarla, no logro comprenderla con los datos que me das, aun no puedo solucionar el problema, esto es lo que llevo:

Código C++:
Ver original
  1. int sum = 0;
  2. int copia[n][1];
  3.     for(int i=0;i<n;i++){
  4.         copia[i][0] = memory[i][2];
  5.     }
  6. // Cuenta las veces repetidas de cada categoria
  7.     for(int i=0 ;i<n;i++){
  8.         for(int j=0; j<n; j++){
  9.             if(copia[i][0] == memory[j][2]){
  10.                 sum++;
  11.                
  12.             }  
  13.         }copia[i][1] = sum;
  14.         sum=0;
  15. }


no se si se entienda pero en la matriz copia, primera fila tengo los datos copiados, y la segunda fila tengo las veces que se repiten, a mi parecer lo tengo bien pero estoy cometiendo un error que no identifico, el resultado me da bien con pocos datos pero al ser mas de 10 me da resultado erroneos, e incluso en ocaciones aunque sean menos tambien errados.
  #5 (permalink)  
Antiguo 16/11/2014, 00:06
 
Fecha de Ingreso: junio-2011
Mensajes: 19
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Como contar los datos repetidos en un arreglo de memoria , C++

otra cosa es que tambien quiero eliminar los datos repetidos, lo que hago es con un for posicionarme en el dato que quiero borrar e ir copiando el array de esta forma:

Código C++:
Ver original
  1. // elimina los datos repetidos en las categorias
  2. for(int i=0;i<n;i++){
  3.     for(int j=n; j>i; j--){
  4.         if(copia[i][0] == copia[j][0]){
  5.             for(int i=0;i<n;i++){
  6.                 copia[i][i]=copia[i+1][i+1];
  7.             }
  8.         }
  9.     }
  10. }

Algo debe estar mal ya que los resultados no van como quiero... espero alguien pueda decirme que me estoy olvidando, gracias.
  #6 (permalink)  
Antiguo 16/11/2014, 05:27
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Como contar los datos repetidos en un arreglo de memoria , C++

Quizás este ejemplo te pueda aclarar un poco lo que te intentaba explicar acerca del mapa:

Código C++:
Ver original
  1. #include <map>
  2. #include <iostream>
  3.  
  4. int main()
  5. {
  6.   int array[] = { 1, 4, 7, 8, 9, 4, 8, 5, 3, 2, 2, 1, 1, 1 };
  7.   int numElementos = sizeof( array ) / sizeof( int );
  8.  
  9.   std::map< int, int > contadorRepeticiones;
  10.  
  11.   for ( int i=0; i < numElementos ; ++i )
  12.   {
  13.     contadorRepeticiones[ array[ i ] ]++;
  14.   }
  15.  
  16.   std::cout << "Total de repeticiones: " << std::endl;
  17.   for ( int i = 0; i < 10; ++i )
  18.   {
  19.     std::cout << "Numero " << i << " se repite " << contadorRepeticiones[ i ] << " veces" << std::endl;
  20.   }
  21.   return 0;
  22. }

Un saludo.
  #7 (permalink)  
Antiguo 16/11/2014, 16:27
 
Fecha de Ingreso: junio-2011
Mensajes: 19
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Como contar los datos repetidos en un arreglo de memoria , C++

Listo ya lo eh solucionado, gracias por sus consejos, use el de mapas que me explicaste mejor con ese código, saludos.

Etiquetas: arreglo, int, memoria, objetos, programa, repetidos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:18.