分而治之的平均值

Posted

技术标签:

【中文标题】分而治之的平均值【英文标题】:Divide and conquer average 【发布时间】:2018-03-19 11:03:46 【问题描述】:

首先,问题不在于算法(至少我认为我明白了);每当我使用求平均值的函数时,问题就会出现。

代码可以编译,但是当我到达执行所述函数的行时,程序停止工作,可能是因为我正在玩数组,或者可能是因为执行需要多长时间(尽管我非常怀疑这是最后一个)。

如果有人可以请告诉我问题出在哪里:

因此,对于程序: 尝试使用分治法获得数组的平均值。我将数组除以 2,然后继续直到我只有 1 个数组元素并返回该值,否则返回 (avg(数组的最左边部分) + avg(数组的最右边部分))/2。

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

int avg(int in, int end, int* a)
    if ((end - in) == 0)
        return a[end];
    
    return (avg(in, ((end - in)/2)-1, a) + avg((end - in)/2, end, a));


int main()
    int a,*b,i;
    printf("Please say how long the array is going to be: ");
    scanf("%d",&a);
    b = (int*)malloc(sizeof(int) * a);
    if (b)
        for(i=0; i<a; ++i)
            printf("Please enter the element number %d of the array: ", i+1);
            scanf("%d",&b[i]);
        
        printf("The array is:\n\n\n");
        for(i=0; i<a; ++i)
            printf(" %d\n", b[i]);
        
        printf("\n\n");
        printf("The array's average is : %d", avg(0, a-1,b));
    
    else
        printf("Sorry, but an array of that size can't be created!\n");
    

    return 0;

【问题讨论】:

这是一种尝试取平均值的糟糕方法。递归在这里完全不合适。只需添加数字,然后除以计数。如果你想递归地做,那么你需要通过它们的相对计数来加权值,然后除以总数(所以你做了更多的除法)。例如,如果您有 7 个数字,并且您将前 4 个平均为 a4,后 3 个平均为 a3,则不能简单地使用 (a4+a3)/2。相反,您需要执行 (4*a4+3*a3)/7。那是因为 a4 包含更多的样本,因此需要比 a3 具有更高的权重。算一下。 我知道求平均值的方法很糟糕,但有人告诉我用这种方法求平均值(强制)。 嗯,你需要使用加权平均值,正如我所描述的。 if ((end - in) == 0)if (end == in) 的一种有趣(有趣的奇特)写作方式。 【参考方案1】:

乍一看,您还没有处理过 2 元素数组的情况。如果 in=0 且 end=1,那么它将调用 avg(-1,0,a) ... 因为对于整数,1/2=0。

【讨论】:

是的,我添加了 end - in == 1 的情况,并且还在 avg 参数上而不是 havng (end - in)/2 - 1,我刚刚离开了除法(提取了-1) 并在第二次调用 avg 时使用 (end - in)/2 + 1。谢谢!

以上是关于分而治之的平均值的主要内容,如果未能解决你的问题,请参考以下文章

大话算法-排序-快排序

排序算法`一网打尽

排序算法-线性时间复杂度

分而治之——为啥有效?

矩阵乘法 - 分而治之 vs Strassen,分而治之更快?

分而治之和快速排序