c - 提高 C 程序的性能

标签 c performance

我正在为一项作业编写程序,目前我的程序只慢了大约 30 毫秒。但是,我不完全确定如何加快我的程序。我试图在我的循环中预先计算一些函数,但我不确定它是否有帮助...

该程序的目的是接收一堆输入并确定特定数字是否在输入中占多数,并作为后续确定任何亚军。

示例输入可能是:1 2 2 2 1 0

程序会输出:

majority: 2
runner-up: 1
#include <stdio.h> 
#include <stdlib.h>

int majorityCheck (int length, int arrMajority[]);
int runnerCheck (int length, int arrRunner[]);

unsigned int var, x, y;

int majorityCheck(int length, int arr[]){ //checks for maj
    int var, x, y;
    for(x=0;x<length-1;x++){
        var=0;
        for(y=0;y<length-1;y++){
            if(arr[y]==arr[x]){
                var++;
            }
        }
        if(2*var>length-1){
            return arr[x];
        }
    }
    return -1;
}

int runnerCheck(int length, int arr[]){ //checks for runnerup
    for(x=0;x<length-1;x++){
        var=0;
        for(y=0;y<length-1;y++){
            if(arr[y]==arr[x]){
                var++; //var is just a random incrementing tool
            }
        }
        if(2*var<length-1 && 4*var>length-1){
            return arr[x];
        }
    }
    return -1;
}

int main(int argc, char *argv[])
{
    unsigned int input;
    int *list=malloc(sizeof(int));
    int size=1;
    int numRunner;

    while(scanf("%u", &input)){
        if(input==0){
            break;}
            list[size-1]=input;
            size++;
            list=(int*)realloc(list, size*sizeof(int));
        }

    int numMajority=majorityCheck(size, list);
    if(numMajority==(-1)){
        printf("majority: NONE");}
        else{
            numRunner=runnerCheck(size, list);

            if(numRunner==(-1)){
                printf("majority: %d\nrunner-up: NONE", numMajority);
                }else{
                    printf("majority: %d\nrunner-up: %d", numMajority, numRunner);
                }
            }
            return 0;
        }

最佳答案

这是你可以做的:

  1. 使用合并排序对数组进行排序。
  2. 遍历数组,一次比较两个元素。所以首先将 0 与 1 进行比较,然后将 1 与 2 进行比较... 检查元素 n 是否等于 n-1。这样做时,确定每个数字出现了多少次。如果您看到一个新数字,将其计数设置为 1,如果与它后面的数字匹配,则增加其计数。否则,为下一个数字创建一个新计数。

因此,作为示例,请考虑数组 0, 1, 1。首先,您将查看值 0(在索引 0 处)并将其计数存储在某处。然后将它与 1(在索引 1 处)进行比较,看看它们是否匹配。如果是,则增加 0 的计数,否则,将 1 的计数作为 1 存储在另一个变量中。由于它们不匹配,您将创建一个变量来存储 1 的计数。现在在比较索引 1 和 2 处的 1 时重复此过程...您最终会得到保存 01 计数的变量.您可以通过它们找到大多数事件的排名。

如果您希望算法能够处理的不仅仅是两个最高计数,则可以使用包含数字及其计数的结构数组。

另一方面,如果您知道您只需要两个数字,那么您可以只跟踪四个变量中具有两个最高计数的数字(firstNumfirstCountsecondNumsecondCount)。

关于c - 提高 C 程序的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52926427/

相关文章:

python - 对 numpy 数组的所有值执行操作,引用 i 和 j

arrays - 高效的钻头容器

c# - 不同的 linq 使用顺序之间有性能差异吗?

java - 如何在java中获得良好的正则表达式性能

c - TFTP 服务器 - 线程版本问题

c - 共享 pthread_cond_broadcast 卡在 futex_wait

c++ - 为什么一个 omp 线程完成而其他线程无法执行相同操作?

c - 为什么在 C 中不允许使用表达式 c=(a+b)++?

c - 内存映射点到指针?

performance - “for”循环与 MATLAB 中的矢量化