使用数组对来合并有序列表的制作方法_2

文档序号:9510123阅读:来源:国知局
在合并有序列表的末尾,并且被腾空的空间用来自相应有序列表的下一元素来填充。由此,在第一排序阶段后,排序状态如下:
[0044]有序列表A:3,4,9
[0045]有序列表B:8
[0046]有序列表C:4,7
[0047]优先级队列:2,5,2
[0048]合并有序列表:1
[0049]注意,原来在有序列表A中的整数1已经从优先级队列中移除并作为合并有序列表中的首元素。为了再填充优先级队列,有序列表A中的下一元素(整数2)已经从有序列表A中移除,并且被放置在优先级队列的被腾空的左侧点。
[0050]每一排序阶段以该相同过程继续。由此,在下一排序阶段后,排序状态如下:
[0051]有序列表A:4,9
[0052]有序列表B:8
[0053]有序列表C:4,7
[0054]优先级队列:3,5,2
[0055]合并有序列表:1,2
[0056]注意,原来在有序列表A中的整数2已经从优先级队列中移除并作为合并有序列表中的尾元素。为了再填充优先级队列,有序列表A中的下一元素(整数3)已经从有序列表A中移除,并且被放置在优先级队列的被腾空的左侧点。在第二排序阶段之前在优先级队列中曾存在值为2的两个整数元素。值为2的任一整数元素已经根据该方法来选择。
[0057]继续,在第三排序阶段后,排序状态如下:
[0058]有序列表A:4,9
[0059]有序列表B:8
[0060]有序列表C:7
[0061]优先级队列:3,5,4
[0062]合并有序列表:1,2,2
[0063]整数2已经从右侧点(对应于有序列表C)移动并作为合并有序列表的新尾元素。此外,有序列表C中的新值(整数4)已被移至被腾空的右侧点。
[0064]在第四排序阶段后,排序状态如下:
[0065]有序列表A:9
[0066]有序列表B:8
[0067]有序列表C:7
[0068]优先级队列:4,5,4
[0069]合并有序列表:1,2,2,3
[0070]整数3已经从左侧点(对应于有序列表A)移动并作为合并有序列表的新尾元素。此外,有序列表A中的下一值(整数4)已被移至被腾空的右侧点。
[0071]在第五排序阶段后,排序状态如下:
[0072]有序列表A:*
[0073]有序列表B:8
[0074]有序列表C:7
[0075]优先级队列:9,5,4
[0076]合并有序列表:1,2,2,3,4
[0077]整数4已经从左侧点(对应于有序列表A)移动并作为合并有序列表的新尾元素。此外,有序列表A中的下一值(整数4)已被移至被腾空的右侧点。如由星号表示的,这将有序列表A留空。
[0078]在第六排序阶段后,排序状态如下:
[0079]有序列表A:*
[0080]有序列表B:8
[0081]有序列表C:*
[0082]优先级队列:9,5,7
[0083]合并有序列表:1,2,2,3,4,4
[0084]整数4已经从右侧点(对应于有序列表C)移动并作为合并有序列表的新尾元素。此外,有序列表C中的下一值(整数7)已被移至被腾空的右侧点。如由星号表不的,这也将有序列表C留空。
[0085]在第七排序阶段后,排序状态如下:
[0086]有序列表A:*
[0087]有序列表B:*
[0088]有序列表C:*
[0089]优先级队列:9,8,7
[0090]合并有序列表:1,2,2,3,4,4,5
[0091]整数5已经从中心点(对应于有序列表B)移动并作为合并有序列表的新尾元素。此外,有序列表B中的下一值(整数8)已被移至被腾空的右侧点。如由星号表示的,这也将有序列表B留空。当所有输入有序列表现在都为空时,输入有序列表将不在该方法的其余阶段中示出。
[0092]在第八排序阶段后,排序状态如下:
[0093]优先级队列:9,8,*
[0094]合并有序列表:1,2,2,3,4,4,5,7
[0095]整数7已经从右侧点(对应于有序列表C)移动并作为合并有序列表的新尾元素。当有序列表C中不再有元素时,优先级队列的右侧点保持为空,如由星号表示的。
[0096]在第九排序阶段后,排序状态如下:
[0097]优先级队列:9,*,*
[0098]合并有序列表:1,2,2,3,4,4,5,7,8
[0099]整数8已经从中心点(对应于有序列表B)移动并作为合并有序列表的新尾元素。当有序列表B内不再有元素时,优先级队列的中心点保持为空,如由星号表示的。
[0100]在第十排序阶段后,排序状态如下:
[0101]优先级队列:*,*,*
[0102]合并有序列表:1,2,2,3,4,4,5,7,8,9
[0103]整数9已经从中心点(对应于有序列表A)移动并作为合并有序列表的新尾元素。这将优先级队列留空,并且还完成合并有序列表。
[0104]该优先级队列方法的确合并有序列表,但在计算系统上执行不是高效的。根据本文描述的原理,输入有序列表的合并以由现代处理器更高效地执行的方式来执行。具体而言,排序使用一对数组并且大部分使用顺序读取和写入操作来执行。此外,排序通过多个核和并行实现来帮助更高效的处理。例如,排序可以跨并行或不同核或跨多个机器来执行。
[0105]返回到方法200和特定示例,回想在该示例中在访问输入有序列表(动作201)后,排序状态如下:
[0106]有序列表A:1,2,3,4,9
[0107]有序列表B:5,8
[0108]有序列表C:2,4,7
[0109]然后可任选地以递增大小的次序排列输入有序列表(动作202)。输入有序列表A到C可能表示将被合并的所有输入有序列表。然而,在一个实现中,这些有序列表可只表示将被合并的输入有序列表的子集。将输入有序列表处理为子集可具有减少合并操作所涉及的写入次数的优点。
[0110]例如,考虑存在将被排序的六个有序列表(a、b、c、d、e和f)的情况。假设输入有序列表a具有5个元素,输入有序列表b具有6个元素,而输入有序列表c到f各自具有7个元素。在以下描述的方法中,合并输入有序列表a和b(以形成有序列表ab)将涉及11次写入,组合的有序列表中的每一元素一次写入。合并输入有序列表ab和输入有序列表c将导致18次写入(因为输入有序列表ab中存在11个元素且输入有序列表c中存在7个元素)以生成有序列表abc。合并输入有序列表abc和输入有序列表d将导致25次写入(因为输入有序列表abc中存在18个元素且输入有序列表d中存在7个元素)以生成有序列表abed。合并输入有序列表abed和输入有序列表e将导致32次写入(因为输入有序列表abed中存在25个元素且输入有序列表e中存在7个元素)以生成有序列表abede。合并输入有序列表abede和输入有序列表f将导致39次写入(因为输入有序列表abede中存在32个元素且输入有序列表f中存在7个元素)以生成有序列表abeddf。因此,使用该技术,将存在总共125次写入(11+18+25+32+39)。
[0111]然而,减少次数的写入可能通过首先将输入有序列表分成各个子集来实现。例如,再次假设输入有序列表a使用与上文相同的11次写入来与输入有序列表b合并以生成合并有序列表ab。然而,输入有序列表c可能使用14次写入(因为输入有序列表c和d各自具有7个元素)来与输入有序列表d合并以生成合并有序列表cd。输入有序列表e可能使用14次写入(因为输入有序列表e和f各自具有7个元素)来与输入有序列表f合并以生成合并有序列表ef。这将允许某种并行性,因为合并有序列表ab、cd和ef能够并行地形成。输入有序列表ab然后可以使用25次写入(因为输入有序列表ab具有11个元素且输入有序列表cd具有14个元素)来与输入有序列表cd组合以生成合并列表abed。输入有序列表abed然后可以使用39次写入(因为输入有序列表abed具有25个元素且输入有序列表ef具有14个元素)来与输入有序列表ef组合以生成合并列表abedef。因此,使用该输入有序列表子集化,将存在总共103次写入(11+14+14+25+39)。此外,以此方式的子集化允许进行某种并行处理。
[0112]在本文的其中讨论输入有序列表A、B和C的示例中,这些输入有序列表可表示输入有序列表的整个集合或者可以只表示输入有序列表的子集。在后一种情况下,所述技术然后使用相同的技术来对输出合并有序列表进行操作作为新输入有序列表。
[0113]在任一种情况下,只参考输入有序列表A、B和C,有序列表B最小并由此将按顺序被首先排列。有序列表C是次最小的并由此将按顺序被接下来排列。有序列表A最大并由此将按顺序在最后。动作202是用于减少数组对中的两个数组之间的复制操作次数的可任选优化。
[0114]然后用输入有序列表来连续填充该对中的第一数组(动作203)。结果将如下:
[0115]第一数组:5,8,2,4,7,1,2,3,4,9
[0116]然后使用第一数组和第二数组来合并多个输入有序列表(动作204),该合并分多个阶段进行。例如,图4A示出了第一排序阶段开始时的排序状态,其中有序列表B、C和A被连续放置在第一数组401内。第二数组402具有与第一数组401相同的大小,但为空。例如,如果方法200由图1的计算系统100来执行,则方法第一数组401和第二数组402可位于计算机可读介质104的存储器中。
[0117]在第一阶段中,第一数组中的前两个有序列表被形成为位于第二数组中的第一中间合并有序列表。在第二阶段中,第一中间合并有序列表与第一数组中的第三有序列表合并以形成第一数组中的第二中间有序列表。然而,如果只有两个有序列表要合并,则将不存在这样的第二阶段。注意,当前中间合并有序列表的位置在各个数组之间交替。由此,对于奇数阶段,所得中间合并有序列表位于一个数组中,而对于偶数阶段,所得中间合并有序列表位于另一数组中。更一般而言,第一阶段后的每一阶段将从先前阶段产生的先前中间合并有序列表合并到下一输入有序列表以生成下一中间合并有序列表(或者在不再有要处理的输入有序列表的情况下生成最终合并有序列表)。
[0118]图3示出了用于处理图2的动作204的排序操作的每一排序阶段的方法300的流程图。在第一数组中的第一输入有序列表的第一元素(在第一排序阶段的情况下)或者在先前中间合并有序列表的第一元素(在后续排序阶段的情况下)建立第一输入光标(动作301)。例如,图4A示出了第一排序阶段开始时的排序状态,其中存在位于输入排序列表B的第一元素处的第一输入光标411,该输入排序列表B是被连续放置在第一数组401中的第一个输入排序列表。第一数组401和第二数组402是存储器位置。
[0119]在第一数组中的尚未被处理的下一有序列表中的第一元素处建立第二输入光标(动作302)。在第一阶段的情况下,这将会是连续有序列表中的第二输入有序列表。在其中序列包括有序列表B、C和A(以该次序连续放置)的图4A的情况下,光标412位于输入有序列表C的第一元素处。为了方便起见,第三输入光标413也被示为位于第一数组中的最后输入有序列表(有序列表A)的第一元素处。
[0120]在第二数组的开头处(在排序阶段是第一排序阶段的情况下)或者在与包含先前中间合并有序列表的数组相对
当前第2页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1