查找数组中重复次数最多的元素的算法错误

Posted

技术标签:

【中文标题】查找数组中重复次数最多的元素的算法错误【英文标题】:Error in algorithm to find the most repeating element in an array 【发布时间】:2022-01-10 03:16:32 【问题描述】:

我的任务是在没有排序或哈希表的情况下找到数组中重复次数最多的元素。

这是我的伪代码:

#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; j<n; j++)
        
            if(a[j] == a[i])
            
                count ++;
                if(count > maxcount)
                
                    max_element = a[j];
                
            
        
    
    return max_element;

问题是,它并不总是能正常工作,例如使用数组[1 1 2 2 3 3 3 4 4 4 4 5 5 7],结果将是5

【问题讨论】:

最大计数永远不会改变 【参考方案1】:

在这个if语句中

            if(count > maxcount)
            
                max_element = a[j];
            

您忘记更改变量 maxcount

            if(count > maxcount)
            
                maxcount = count;
                max_element = a[j];
            

此外,if 语句应移至内部 for 循环下方。

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];
    


请注意,如果用户将参数 n 的值传递给函数等于 0,那么函数将返回一个不确定的值,因为变量 max_element 未初始化。

这样定义函数会更好,因为它返回出现频率最高的元素的索引,如下面的演示程序所示

#include <stdio.h>

size_t most_frequent( const int *a, size_t n )

    size_t pos = 0;
    size_t max_count = 0;
    
    for ( size_t i = 0; i < n - max_count; i++ )
    
        size_t count = 1;
        for ( size_t j = i + 1; j < n; j++ )
        
            if ( a[j] == a[i] ) ++count;
        
        
        if ( max_count < count )
        
            max_count = count;
            pos = i;
        
    
    
    return pos;


int main( void ) 

    int a[] =  1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 7 ;
    const size_t N = sizeof( a ) / sizeof( *a );

    size_t pos = most_frequent( a, N );
    
    printf( "The most frequent number is %d found at position %zu\n", 
            a[pos], pos );  

    return 0;

程序输出是

The most frequent number is 4 found at position 7

【讨论】:

以上是关于查找数组中重复次数最多的元素的算法错误的主要内容,如果未能解决你的问题,请参考以下文章

numpy如何查找数组中个数最多的元素

在c#中找出一个数组中出现次数最多的元素,求各种方法,要详细的代码

C语言,查找数组里重复出现的数字;

从数组中找到元素出现次数最多的元素

如何求出数组中出现次数最多的数字(C#实现)

如何获取数组中出现次数最多的字符串?