Ver Mensaje Individual
  #6 (permalink)  
Antiguo 06/04/2015, 15:25
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: arreglos y sus elementos repetidos

Cita:
Iniciado por lareto Ver Mensaje
No quiero complicarle la vida a JarolGarcia con una versión más compleja que la que pueda asimilar, pero me parece que puede resultar interesante hacer una comparación entre una solución relativamente simple y artesanal, en estilo C (para lo que tomo como ejemplo y acomodando un poco la respuesta de eferion), y otra en estilo C++.
No era mi intención complicarle la vida... explico los pasos y pongo un código que, si bien funciona, no es algo típico que alguien pueda limitarse a copiar y pegar... tiene detalles que cantan.

La idea es que tenga un ejemplo que le sirva de base... pero al final tiene que ser él el que elabore una solución funcional.

Cita:
Iniciado por lareto Ver Mensaje
Yo creo que el estilo C++ tiene una ventaja inmediata: es mucho más fácil pensar en una solución y esa solución es muy fácil de hacer eficiente, mientras que la solución en estilo C puede no ser difícil de pergeniar, pero es más difícil de hacer eficiente o, por lo menos, se necesita bastante más esfuerzo y reinventar varios paraguas para conseguir una solución equivalente. Mi idea es que para obtener una solución eficiente en C++ no hace falta ser demasiado inteligente, sólo estudiar un poco más.
Coincido contigo en parte.

En C se pueden conseguir soluciones mucho más eficientes que C++... pero ello te obliga a reinventar la rueda varias veces, lo cual pocas veces compensa, hasta aquí conforme.

Sin embargo eso de que para programar C++ no hace falta ser demasiado inteligente... es distinto. Creo que para controlar C++ tienes que pensar de forma más abstracta a como se hace con C, pero de ahí a insinuar que programar en C++ es más fácil...

Cita:
Iniciado por lareto Ver Mensaje
Va el ejemplo de comparación, que espero pueda servirle a alguien.
He optimizado un poco tu función C++, lo cual refuerza la teoría de que con un buen diseño en C++ es más fácil aplicar optimizaciones (esta nueva versión es un 25% más rápida):

Código C++:
Ver original
  1. std::unordered_map<int, int> estilo_cpp(int N)
  2. {
  3.     std::unordered_map<int, int> m;  // las funciones devuelven un map para
  4.                                      // no tener que mostrar con cout
  5.                                      // los miles de valores
  6.  
  7.  
  8.     std::minstd_rand0 generator;     // llena un vector con elementos al azar
  9.  
  10.     std::vector<int> v;
  11.     v.reserve(N);
  12.     for(int i=0; i<N; ++i) {
  13.         v.push_back(generator()%N);
  14.     }
  15.  
  16.     std::map< int, int > temp;
  17.     for( auto it = m.begin( ); it != m.end( ); ++it )
  18.       temp[ it->first ]++;
  19.  
  20.     for( auto it = temp.begin( ); it != temp.end( ); ++it )
  21.       m[it->first] = it->second;
  22.  
  23.     return m;
  24. }

Un saludo.