es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error en el algoritmo para encontrar el elemento más repetido en un arreglo.

Mi tarea es encontrar el elemento que se repite más veces en un array sin ordenar ni utilizar tablas hash.

Este es mi pseudocódigo:


#include <stdio.h> int most_frequent(int *a, int n) { int i, j, max_element, count; int maxcount = 0; for(i = 0; i<n; i++)="" {="" count="1;" for(j="i+1;"></n;><n; j++)="" {="" if(a[j]="=" a[i])="" {="" count="" ++;="" if(count=""> maxcount) { max_element = a[j]; } } } } return max_element; }

El problema es que no siempre funciona correctamente, por ejemplo, con el array [1 1 2 2 3 3 3 4 4 4 4 5 5 7], el resultado será 5.</n;></stdio.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el pseudo-código proporcionado es que la variable maxcount no se actualiza correctamente cuando se encuentra un nuevo elemento de frecuencia máxima. Además, la variable max_element se asigna con el valor de a[j] dentro del bucle for interno, lo que significa que no siempre será el elemento más frecuente en general, ya que podría ser sobrescrito por un elemento menos frecuente más adelante.

    Para solucionar el código, podemos mover la asignación de max_element fuera del bucle interno y actualizar maxcount al mismo tiempo. También debemos asegurarnos de comenzar a contar la frecuencia de cada elemento desde el inicio del arreglo, para evitar saltar cualquier ocurrencia.

    Aquí tienes una versión corregida del código:

    int most_frequent(int *a, int n)
    {
        int i, j, max_element, count;
        int maxcount = 0;
    
        for(i = 0; i < n; i++)
        {
            count = 1;
            for(j = i + 1; j < n; j++)
            {
                if(a[j] == a[i])
                {
                    count++;
                }
            }
            if(count > maxcount)
            {
                maxcount = count;
                max_element = a[i];
            }
        }
        return max_element;
    }
    

    Utilizando el arreglo de ejemplo anterior, este código corregido mostrará correctamente 4 como el elemento más frecuente.

Comments are closed.