C:有效地循环大阵列

时间:2012-10-15 12:38:15

标签: c

我有一个主列表整数数组,它有大约500个数字。并且,我有一组100个随机数,它从主列表中选择以找到缺失的数字。现在,我需要针对主列表查看这个随机数字列表。 C编程中最好的方法是在不挂起程序的情况下完成它。如果我通过简单的'for'循环遍历500个元素,它将挂起,因为它需要遍历整个列表。有人可以指导我吗?

感谢。

2 个答案:

答案 0 :(得分:3)

首先,您应该对其进行分析。我们谈论的最多只有500 * 100 = 50,000次操作。一台普通的现代计算机能够在十分之一秒内完成它,除非你的编码非常低效。

假设你想要优化它,你应该对主数组进行排序,并为随机数组的每个元素运行binary search。这样可以将操作次数从50,000次减少到最多900次,因为500次数的二进制搜索最多需要9次比较。

以下是使用标准C库的内置排序和二进制搜索功能(qsortbsearch)的实现:

int less_int(const void* left, const void* right) {
    return *((const int*)left) - *((const int*)right);
}

int main(void) {
    size_t num_elements = 500;
    int* a = malloc(num_elements*sizeof(int));
    for(size_t i=0 ; i<num_elements ; i++) {
        a[i] = rand() % num_elements;
    }
    qsort(a, num_elements, sizeof(int), less_int);
    size_t num_rand = 100;
    int* r = malloc(num_rand*sizeof(int));
    for(size_t i=0 ; i < num_rand ; i++) {
        r[i] = rand() % num_rand;
    }

    for (size_t i = 0 ; i != num_rand ; i++) {
        int *p = (int*) bsearch (&r[i], a, num_elements, sizeof(int), less_int);
        if (p) {
            printf ("%d is in the array.\n", *p);
        } else {
            printf ("%d is not in the array.\n", r[i]);
        }
    }

    free(a);
    free(r);
    return 0;
}

这是link to this running program on ideone

答案 1 :(得分:1)

n - 随机数组长度。

m - Masterlist数组长度。

  1. 对随机化的文件进行排序。的的n * log(n)的
  2. 在排序数组中对主列表中的每个元素进行二进制搜索。因此,你将拥有所有缺失的元素。的(M)*的log(n)
  3. =&GT;整个操作的(m + n)* log(n) n = 100 m = 500 我们

    600 * log(100)登录到基地2

    与使用原始编码的50000次迭代相比,大约3986次迭代。

    PS:如果两个数组都已排序,只需比较O(m)就足够了。