在整数数组中查找最大/最小出现次数

Fab*_*llo 2 c arrays frequency

我刚刚编写了一个算法,该算法在输入整数数组中找到具有最大/最小出现次数的值.我的想法是对数组进行排序(所有出现的顺序都是按顺序排列)并使用一<value:occurrences>对来为每个值存储相应的出现次数.

它应该是O(nlogn)复杂的,但我认为有一些常数乘数.我该怎么做才能提高性能?

#include <stdio.h>
#include <stdlib.h>
#include "e7_8.h"

#define N 20
/*Structure for <value, frequencies_count> pair*/
typedef struct {
    int value;
    int freq;
} VAL_FREQ;


void  get_freq(int *v, int n, int *most_freq, int *less_freq) {

    int v_i, vf_i, current_value, current_freq;

    VAL_FREQ* sp = malloc(n*sizeof(VAL_FREQ));
    if(sp == NULL) exit(EXIT_FAILURE);

    mergesort(v,n);

    vf_i = 0;
    current_value = v[0];
    current_freq = 1;
    for(v_i=1; v_i<n+1; v_i++) {
        if(v[v_i] == current_value) current_freq++;
        else{
            sp[vf_i].value = current_value;
            sp[vf_i++].freq = current_freq;
            current_value = v[v_i];
            current_freq = 1;
        }
    }
    /*Finding max,min frequency*/
    int i, max_freq_val, max_freq, min_freq_val, min_freq;

    max_freq = sp[0].freq;
    max_freq_val = sp[0].value;
    min_freq = sp[0].freq;
    min_freq_val = sp[0].value;
    for(i=1; i<vf_i; i++) {
        if(sp[i].freq > max_freq) {
            max_freq = sp[i].freq;
            max_freq_val = sp[i].value;
        }
        if(sp[i].freq < min_freq) {
            min_freq = sp[i].freq;
            min_freq_val = sp[i].value;
        }
    }

    *most_freq = max_freq_val;
    *less_freq = min_freq_val;

    free(sp);
}
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 5

使用哈希表来实现键值映射?这应该给你O(n)预期的时间.*


*但是,请注意,在最坏的情况下它是O(n 2).只有当所有条目都散列到同一个存储桶时才会出现这种情况,并且您有效地最终会在每次迭代时搜索链接列表!对于合适的散列表实现,发生这种情况的可能性非常低.