比较数组并找到相同的数据计数

时间:2017-11-30 00:24:58

标签: c algorithm

#include <stdio.h>

int main()
{
    int a, b, arr1[100000], arr2[100000], cnt=0;
    scanf("%d %d", &a, &b);
    for(int i = 0; i < a; i++)
    {
        scanf("%d", &arr1[i]);
    }
    for(int i = 0; i < b; i++)
    {
        scanf("%d", &arr2[i]);
    }

    for(int i = 0; i < a; i++)
    {
        for(int j = 0; j < b; j++)
        {
            if(arr1[i] == arr2[j]) cnt++;
        }
    }
    printf("%d", cnt);
}

这是在arr1和arr2中查找相同数据计数的代码,a和b是arr1和arr2中的一些数据。

例如,在第一行输入3 3和 10 20 三十 11 20 30

输入,

arr1是[10,20,30],arr2是[11,20,30],相同的数据计数是2.有没有办法让算法更快?

任何帮助都会很棒!谢谢!

[已解决]使用二进制搜索

#include <stdio.h>
#include <algorithm>

using namespace std;

int binarySearch(int arr[], int l, int r, int x)
{
    if (r >= l)
    {
        int mid = l + (r - l)/2;
        if (arr[mid] == x)  return mid;
        if (arr[mid] > x) return binarySearch(arr, l, mid-1, x);
        return binarySearch(arr, mid+1, r, x);
    }
    return -1;
}

int main(void)
{
    int arr1[100001], arr2[100001], cnt=0, a, b;
    scanf("%d %d", &a, &b);

    for(int i = 0; i < a; i++) scanf("%d", &arr1[i]);
    for(int i = 0; i < b; i++) scanf("%d", &arr2[i]);

    sort(arr1, arr1+a);
    sort(arr2, arr2+b);

    for(int i = 0; i < a; i++)
    {
        int result = binarySearch(arr1, 0, a, arr2[i]);
        if(result != -1) cnt++;
    }
    printf("%d", cnt);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

现在这个问题的答案完全取决于你的输入约束。在您的情况下,数组ab的大小起着至关重要的作用。

现在,如果您要对两个数组进行排序,那么复杂性将是O(a log(a))或O(b log(b)),无论哪个都很大。但在你的情况下,复杂性是O(a * b)。

现在的问题是,你的a * b&gt;排序的复杂性。如果一般情况下坚持使用以前的方法并不是更好,因为没有额外的开销,否则你可以选择排序和二进制搜索。

注意:无法快速制作算法,而是可以使用时间复杂度较低的其他算法。

我一般使用O()表示法只是为了避免任何进一步的混淆,所以如果我错了,请耐心等待。