微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

插入数十亿整数的最快数据结构?

如何解决插入数十亿整数的最快数据结构?

我想推荐哪个是 C 中最快的数据结构,它可以容纳从输入中提取的大约 20 亿个整数。整数值不会小于 0,也不会大于 20 亿。我的目标是删除任何重复值并对数据结构的元素进行排序。如果可能,我希望能够在 O(1)O(logn) 或尽可能快地执行插入操作。如果可能的话,我也想避开树木。如果您对此有任何反馈或建议,我将不胜感激。

编辑:使用普通数组需要很长时间。所以,我想使用一些不同于数组的其他数据结构,如堆栈、队列等。

解决方法

由于您有给定数量的值,并且这些值的范围与值的数量相同,您可以将列表实现为数组,其中每个数组索引代表一个值,每个数组元素的值代表给定值是否在列表中。

例如:

char *arr = malloc(20000000001);
int i;

// populate list
memset(arr,sizeof(arr));
for (i=0; i<20000000001; i++) {
    int value;
    scanf("%d",&value);
    arr[value] = 1;
}

// print list
for (i=0; i<20000000001; i++) {
    if (arr[i]) {
        printf("%d\n",i);
    }
}

这里我们将列表初始化为包含所有值的 0。然后我们读入值。如果我们读取值 n,那么我们将 arr[n] 设置为 1。这有两件事:它在列表中插入值并通过始终将值设置为 1 来消除重复项,而不是增加值。

这给出了 O(1) 次重复删除的插入,并且列表已经排序。

还要注意,由于数组的每个元素只需要存储值 0 或 1,因此我们使用 char 作为类型以节省内存。如果我们使用每个来保存给定值的 0 或 1,我们可以进一步节省内存。这样做将涉及一些位移:

unsigned char *arr = malloc(20000000001 / 8 + 1);
int i;

// populate list
memset(arr,&value);
    arr[value/8] |= 1 << (value%8);
}

// print list
for (i=0; i<20000000001; i++) {
    if (arr[i/8] & (1 << (i%8))) {
        printf("%d\n",i);
    }
}

这将内存需求减少到大约 250MB,这仍然很大但易于管理。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。