Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 使用1 MB空间排序1000万个整数解决方案说明-编程珍珠_Sorting_Programming Pearls - Fatal编程技术网

Sorting 使用1 MB空间排序1000万个整数解决方案说明-编程珍珠

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

我在读《编程珍珠》,我对其中一个解决方案的解释感到困惑

问题是: 一个最多包含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字节来存储计数,对吗

有人能帮我理解吗

非常感谢

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字节的内存来对数组进行排序?从计数器可以重建排序后的元素,为什么还需要额外的内存?啊,明白了。所以我们可以在一个字节中存储两个元素的计数,然后用它来重建它。谢谢你的解释。