使用C使用分而治之查找数组中的多数元素

Posted

技术标签:

【中文标题】使用C使用分而治之查找数组中的多数元素【英文标题】:Finding the majority element in an array using C using Divide and Conquer 【发布时间】:2018-08-05 20:47:56 【问题描述】:

我正在编写一个用于在数组中查找多数元素的算法。基本上,如果一个元素在数组中至少出现 length/2,则它是多数元素。否则,数组没有多数元素。

我对C不太熟悉,所以我在Python中找到了相同的解决方案,并尝试对其进行转换。但是,我得到的结果有一些不寻常的错误。我的算法是这样的:

#include <stdio.h>
int find_majority_element(int arr[], int length);

int main()

    int arr[] =  12, 3, 1, 1, 3, 4, 2, 2, 9, 6, 2, 1, 2 ;
    int length = sizeof(arr)/sizeof(int);

    int result = find_majority_element(arr, length);

    if (result == -1) 
        printf("None");
     else 
        printf("%d", result);
    
    return 0;


int find_majority_element(int arr[], int length) 

    if (length == 2) 
        if (arr[0] == arr[1]) 
            return arr[0];
         else 
            return -1;
        
     else if (length == 1) 
        return arr[0];
    

    int *leftHalf = arr;
    int *rightHalf = arr + length/2;

    int element1 = find_majority_element(leftHalf, length/2);
    int element2 = find_majority_element(rightHalf, length/2);

    if (element1 == -1 && element2 >= 0) 
        return element2;
     else if (element2 == -1 && element1 >= 0) 
        return element1;   
    

    if (element1 == element2) 
        return element1;
     else 
        return -1;
    


这给了我意想不到的结果,考虑到我刚刚转换了另一种算法,这很奇怪。有问题的算法可以在这里找到:

Link

有什么帮助吗?谢谢。

编辑

对于给定的输入,多数元素显示为 2。这显然是错误的。

【问题讨论】:

“给我意想不到的结果”是什么意思?你期望什么,你能展示一下输出吗? 意外怎么了?什么是预期的,你得到了什么? (注意:你的代码看起来很整洁) 添加了输出。 1) 不确定逻辑是否合理。 [0, 1, 0, 1] 不会给出多数数,当您实际上有两个时(除非您的意思是 frequency &gt; length/2,而不是 &gt;=)。另一方面,[0, 1, 2, 3, 4, 5, 6, 6] 会给出 6 作为多数数? 2)除法时,假设长度总是偶数;应该是int element2 = find_majority_element(rightHalf, length/2 + (length % 2)); 该算法适用于已排序的数组,因此您应该在执行之前对其进行排序,或者您需要创建一个新算法。 @jdehesa 评论是正确的 【参考方案1】:

length 为奇数时,代码不会检查整个右半部分。 @jdehesa

// int element2 = find_majority_element(rightHalf, length/2);
int element2 = find_majority_element(rightHalf, length - length/2);

总体而言,对于 未排序 数组 @Dagan,OP 的方法是不正确的。查看 Majority Element 以获取替代解决方案。


迂腐的角落:length &lt;= 0 的代码有问题。

【讨论】:

以上是关于使用C使用分而治之查找数组中的多数元素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用分而治之以及如果一个子阵列占多数,组合阵列占多数以找到多数元素的事实?

c_cpp 使用分而治之的方法查找未排序数组中的最小值和最大值

C语言中的分而治之二分查找

使用分而治之的数组的第二大元素

分而治之——未排序数组的k个元素

用于查找最大子数组的分而治之算法 - 如何同时提供结果子数组索引?