用 1 MB 空间对 1000 万个整数进行排序解决方案解释 - Programming Pearls

Posted

技术标签:

【中文标题】用 1 MB 空间对 1000 万个整数进行排序解决方案解释 - Programming Pearls【英文标题】:Sorting 10 million integers with 1 MB space Solution explanation - Programming Pearls 【发布时间】:2011-11-05 09:17:08 【问题描述】:

我正在阅读“编程珍珠”,我对其中一个解决方案解释感到非常困惑。

问题是: “一个文件最多包含 n 个正整数,每个小于 n,其中 n = 10^7。每个正整数最多出现十次。您将如何对文件进行排序?”

书中给出的解决方案: " 如果每个整数最多出现 10 次,那么我们可以在一个 4 位半字节中计算它的出现次数。使用问题 5(如下)的解决方案,我们可以一次通过 10,000,000/2 个字节对整个文件进行排序,或者在 k 次通过 10,000,000/2k 字节”

问题 5 的解决方案是:两遍算法首先使用 5,000,000/8 = 625,000 个字的存储空间对 0 到 4,999,999 的整数进行排序,然后在第二遍中对 5,000,000 到 9,999,999 进行排序。一个 k-pass 算法在时间 kn 和空间 n/k 上最多排序 n 个小于 n 的非重复正整数。)

我不知道作者是如何到达 10,000,000/2k 空间进行排序的。我的意思是,基于问题 5 的解决方案,首先我们需要 625K 字节的空间来进行第一遍排序,并且每个整数需要额外的 1/2 字节来存储计数,对吗?

有人可以帮我理解一下吗?

非常感谢。

【问题讨论】:

【参考方案1】:
Each positive integer could appear at most ten times.

您可以为此使用每个计数器 4 位,而不是 2 个字节。如果您将计数器分组,您甚至可以降低此值,例如,如果您将 3 个计数器分组,即 10*10*10=1000 个组合,您需要 10 位(=1024 个值)。

【讨论】:

是的,对不起,我不小心写了 2 而不是 1/2 字节。我会解决的。【参考方案2】:

10,000,000 - 因为有 10,000,000 个可能的值。

2 - 因为每个字节由两个半字节组成。

【讨论】:

感谢彼得的回复。我明白那部分。我感到困惑的是,除了存储每个 int 的计数需要 10,000,000/2 字节之外,我们是否还需要 10,000,000/8 字节的内存来对数组进行排序? 从计数器中您可以重建已排序的元素,为什么需要额外的内存? 啊,明白了。所以我们可以只将 2 个元素计数存储在 1 个字节中,然后用它来重建它。谢谢yi_H的解释。

以上是关于用 1 MB 空间对 1000 万个整数进行排序解决方案解释 - Programming Pearls的主要内容,如果未能解决你的问题,请参考以下文章

编程珠玑第一章习题6.1000个整数排序

华科机考:大整数排序

具有堆分配的大型数组的分段错误

对大型数组进行排序时出现快速排序错误

Wannafly挑战赛4 A.解方程 (二分)

一百万个结构数组,根据其中一项值排序,用双链表还是数组排序效率更好