C帮助练习

时间:2018-01-23 12:07:57

标签: c arrays algorithm shared-libraries

“编写一个算法,给定两个大小为N的有序向量,以有序的方式打印出两个向量上出现的所有元素。在最坏的情况下,程序的执行时间必须与N成正比。” / p>

在本练习中,我将循环检查每个数组a []然后使用二进制搜索算法检查de array b []并比较它是否等于[]上的数组

但我不知道在最坏的情况下是否与N成正比。

int main() {
    int a[6] = {2, 8, 15, 31, 46, 75};
    int b[6] = {1, 8, 17, 21, 31, 75};
    int i, tam = 6, key, res, c[6], k=0;

    for (i = 0; i < tam; i++) {
        key = a[i];
        res = binary_search(b, tam, key);
        if (res != -1) {
            c[k]=a[i];
            k++;
        }
    }

    return 0;
}

int binary_search(int a[], int n, int key) {
    int low = 0, high = n - 1;

    while (low <= high) {
        int mid = (low + high) / 2;

        if (key < a[mid])high = mid - 1;
        else if (key > a[mid]) low = mid + 1;
        else return mid;
    }
    return -1;
}

3 个答案:

答案 0 :(得分:0)

  

但我不知道在最坏的情况下是否与N成正比。

不是。通过有序列表的二进制搜索是O(log n)。如果必须对其中一个数组中的所有元素执行此操作,则需要查看O(n log n)。

当您尝试在O(n)时间内解决问题且当前解决方案为O(n log n)时,解决方案中采用O(log n)的部分可能就是问题。

答案 1 :(得分:0)

我做了一个新代码:

int main() {
    int a[6] = {2, 8, 15, 31, 46, 75};
    int b[6] = {1, 8, 17, 21, 31, 75};
    int i=0, j=0, N = 6, c[6], k = 0;

    while (i < N && j < N) {
        if (a[i] < b[j]) {
            i++;
        } else if (a[i] > b[j]) {
            j++;
        } else {
            c[k] = a[i];
            k++;
            i++;
            j++;
        }
    }

    return 0;
}

我认为这个服从O(n)的最坏情况。 但我仍然要感谢你们的帮助!!

答案 2 :(得分:0)

#include <stdio.h> 

#define N 6

int main(void) {
    int a[N] = {2, 8, 15, 31, 46, 75};
    int b[N] = {1, 8, 17, 21, 31, 75};
    int i = 0, int j = 0, int n = 0;

    while (j + i < (N + N))
    {
        n = (b[j] - a[i]) & 0x80000000        // non null if b < a, else n = 0
        printf("%d\n", n ? b[j++] : a[i++]);  // access i if n=0 else if n=1 access j
        while (j == N && i != N)
            printf("%d\n", a[i++]);
        while (i == N && j != N)
            printf("%d\n", b[j++]);

    }
    return 0;
}