用 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的主要内容,如果未能解决你的问题,请参考以下文章