【发布时间】:2013-05-30 21:45:34
【问题描述】:
我查看了关于 SO 和其他地方的各种类似问题,但我觉得有些特殊情况可能需要提出新问题。
这是问题:
我有一个整数数组,其中可以包含多达十亿个整数。这些数字将在 1 到 10 亿之间,但可能存在缺失值。所以每个值 32 位就足够了。我唯一想做的就是确保没有重复。当我发现第一次出现重复时,我大惊小怪并退出。这将在许多文件上完成,并且很少期望这些文件有重复。所以一般情况也经常是最坏的情况。
我知道如何在 shell 中很容易地做到这一点(在文本文件中,我将从以下位置读取整数:sort | uniq 等),这大约需要 13 秒。因此,希望纯 C 智能算法会做得更好。我的想法是我在数组上使用快速(希望很容易获得)排序并迭代每个连续对的计算差异。找到零的那一刻,我停下来退出。
这是一个玩具示例:
1001
1002
1003
1004
1005
1003
...
我首先对数组进行排序并得到: 1001 1002 1003 1003 1004 1005 ...
然后当我看到 line3 - line4 == 0 时,我停在第四行。
如果一切顺利,我会以退出代码 0 静默退出。
这些是我的要求/限制: 1) 我是 C 语言的初学者(我的代码只有 100 行)。 2) 我会非常喜欢纯 C 解决方案来学习。标准库没问题。 3) 如果 C++ 解决方案在减少编程时间方面非常出色,那么也请提出建议。
非常感谢。
【问题讨论】:
-
这里的问题到底是什么?你熟悉吗?
qsort()? -
整数的最大范围是多少,即你需要多少位来唯一地表示一个?
-
您可以通过散列快速完成此操作,时间为 O(N)。假设您的值是合理/可预测的范围。 EX:适合 int 数据类型的东西。
-
这里不需要任何排序。如果位图适合数据范围和计数,则使用位图要简单得多。
-
另外,“如果 C++ 更高效……”。谢谢你的笑声。
标签: c sorting optimization duplicates