Moda en arreglo ordenado de enteros

En este artículo:

Operaciones con matrices – Clase Matriz en c++

se refiere un procedimiento para determinar la moda de los elementos enteros de una matriz. El autor se queja de su solución porque tiene una complejidad de O(n2) y con una matriz muy grande puede tardar mucho debido al número de recorridos y comparaciones. Lo que a mi se me ocurrió fue asignar los elementos de la matriz a un arreglo simple y ordenarlos; algo que no presento en mi programa pero lo del ordenamiento puede investigarse aquí:

ordenamiento

Para lo aquí expuesto también vale un ordenamiento tipo burbuja.

Después de asumir que tengo un arreglo ordenado, me dispuse a elaborar un algoritmo en pseudo código y lo codifiqué a esto:

#include <iostream>
#include <cstdlib>

using namespace std;

int main(){

	system ("clear");

	int i, n = 18, suma=1, old_suma_max, suma_max=1, old_moda, moda;

	int v[] = {1, 2, 2, 2, 2, 2, 3, 4, 5, 7, 9, 9, 9, 9, 9, 10, 10, 10};

	cout << "Imprime el arreglo a explorar\n\n";

	for(i=0; i< n;i++)

		cout << v[i] << " ";

	cout << "\n";

// ****************** Algoritmo para hallar la moda ******************

	moda = old_moda = v[0];

	for(i=0; i< n;i++){

		if (v[i] == v[i+1]){

			suma += 1;

		}	

		else {

			if (suma >= suma_max) {
				
				old_suma_max = suma_max;

				suma_max = suma;

				suma = 1;
				
				old_moda = moda;

				moda = v[i];
			
			}

		}

	}
	
	if (old_suma_max == suma_max) cout << "\nPuede haber mas de una moda\n\n";

	if (moda == v[0]) cout << "No hay moda\n";

		else

			cout << "frecuencia anterior = " << old_suma_max << ", moda anterior = " << old_moda << 
			", frecuencia = " << suma_max << ", moda = " << moda << "\n";

//*******************************************************************

	return 0;


}

La salida para el ejemplo propuesto es:

Imprime el arreglo a explorar

1 2 2 2 2 2 3 4 5 7 9 9 9 9 9 10 10 10 

Puede haber mas de una moda

frecuencia anterior = 5, moda anterior = 2, frecuencia = 5, moda = 9

No obstante, lo probé con otros arreglos y, aparentemente, funcionaba de manera adecuada. El que está como ejemplo en el cuerpo del programa es, tal vez, la situación más compleja, es decir, cuando hay más de una moda. Cuando hay más de dos el algoritmo, por ahora, no funciona.

Esta entrada fue publicada en Código C++. Guarda el enlace permanente.

Una respuesta a Moda en arreglo ordenado de enteros

  1. murphyx2 dijo:

    Gracias, ha sido muy util.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s