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 为什么双向合并排序比单向合并排序更有效_Sorting_Merge_External Sorting - Fatal编程技术网

Sorting 为什么双向合并排序比单向合并排序更有效

Sorting 为什么双向合并排序比单向合并排序更有效,sorting,merge,external-sorting,Sorting,Merge,External Sorting,我正在阅读来自的外部排序,需要理解为什么2阶段合并比1阶段合并更有效 Wiki:但是,单通道合并有一个限制。作为 块的数量增加,我们将内存分成更多的缓冲区,所以 每个缓冲区都较小,因此我们必须进行许多较小的读取 比大的要少 因此,对于排序,例如,在100MB的RAM中使用单个合并进行50GB的排序 pass无效:磁盘需要填充输入 缓冲区包含来自500个块中的每个块的数据(我们读取100MB/501~ 每次从每个数据块读取200KB)占用大部分排序时间。使用 两个合并过程解决了这个问题。然后排序过

我正在阅读来自的外部排序,需要理解为什么2阶段合并比1阶段合并更有效

Wiki:但是,单通道合并有一个限制。作为 块的数量增加,我们将内存分成更多的缓冲区,所以 每个缓冲区都较小,因此我们必须进行许多较小的读取 比大的要少

因此,对于排序,例如,在100MB的RAM中使用单个合并进行50GB的排序 pass无效:磁盘需要填充输入 缓冲区包含来自500个块中的每个块的数据(我们读取100MB/501~ 每次从每个数据块读取200KB)占用大部分排序时间。使用 两个合并过程解决了这个问题。然后排序过程可能会失败 像这样:


谁能给我一个简单的例子来理解这个概念好吗。我对在2阶段合并中分配更多的
缓冲区感到特别困惑

问题是随机访问开销,平均旋转延迟约为4毫秒,平均寻道时间约为9毫秒,因此,假设平均访问时间为10毫秒,而平均传输速率约为每秒150兆字节。因此,平均访问开销与读取或写入1.5兆字节所需的时间大致相同

大型I/O减少了访问时间的相对开销。如果一次读取或写入10兆字节的数据,开销将减少到15%。使用wiki示例100MB的工作缓冲区和25个要合并的块,再加上一个写块,即3.8MB的块,在这种情况下,随机访问开销约为39%

在大多数PC机上,可以为1GB的工作缓冲区分配足够的内存,因此可以以超过40兆字节的速度分配26个块,从而将随机访问开销减少到3.75%。50个区块大约为每个区块20兆字节,随机访问开销约为7.5%

请注意,即使有50个块,它仍然是两次传递排序,第一次传递使用所有1gb缓冲区进行内存排序,然后写入已排序的1gb块。第二步将合并所有50个块,从而生成已排序的文件

50个块的另一个问题是,需要一个min heap type方法来维护排序信息,以便确定哪个块的哪个元素是50个块中最小的,并移动到输出缓冲区。将一个元素移动到输出缓冲区后,将一个新元素移动到堆中,然后重新堆化堆,这需要大约2个log2(50)操作,或大约12个操作。这比在进行50路合并时进行49次比较以确定50个元素组中的最小元素的简单方法要好。堆由结构、当前元素、这是哪个块(文件位置或文件)、块中剩余的元素数等组成

Run the initial chunk-sorting pass as before.
Run a first merge pass combining 25 chunks at a time, resulting in 20 larger sorted chunks.
Run a second merge pass to merge the 20 larger sorted chunks.