Sorting 使用1 MB空间排序1000万个整数解决方案说明-编程珍珠
我在读《编程珍珠》,我对其中一个解决方案的解释感到困惑 问题是: 一个最多包含n个正整数的文件,每个正整数都小于n,其中n=10^7。每个正整数最多可以出现10次。如何对该文件进行排序 书中给出的解决方案: 如果每个整数最多出现十次,那么我们可以用四位半字节来计算它的出现次数。使用问题5(下面)的解决方案,我们可以用10000000/2字节在一次传递中对完整文件进行排序,或用10000000/2k字节在k次传递中对完整文件进行排序 问题5的解决方案是:两遍算法首先使用5000000/8=625000个字的存储对整数0到499999进行排序,然后在第二遍中对5000000到999999进行排序。k-pass算法在时间kn和空间n/k上最多排序n个小于n的非重复正整数。) 我不明白作者是如何来到10000000/2k空间进行排序的。我的意思是,根据问题5的解决方案,首先我们需要625K字节的空间在第一次传递中进行排序,每个整数需要额外的1/2字节来存储计数,对吗 有人能帮我理解吗 非常感谢Sorting 使用1 MB空间排序1000万个整数解决方案说明-编程珍珠,sorting,programming-pearls,Sorting,Programming Pearls,我在读《编程珍珠》,我对其中一个解决方案的解释感到困惑 问题是: 一个最多包含n个正整数的文件,每个正整数都小于n,其中n=10^7。每个正整数最多可以出现10次。如何对该文件进行排序 书中给出的解决方案: 如果每个整数最多出现十次,那么我们可以用四位半字节来计算它的出现次数。使用问题5(下面)的解决方案,我们可以用10000000/2字节在一次传递中对完整文件进行排序,或用10000000/2k字节在k次传递中对完整文件进行排序 问题5的解决方案是:两遍算法首先使用5000000/8=6250
Each positive integer could appear at most ten times.
您可以为每个计数器使用4位,而不是2个字节。如果对计数器进行分组,甚至可以降低此值,例如,如果对3个计数器进行分组,则10*10*10=1000个组合,需要10位(=1024个值)。10000000-因为可能有10000000个值
2-因为每个字节由两个半字节组成。是的,对不起,我不小心写了2而不是1/2字节。我会解决的。谢谢你的回复,彼得。我明白了。我感到困惑的是,除了10000000/2字节用于存储每个int的计数之外,我们是否还需要10000000/8字节的内存来对数组进行排序?从计数器可以重建排序后的元素,为什么还需要额外的内存?啊,明白了。所以我们可以在一个字节中存储两个元素的计数,然后用它来重建它。谢谢你的解释。