CN105264488B - 用于使用数组对来合并有序列表的方法和系统 - Google Patents
用于使用数组对来合并有序列表的方法和系统 Download PDFInfo
- Publication number
- CN105264488B CN105264488B CN201480027746.XA CN201480027746A CN105264488B CN 105264488 B CN105264488 B CN 105264488B CN 201480027746 A CN201480027746 A CN 201480027746A CN 105264488 B CN105264488 B CN 105264488B
- Authority
- CN
- China
- Prior art keywords
- ordered list
- action
- input
- ordered
- array
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2237—Vectors, bitmaps or matrices
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/21—Design, administration or maintenance of databases
- G06F16/217—Database tuning
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F7/00—Methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F7/22—Arrangements for sorting or merging computer data on continuous record carriers, e.g. tape, drum, disc
- G06F7/32—Merging, i.e. combining data contained in ordered sequence on at least two record carriers to produce a single carrier or set of carriers having all the original data in the ordered sequence merging methods in general
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2207/00—Indexing scheme relating to methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F2207/22—Indexing scheme relating to groups G06F7/22 - G06F7/36
- G06F2207/224—External sorting
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Advance Control (AREA)
Abstract
使用数组对来分多个阶段从多个输入有序列表制定合并有序列表。最初,用输入有序列表来连续填充第一数组。在第一阶段中,将第一和第二输入有序列表合并成第二数组中的第一中间合并列表。每一后续阶段合并从先前阶段产生的先前中间合并列表和第一数组中的下一输入有序列表,以生成下一中间合并列表或者合并有序列表(如果第一数组中不再有输入)。中间合并列表从一个阶段到下一阶段在第一数组和第二数组之间交替。
Description
技术领域
本申请涉及有序列表,尤其涉及使用数组对来合并有序列表。
背景技术
列表是元素序列。有序列表是根据特定排序优先级(诸如字母顺序、递增值等)来排序的列表。有序列表保证对于每一对连续元素,先前元素满足相对于后续元素的特定排序优先级。例如,假设列表包括整数序列,并且排序优先级是递增值排序优先级。在这种情况下,如果对于序列中的每一对连续整数,后续整数等于或大于先前整数,则整数列表将根据递增值来排序。每一有序列表包括首元素,该首元素是排序优先级中的最高优先级,并由此是有序列表中的第一元素。每一有序列表还包括尾元素,该尾元素是排序优先级中的最低优先级,并由此是有序列表中的最后元素。
存在数十年前开发的用于将输入有序列表合并成根据与输入有序列表相同的排序优先级来排序的合并有序列表的特定方法(在此被称为“优先级排队方法”)。该优先级排队方法使用优先级队列来制定合并列表,并且涉及排序操作的多个阶段。在第一阶段中,来自所有输入有序列表的每一首元素被放置在优先级队列中,并由此优先级队列中的每一空间都对应于输入有序列表。在每一排序阶段中,通过将优先级队列内的最高优先级元素移至合并有序列表的末尾作为该合并有序列表的新尾元素来将合并有序列表扩展一个元素。来自输入有序列表的与通过该移动腾空的空间相对应的未经处理的最高优先级元素然后通过将该元素复制到被腾空空间中来处理,由此完成排序阶段。
发明内容
根据本文描述的至少一个实施例,使用数组对来分多个阶段从多个输入有序列表中制定合并有序列表。最初,用输入有序列表来连续填充第一数组。在第一阶段中,将第一和第二输入有序列表合并成第二数组中的第一中间合并列表。每一后续阶段合并从先前阶段产生的先前中间合并列表和第一数组中的下一输入有序列表,以生成下一中间合并列表或者最终合并有序列表(如果第一数组中不再有输入)。中间合并列表从一个阶段到下一阶段在第一数组和第二数组之间交替。
在一些实施例中,合并技术对于在顺序读取和写入操作方面是更高效的现代微处理器可以是特别高效的,因为合并可通过数组对在顺序操作中执行。该概述不旨在标识所要求保护的主题的关键特征或基本特征,也不旨在被用来帮助确定所要求保护的主题的范围。
附图说明
为了描述能够获得上述和其它优点和特征的方式,各实施例的更具体的描述将通过参考各附图来呈现。可以理解,这些附图只描绘了示例实施例,并且因此不被认为是对其范围的限制,将通过使用附图并利用附加特征和细节来描述和解释各实施例,在附图中:
图1抽象地示出其中可采用本文描述的一些实施例的计算系统;
图2示出根据本文描述的原理的用于制定合并有序列表的方法的流程图;
图3示出了用于处理图2的排序操作的每一排序阶段的方法的流程图;
图4A到4E示出了与一示例的第一排序阶段相关联的五个顺序排序状态操作,其中第一输入有序列表和第二输入有序列表被组合成第一中间合并有序列表;
图5A到5J示出了与该示例的第二排序阶段相关联的十个顺序排序状态操作,其中第一中间合并有序列表与第三输入有序列表合并以形成第二中间(并且可能是最终)合并有序列表;
图6示出了用于访问输入有序列表的方法的流程图;以及
图7示出了用于处理元素以形成有序列表的更一般化的方法的流程图。
具体实施方式
根据本文描述的实施例,描述了合并有序列表的制定。该制定使用多个输入有序列表并且使用数组对来分多个阶段进行。最初,用输入有序列表来连续填充第一数组。在第一阶段中,将第一和第二输入有序列表合并成第二数组中的第一中间合并列表。每一后续阶段合并从先前阶段产生的先前中间合并列表和第一数组中的下一输入有序列表,以生成下一中间合并列表或者合并有序列表(如果第一数组中不再有输入)。中间合并列表从一个阶段到下一阶段在第一数组和第二数组之间交替。
将参考图1来描述对计算系统的一些介绍性讨论。然后,将参考图2至7来描述有序列表合并的原理。
计算系统现在越来越多地采取多种多样的形式。例如,计算系统可以是手持式设备、电器、膝上型计算机、台式计算机、大型机、分布式计算系统或甚至常规上不被认为是计算系统的设备。在本说明书以及权利要求书中,术语“计算系统”被广义地定义为包括任何设备或系统(或其组合),该设备或系统包含至少一个物理有形的处理器以及其上能具有可由处理器执行的计算机可执行指令的物理有形的存储器。存储器可以采取任何形式,并可以取决于计算系统的性质和形式。计算系统可以分布在网络环境中,并可包括多个组分计算系统。
如图1所示,在其最基本的配置中,计算系统100包括至少一个处理单元102和计算机可读介质104。计算机可读介质104在概念上可被认为包括物理系统存储器,其可以是易失性的、非易失性的或这两者的某种组合。计算机可读介质104在概念上还包括非易失性大容量存储。如果计算系统是分布式的,则处理、存储器和/或存储能力也可以是分布式的。
如本文中所使用的,术语“可执行模块”或“可执行组件”可以指可以在计算系统上执行的软件对象、例程或方法。此处所描述的不同组件、模块、引擎以及服务可以实现为在计算系统上执行的对象或进程(例如,作为分开的线程)。在其中实施类型安全性并且其中各进程被分配了它们自己的不同存储器对象的受管环境中执行的情况下,这样的可执行模块可以是受管代码。在可执行模块用本机代码(如C或C++)编写的情况下,这样的可执行模块还可以是非受管代码。
在随后的描述中,参考由一个或多个计算系统执行的动作描述了各实施例。如果这样的动作是以软件实现的,则执行动作的相关联计算系统的一个或多个处理器响应于已经执行了计算机可执行指令来引导计算系统的操作。例如,这样的计算机可执行指令可以在形成计算机程序产品的一个或多个计算机可读介质上实现。这样的操作的示例涉及对数据的操纵。计算机可执行指令(以及被操纵的数据)可以存储在计算系统100的存储器104中。计算系统100还可包含允许计算系统100例如通过网络110与其他处理器通信的通信信道108。
本文中描述的各实施例可包括或利用专用或通用计算机,该专用或通用计算机包括诸如例如一个或多个处理器和系统存储器等计算机硬件,如以下更详细讨论的本文中描述的各实施例还包括用于承载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是可由通用或专用计算机系统访问的任何可用介质。存储计算机可执行指令的计算机可读介质是物理存储介质。承载计算机可执行指令的计算机可读介质是传输介质。由此,作为示例而非限制,本发明的各实施例可包括至少两种显著不同的计算机可读介质:计算机存储介质和传输介质。
计算机存储介质包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备,或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的任何其他有形存储介质。
“网络”被定义为使得电子数据能够在计算机系统和/或模块和/或其它电子设备之间传输的一个或多个数据链路。当信息通过网络或另一个通信连接(硬连线、无线、或者硬连线或无线的组合)传输或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可以包括可以用来携带所需要的以计算机可执行的指令或数据结构的形式存在的程序代码装置并可以被通用或专用计算机访问的网络和/或数据链路。上述的组合应当也被包括在计算机可读介质的范围内。
此外,在到达各种计算机系统组件之后,计算机可执行指令或数据结构形式的程序代码资料可从传输介质自动传输到计算机存储介质(或反之亦然)。例如,通过网络或数据链路接收到的计算机可执行指令或数据结构可被缓存在网络接口控制器(例如,“NIC”)内的RAM中,然后最终被传输到计算机系统RAM和/或计算机系统处的较不易失性的计算机存储介质。因而,应当理解,计算机存储介质可被包括在还利用(或甚至主要利用)传输介质的计算机系统组件中。
计算机可执行指令例如包括,当在处理器处执行时使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令可以是例如二进制代码、诸如汇编语言之类的中间格式指令、或甚至源代码。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述特征或动作。相反,上述特征和动作是作为实现权利要求的示例形式而公开的。
本领域的技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实践,这些计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等等。本发明也可在其中通过网络链接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统两者都执行任务的分布式系统环境中实施。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备二者中。
图2示出根据本文描述的原理的用于制定合并有序列表的方法200的流程图。方法200以及本文描述的任何其他方法可由诸如图1的计算系统100等计算系统来执行。具体而言,如果用软件实现,则处理器102执行存在于构成计算机程序产品的全部或部分的计算机可读介质(诸如计算机可读存储介质)上的计算机可执行指令。
对于输入,方法200使用各自根据排序优先级来排序的多个输入有序列表(动作201)。在此将使用特定示例来帮助理解本文描述的原理。在该特定示例中,存在三个输入有序列表,每一输入有序列表包括从最低到最高排序的整数元素。三个有序列表如下:
有序列表A:1,2,3,4,9
有序列表B:5,8
有序列表C:2,4,7
对于该示例,正确合并的有序列表将如下:
合并有序列表:1,2,2,3,4,4,5,7,8,9
在描述根据本文描述的原理的合并操作之前,首先将描述用于根据现有技术优先级队列方法来合并有序列表的机制。描述该第一机制的原因的一部分将是使得读者能清楚地看到与现有技术合并机制相比根据本文描述的原理的合并过程要复杂多少。有悖常理地,根据本文描述的原理的更复杂的合并过程与常规优先级队列方法相比实际上能由现代处理器更高效地执行。
在优先级队列方法的第一阶段中,其所具有元素的数量与所存在的输入有序列表的数量相同的优先级队列被首先建立并且用来自每一输入有序列表的首元素来填充。当来自输入有序列表的元素被填充到优先级队列中时,该元素从输入有序列表中移除。由此,在第一排序阶段开始时,操作状态如下:
有序列表A:2,3,4,9
有序列表B:8
有序列表C:4,7
优先级队列:1,5,2
由此,优先级队列中的第一元素用来自输入有序列表A的元素来填充,优先级队列中的第二元素用来自输入有序列表B的元素来填充,而优先级队列中的最后元素用来自输入有序列表C的元素来填充。
在每一排序阶段中,最高优先级元素被从优先级队列中移除并被放置在合并有序列表的末尾,并且被腾空的空间用来自相应有序列表的下一元素来填充。由此,在第一排序阶段后,排序状态如下:
有序列表A:3,4,9
有序列表B:8
有序列表C:4,7
优先级队列:2,5,2
合并有序列表:1
注意,原来在有序列表A中的整数1已经从优先级队列中移除并作为合并有序列表中的首元素。为了再填充优先级队列,有序列表A中的下一元素(整数2)已经从有序列表A中移除,并且被放置在优先级队列的被腾空的左侧点。
每一排序阶段以该相同过程继续。由此,在下一排序阶段后,排序状态如下:
有序列表A:4,9
有序列表B:8
有序列表C:4,7
优先级队列:3,5,2
合并有序列表:1,2
注意,原来在有序列表A中的整数2已经从优先级队列中移除并作为合并有序列表中的尾元素。为了再填充优先级队列,有序列表A中的下一元素(整数3)已经从有序列表A中移除,并且被放置在优先级队列的被腾空的左侧点。在第二排序阶段之前在优先级队列中曾存在值为2的两个整数元素。值为2的任一整数元素已经根据该方法来选择。
继续,在第三排序阶段后,排序状态如下:
有序列表A:4,9
有序列表B:8
有序列表C:7
优先级队列:3,5,4
合并有序列表:1,2,2
整数2已经从右侧点(对应于有序列表C)移动并作为合并有序列表的新尾元素。此外,有序列表C中的新值(整数4)已被移至被腾空的右侧点。
在第四排序阶段后,排序状态如下:
有序列表A:9
有序列表B:8
有序列表C:7
优先级队列:4,5,4
合并有序列表:1,2,2,3
整数3已经从左侧点(对应于有序列表A)移动并作为合并有序列表的新尾元素。此外,有序列表A中的下一值(整数4)已被移至被腾空的右侧点。
在第五排序阶段后,排序状态如下:
有序列表A:*
有序列表B:8
有序列表C:7
优先级队列:9,5,4
合并有序列表:1,2,2,3,4
整数4已经从左侧点(对应于有序列表A)移动并作为合并有序列表的新尾元素。此外,有序列表A中的下一值(整数4)已被移至被腾空的右侧点。如由星号表示的,这将有序列表A留空。
在第六排序阶段后,排序状态如下:
有序列表A:*
有序列表B:8
有序列表C:*
优先级队列:9,5,7
合并有序列表:1,2,2,3,4,4
整数4已经从右侧点(对应于有序列表C)移动并作为合并有序列表的新尾元素。此外,有序列表C中的下一值(整数7)已被移至被腾空的右侧点。如由星号表示的,这也将有序列表C留空。
在第七排序阶段后,排序状态如下:
有序列表A:*
有序列表B:*
有序列表C:*
优先级队列:9,8,7
合并有序列表:1,2,2,3,4,4,5
整数5已经从中心点(对应于有序列表B)移动并作为合并有序列表的新尾元素。此外,有序列表B中的下一值(整数8)已被移至被腾空的右侧点。如由星号表示的,这也将有序列表B留空。当所有输入有序列表现在都为空时,输入有序列表将不在该方法的其余阶段中示出。
在第八排序阶段后,排序状态如下:
优先级队列:9,8,*
合并有序列表:1,2,2,3,4,4,5,7
整数7已经从右侧点(对应于有序列表C)移动并作为合并有序列表的新尾元素。当有序列表C中不再有元素时,优先级队列的右侧点保持为空,如由星号表示的。
在第九排序阶段后,排序状态如下:
优先级队列:9,*,*
合并有序列表:1,2,2,3,4,4,5,7,8
整数8已经从中心点(对应于有序列表B)移动并作为合并有序列表的新尾元素。当有序列表B内不再有元素时,优先级队列的中心点保持为空,如由星号表示的。
在第十排序阶段后,排序状态如下:
优先级队列:*,*,*
合并有序列表:1,2,2,3,4,4,5,7,8,9
整数9已经从中心点(对应于有序列表A)移动并作为合并有序列表的新尾元素。这将优先级队列留空,并且还完成合并有序列表。
该优先级队列方法的确合并有序列表,但在计算系统上执行不是高效的。根据本文描述的原理,输入有序列表的合并以由现代处理器更高效地执行的方式来执行。具体而言,排序使用一对数组并且大部分使用顺序读取和写入操作来执行。此外,排序通过多个核和并行实现来帮助更高效的处理。例如,排序可以跨并行或不同核或跨多个机器来执行。
返回到方法200和特定示例,回想在该示例中在访问输入有序列表(动作201)后,排序状态如下:
有序列表A:1,2,3,4,9
有序列表B:5,8
有序列表C:2,4,7
然后可任选地以递增大小的次序排列输入有序列表(动作202)。输入有序列表A到C可能表示将被合并的所有输入有序列表。然而,在一个实现中,这些有序列表可只表示将被合并的输入有序列表的子集。将输入有序列表处理为子集可具有减少合并操作所涉及的写入次数的优点。
例如,考虑存在将被排序的六个有序列表(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个元素)以生成有序列表abcd。合并输入有序列表abcd和输入有序列表e将导致32次写入(因为输入有序列表abcd中存在25个元素且输入有序列表e中存在7个元素)以生成有序列表abcde。合并输入有序列表abcde和输入有序列表f将导致39次写入(因为输入有序列表abcde中存在32个元素且输入有序列表f中存在7个元素)以生成有序列表abcddf。因此,使用该技术,将存在总共125次写入(11+18+25+32+39)。
然而,减少次数的写入可能通过首先将输入有序列表分成各个子集来实现。例如,再次假设输入有序列表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组合以生成合并列表abcd。输入有序列表abcd然后可以使用39次写入(因为输入有序列表abcd具有25个元素且输入有序列表ef具有14个元素)来与输入有序列表ef组合以生成合并列表abcdef。因此,使用该输入有序列表子集化,将存在总共103次写入(11+14+14+25+39)。此外,以此方式的子集化允许进行某种并行处理。
在本文的其中讨论输入有序列表A、B和C的示例中,这些输入有序列表可表示输入有序列表的整个集合或者可以只表示输入有序列表的子集。在后一种情况下,所述技术然后使用相同的技术来对输出合并有序列表进行操作作为新输入有序列表。
在任一种情况下,只参考输入有序列表A、B和C,有序列表B最小并由此将按顺序被首先排列。有序列表C是次最小的并由此将按顺序被接下来排列。有序列表A最大并由此将按顺序在最后。动作202是用于减少数组对中的两个数组之间的复制操作次数的可任选优化。
然后用输入有序列表来连续填充该对中的第一数组(动作203)。结果将如下:
第一数组:5,8,2,4,7,1,2,3,4,9
然后使用第一数组和第二数组来合并多个输入有序列表(动作204),该合并分多个阶段进行。例如,图4A示出了第一排序阶段开始时的排序状态,其中有序列表B、C和A被连续放置在第一数组401内。第二数组402具有与第一数组401相同的大小,但为空。例如,如果方法200由图1的计算系统100来执行,则方法第一数组401和第二数组402可位于计算机可读介质104的存储器中。
在第一阶段中,第一数组中的前两个有序列表被形成为位于第二数组中的第一中间合并有序列表。在第二阶段中,第一中间合并有序列表与第一数组中的第三有序列表合并以形成第一数组中的第二中间有序列表。然而,如果只有两个有序列表要合并,则将不存在这样的第二阶段。注意,当前中间合并有序列表的位置在各个数组之间交替。由此,对于奇数阶段,所得中间合并有序列表位于一个数组中,而对于偶数阶段,所得中间合并有序列表位于另一数组中。更一般而言,第一阶段后的每一阶段将从先前阶段产生的先前中间合并有序列表合并到下一输入有序列表以生成下一中间合并有序列表(或者在不再有要处理的输入有序列表的情况下生成最终合并有序列表)。
图3示出了用于处理图2的动作204的排序操作的每一排序阶段的方法300的流程图。在第一数组中的第一输入有序列表的第一元素(在第一排序阶段的情况下)或者在先前中间合并有序列表的第一元素(在后续排序阶段的情况下)建立第一输入光标(动作301)。例如,图4A示出了第一排序阶段开始时的排序状态,其中存在位于输入排序列表B的第一元素处的第一输入光标411,该输入排序列表B是被连续放置在第一数组401中的第一个输入排序列表。第一数组401和第二数组402是存储器位置。
在第一数组中的尚未被处理的下一有序列表中的第一元素处建立第二输入光标(动作302)。在第一阶段的情况下,这将会是连续有序列表中的第二输入有序列表。在其中序列包括有序列表B、C和A(以该次序连续放置)的图4A的情况下,光标412位于输入有序列表C的第一元素处。为了方便起见,第三输入光标413也被示为位于第一数组中的最后输入有序列表(有序列表A)的第一元素处。
在第二数组的开头处(在排序阶段是第一排序阶段的情况下)或者在与包含先前中间合并有序列表的数组相对的数组的开头处(在排序阶段在第一排序阶段后的情况下)建立输出光标(动作303)。例如,在图4A中,输出光标421位于空第二数组402的开头处。
方法300然后涉及以下动作:通过按顺序将值分配给下一中间排序列表中的元素来生成下一中间合并有序列表(动作310)。因此,动作310的内容可以对下一中间有序列表中的每一元素执行。这将通过参考参照图4A到4E的特定示例来展示。
将第一输入光标指向的元素的值与第二输入光标指向的元素处的值进行比较(判定框311)。例如,在图4A中,将第一输入光标411指向的整数5与第二输入光标412指向的整数2进行比较。
如果第一输入光标指向的元素处的值相对于第二输入光标指向的元素处的值满足排序优先级(判定框311中的“是”),则用第一输入光标指向的值来填充下一中间合并有序列表中的相应元素(动作321)。然后确定在第一有序列表(在这是第一排序阶段的情况下)或者先前中间合并有序列表(在这是后续排序阶段的情况下)中是否还有元素(判定框322)。该判定无需通过判定框322的每一迭代来明确作出。例如,如果动作310尚未被执行达至少等于或小于任一输入有序列表的最小长度的次数,则无需执行校验。然而,即使该校验未被明确执行,该校验通过参考已经执行动作310的次数仍然等于或小于该最小次数而仍然是隐式的。如果不再有任何元素(判定框322中的“否”),则将相对有序列表中的从第二输入光标开始的其余值填充为下一中间合并有序列表的最后值(动作312),并且该排序阶段结束(动作304)。如果还有元素(判定框322中的“是”),则将第一输入光标移至第一有序列表(在这是第一排序阶段的情况下)或下一中间合并有序列表(在这是后续排序阶段的情况下)中的下一相邻元素(动作323)。此外,将输出光标定位在第一有序列表(在这是第一排序阶段的情况下)或者先前中间合并有序列表(在这是后续排序阶段的情况下)中的下一元素处(也是动作323)。
如果第一输入光标指向的元素处的值相对于第二输入光标指向的元素处的值不满足排序优先级(判定框311中的“否”),则用第二输入光标指向的值来填充下一中间合并有序列表中的相应元素(动作331)。然后确定下一输入有序列表中是否还留有元素(判定框332)。如果为否,则将相对有序列表中的从第一输入光标开始的其余值填充为下一中间合并有序列表的最后值(动作312),并且该排序阶段结束(动作304)。如果还有元素(判定框332中的“是”),则将第二输入光标移至下一有序列表中的下一相邻元素(动作333)。此外,将输出光标定位在下一中间合并有序列表中的下一元素(也是动作333)。
例如,在图4A中,输入光标411指向的整数5不等于或小于输入光标412指向的整数2(判定框311中的“否”)。因此,用输入光标412指向的值2来填充下一中间合并有序列表的相应元素(即,输出光标421指向的元素)(动作331)。第二有序列表中还有元素(判定框332中的“是”),并由此第二输入光标412和输出光标421两者都前进(动作333)。所得排序状态400B在图4B中示出。
在图4B中,输入光标411指向的整数5不等于或小于输入光标412指向的整数4(判定框311中的“否”)。因此,用输入光标412指向的值4来填充输出光标421处的相应元素(动作331)。第二有序列表中还有元素(判定框332中的“是”),并由此第二输入光标412和输出光标421两者都前进(动作333)。所得排序状态400C在图4C中示出。
在图4C中,输入光标411指向的整数5等于或小于输入光标412指向的整数7(判定框311中的“是”)。因此,用输入光标411指向的值5来填充输出光标421处的相应元素(动作321)。第一有序列表中还有元素(判定框322中的“是”),并由此第一输入光标411和输出光标421两者都前进(动作333)。所得排序状态400D在图4D中示出。
在图4D中,输入光标411指向的整数8不等于或小于输入光标412指向的整数7(判定框311中的“否”)。因此,用输入光标412指向的值7来填充输出光标421处的相应元素(动作331)。第二有序列表中不再有元素(判定框332中的“否”)。因此,将来自第一输入有序列表的最后整数值8填充到下一中间合并有序列表的最后值(动作312),由此完成第一排序阶段(动作314)。所得排序状态400E在图4E中示出。输入光标和输出光标的位置未在图4E中示出,因为它们已经完成其用于该第一排序阶段的功能。在只存在两个输入有序列表的情况下该方法将在此结束。尽管第一输入有序列表B和第二输入有序列表C仍被包括在第一数组401中,但它们将不影响后续排序操作,因为这些有序列表将在后续排序阶段期间被简单地重写。因此,处理无需被浪费在从第一数组401中删除第一输入有序列表B和第二输入有序列表C。
第二排序阶段然后可以继续再次将特定示例与图3进行比较。同样,建立第一输入光标(动作301)。由于这是后续排序阶段,因此第一输入光标被建立在从先前排序阶段产生的先前中间合并有序列表的第一元素处。例如,图5A示出了第一排序阶段开始时的排序状态500A,其中存在位于第一中间合并有序列表的第一元素处的第一输入光标511.
在尚未被处理的第一数组中的下一有序列表中的第一元素处建立第二输入光标(动作302)。在第二阶段的情况下,这将会是连续有序列表中的第三输入有序列表。在其中序列包括有序列表B、C和A(以该次序连续放置)的图5A的情况下,光标512被定位在输入有序列表A的第一元素处。
在与包含先前中间合并有序列表的数组相对的数组的开头处(在该排序阶段在第一排序阶段后)建立输出光标(动作303)。例如,在图5A中,由于第一中间合并有序列表处于第二数组402中,因此输出光标521被放置在第一数组401的开头处。
方法300然后涉及以下动作:通过按顺序将值分配给下一中间排序列表中的元素来生成下一中间合并有序列表(动作310)。因此,动作310的内容可以对下一(即,第二)中间有序列表中的每一元素执行。这将通过参考参照图5A到5J的特定示例来展示。
将第一输入光标指向的元素的值与第二输入光标指向的元素处的值进行比较(判定框311)。例如,在图5A中,输入光标511指向的整数2不等于或小于输入光标512指向的整数1(判定框311中的“否”)。因此,用输入光标512指向的值1来填充第二中间合并有序列表的相应元素(即,输出光标521指向的元素)(动作331)。第三有序列表中还有元素(判定框332中的“是”),并由此第二输入光标512和输出光标521两者都前进(动作333)。所得排序状态500B在图5B中示出。
在图5B中,输入光标511指向的整数2等于或小于输入光标512指向的整数2(判定框311中的“是”)。因此,用输入光标511指向的值2来填充输出光标521处的相应元素(动作321)。第一中间合并有序列表中还有元素(判定框322中的“是”),并由此第一输入光标511和输出光标521两者都前进(动作323)。所得排序状态500C在图5C中示出。
在图5C中,输入光标511指向的整数4不等于或小于输入光标512指向的整数2(判定框311中的“否”)。因此,用输入光标512指向的值2来填充输出光标521处的相应元素(动作331)。第三有序列表中还有元素(判定框332中的“是”),并由此第二输入光标512和输出光标521两者都前进(动作333)。所得排序状态500D在图5D中示出。
在图5D中,输入光标511指向的整数4不等于或小于输入光标512指向的整数3(判定框311中的“否”)。因此,用输入光标512指向的值3来填充输出光标521处的相应元素(动作331)。第三有序列表中还有元素(判定框332中的“是”),并由此第二输入光标512和输出光标521两者都前进(动作333)。所得排序状态500E在图5E中示出。
在图5E中,输入光标511指向的整数4等于或小于输入光标512指向的整数4(判定框311中的“是”)。因此,用输入光标511指向的值4来填充输出光标521处的相应元素(动作321)。第一中间合并有序列表中还有元素(判定框322中的“是”),并由此第一输入光标511和输出光标521两者都前进(动作323)。所得排序状态500F在图5F中示出。
在图5F中,输入光标511指向的整数5不等于或小于输入光标512指向的整数4(判定框311中的“否”)。因此,用输入光标512指向的值4来填充输出光标521处的相应元素(动作331)。第三有序列表中还有元素(判定框332中的“是”),并由此第二输入光标512和输出光标521两者都前进(动作333)。所得排序状态500G在图5G中示出。
在图5G中,输入光标511指向的整数5等于或小于输入光标512指向的整数9(判定框311中的“是”)。因此,用输入光标511指向的值5来填充输出光标521处的相应元素(动作321)。第一中间合并有序列表中还有元素(判定框322中的“是”),并由此第一输入光标511和输出光标521两者都前进(动作323)。所得排序状态500H在图5H中示出。
在图5H中,输入光标511指向的整数7等于或小于输入光标512指向的整数9(判定框311中的“是”)。因此,用输入光标511指向的值7来填充输出光标521处的相应元素(动作321)。第一中间合并有序列表中还有元素(判定框322中的“是”),并由此第一输入光标511和输出光标521两者都前进(动作323)。所得排序状态500I在图5I中示出。
在图5I中,输入光标511指向的整数8等于或小于输入光标512指向的整数9(判定框311中的“是”)。因此,用输入光标511指向的值8来填充输出光标521处的相应元素(动作321)。第一中间合并有序列表中不再有元素(判定框322中的“否”)。因此,将来自第三输入有序列表的最后整数值9填充到第二中间合并有序列表的最后值(动作312),由此完成第二排序阶段(动作314)。所得排序状态500J在图5J中示出,且第二中间合并有序列表(并且在只有三个输入有序列表的情况下是最终合并列表)被包括在第一数组内。输入光标和输出光标的位置未在图5J中示出,因为它们已经完成其用于该排序阶段的功能。尽管第一中间合并有序列表仍被包括在第二数组402中,但这些值将不影响后续排序操作(如果由于第四或更多输入有序列表而存在后续排序操作),因为它们将在后续排序阶段期间被简单地重写。因此,处理不会浪费在从第二数组402中删除第一中间合并有序列表。
如果存在更多输入有序列表,则方法300可以对更多有序列表重复。每个输入有序列表导致一附加排序阶段。例如,在存在3个输入有序列表的情况下,存在两个排序阶段和一个中间合并有序列表,以及一个最终合并有序列表。更一般而言,如果存在N个输入有序列表(其中N是大于一的整数),则将存在N-1个排序阶段以及N-2个中间合并有序列表。中间合并有序列表的位置随排序阶段在数组之间来回跳转。
因此,已经描述了现有技术优先级队列方法和使用两对数组的方法(之后称为“数组对方法”)。从描述这两种方法所需的空间长度将显而易见,存在与数组对方法相关联的更具描述性和直观性的复杂性。
这可能导致总结出数组对方法比优先级队列方法要低效得多。虽然这对于心算可以如此,但在使用现代处理器来实现时并非如此。例如,与数组对方法相关联的绝大部分读取和写入操作被按序执行。此外,只有两个数组被操作,这使该机制对于现代处理器是高效的。此外,并行性可使用如上所述的数组对方法来利用。
图6示出了用于访问输入有序列表的方法600的流程图.方法600表示图2的动作201的示例。方法600包括访问多个元素的动作(动作601)。此类元素可以是无序的。例如,考虑以下示例10元素序列:
无序序列:5,2,1,4,2,3,8,7,7,6。
然后使用多个元素来制定多个输入有序列表(动作610)。动作610的内容一次对一个元素执行,并遍历动作601中访问的各个元素。对于每一元素,确定是否存在具有其优先级在排序优先级中比相应元素更高的尾成员的任何有序列表(判定框611)。如果不存在具有其优先级在排序优先级中比相应元素更高的尾成员的任何有序列表(判定框611中的“否”),则创建新有序列表(动作612)并且相应元素作为新有序列表的首元素(动作613)。由于在此时刚刚添加的元素是有序列表中的仅有成员,因此所添加的元素也恰好是该新有序列表的尾元素。
如果存在具有其优先级在排序优先级中比相应元素更高的尾成员的一个或多个输入有序列表(判定框611中的“是”),则将相应元素添加到的确具有其排序优先级比该相应元素更高的尾成员的一个或多个有序列表之一。在一个实施例中,该方法选择这些有序列表中的具有具备排序优先级中的最低优先级、同时其优先级仍然是比该相应元素更高的尾成员的任一个有序列表(动作614)。然后将相应元素作为新尾成员添加到所选有序列表(动作615)。
动作610现在将参考无序元素的示例序列来描述,该序列再次如下列出:
无序序列:5,2,1,4,2,3,8,7,7,6
在该示例中,排序优先级将使得具有等于或大于先前元素的值的任何后续元素将被认为具有比先前元素低的优先级。在遇到元素5之际,尚不存在任何有序列表,并由此固有地不存在具有其优先级比该元素高的尾成员的任何有序列表(判定框611中的“否”)。由此,创建新有序列表(动作612)(该有序列表将被称为“有序列表I”),并且将元素5添加为该新有序列表的首成员(动作613)。相应的有序列表形成状态然后将如下出现:
无序序列:2,1,4,2,3,8,7,7,6
有序列表I:5
无序序列中还有要分配给有序列表的元素(判定框616中的“是”),并由此评估无序序列中的下一元素(即,元素2)。不存在具有其优先级在排序优先级中比元素2高的尾成员的任何有序列表(判定框612中的“否”),并由此创建新有序列表(动作612)(该有序列表将被称为“有序列表II”),并且将元素2添加为该新有序列表的首成员。相应的有序列表形成状态然后将如下出现:
无序序列:1,4,2,3,8,7,7,6
有序列表I:5
有序列表II:2
无序序列中还有要分配给有序列表的元素(判定框616中的“是”),并由此评估无序序列中的下一元素(即,元素1)。不存在具有其优先级在排序优先级中比元素1高的尾成员的任何有序列表(判定框612中的“否”),并由此创建新有序列表(动作612)(该有序列表将被称为有序列表“III”),并且将元素1添加为该新有序列表的首成员。相应的有序列表形成状态然后将如下出现:
无序序列:4,2,3,8,7,7,6
有序列表I:5
有序列表II:2
有序列表III:1
无序序列中还有要分配给有序列表的元素(判定框616中的“是”),并由此评估无序序列中的下一元素(即,元素4)。存在具有其优先级在排序优先级中比元素4高的尾成员的两个有序列表(判定框612中的“是”)(即,有序列表II和III)。由此,选择具有有序列表II和III中的最低优先级尾成员的有序列表(该有序列表将会是有序列表II)(动作614),并且将元素4添加为有序列表II的新尾成员(动作615)。相应的有序列表形成状态然后将如下出现:
无序序列:2,3,8,7,7,6
有序列表I:5
有序列表II:2,4
有序列表III:1
无序序列中还有要分配给有序列表的元素(判定框616中的“是”),并由此评估无序序列中的下一元素(即,元素2)。只存在具有其优先级在排序优先级中比元素2高的尾成员的一个有序列表(判定框612中的“是”)(即,有序列表III)。由此,选择有序列表III(动作614),并且将元素2添加到有序列表III(动作615)。相应的有序列表形成状态然后将如下出现:
无序序列:3,8,7,7,6
有序列表I:5
有序列表II:2,4
有序列表III:1,2
无序序列中还有要分配给有序列表的元素(判定框616中的“是”),并由此评估无序序列中的下一元素(即,元素3)。只存在具有其优先级在排序优先级中比元素3高的尾成员的一个有序列表(判定框612中的“是”)(即,有序列表III)。由此,选择有序列表III(动作614),并且将元素3添加到有序列表III(动作615)。相应的有序列表形成状态然后将如下出现:
无序序列:8,7,7,6
有序列表I:5
有序列表II:2,4
有序列表III:1,2,3
无序序列中还有要分配给有序列表的元素(判定框616中的“是”),并由此评估无序序列中的下一元素(即,元素8)。所有有序列表具有其优先级在排序优先级中比元素8高的尾成员(判定框612中的“是”)。由此,选择具有有序列表中的最低优先级尾成员的有序列表(该有序列表将会是有序列表I)(动作614),并且将元素8添加为有序列表I的新尾成员(动作615)。相应的有序列表形成状态然后将如下出现:
无序序列:7,7,6
有序列表I:5,8
有序列表II:2,4
有序列表III:1,2,3
无序序列中还有要分配给有序列表的元素(判定框616中的“是”),并由此评估无序序列中的下一元素(即,元素7)。存在具有其优先级在排序优先级中比元素7高的尾成员的两个有序列表(判定框612中的“是”)(即,有序列表II和III)。由此,选择具有有序列表II和III中的最低优先级尾成员的有序列表(该有序列表将会是有序列表II)(动作614),并且将元素7添加为有序列表II的新尾成员(动作615)。相应的有序列表形成状态然后将如下出现:
无序序列:7,6
有序列表I:5,8
有序列表II:2,4,7
有序列表III:1,2,3
无序序列中还有要分配给有序列表的元素(判定框616中的“是”),并由此评估无序序列中的下一元素(即,元素7)。存在具有其优先级在排序优先级中比元素7高的尾成员的两个有序列表(判定框612中的“是”)(即,有序列表II和III)。由此,选择具有有序列表II和III中的最低优先级尾成员的有序列表(该有序列表将会是有序列表II)(动作614),并且将元素7添加为有序列表II的新尾成员(动作615)。相应的有序列表形成状态然后将如下出现:
无序序列:6
有序列表I:5,8
有序列表II:2,4,7,7
有序列表III:1,2,3
无序序列中还有一个要分配给有序列表的元素(判定框616中的“是”),并由此评估无序序列中的最后元素(即,元素6)。只存在具有其优先级在排序优先级中比元素3高的尾成员的一个有序列表(判定框612中的“是”)(即,有序列表III)。由此,选择有序列表III(动作614),并且将元素6添加到有序列表III(动作615)。相应的有序列表形成状态然后将如下出现:
无序序列:*
有序列表I:5,8
有序列表II:2,4,7,7
有序列表III:1,2,3,6
由于无序序列现在为空(判定框616中的“否”),因此方法600结束。注意,在每一点,有序列表都按每一尾成员在排序优先级中的低到高优先级顺序来排序的。动作611到616实际上先前已经作为“耐心方法”的一部分被公开揭示。
然而,作为对输入有序列表形成的改进,本文描述的原理可标记将先前元素从无序序列添加到的最后有序列表。来自无序序列的下一元素的比较然后通过与所标记的有序列表的尾成员进行比较来开始。如果新元素具有比所标记的有序列表的尾成员高的排序优先级,则来自无序序列的元素的比较对照先前列表执行(如果存在先前列表)。如果新元素具有比先前列表的尾成员高的排序优先级(或者如果不存在先前列表),则该新元素被添加为所标记的列表的新尾成员。否则,比较操作按排序优先级中的优先级递减的方向移至序列中的下一有序列表(例如,在以上示例中从有序列表III上升至有序列表II,或者从有序列表II上升至有序列表I),并且将新元素与该下一更低优先级尾成员有序列表中的尾成员进行比较。如果新元素具有比所标记的有序列表的尾成员低的排序优先级,则比较按排序优先级中的优先级递增的方向移至序列中的下一有序列表(例如,在以上示例中从有序列表I下降至有序列表II,或者从有序列表II下降至有序列表III),并且将新元素与该下一更高优先级尾成员有序列表中的尾成员进行比较。
图7示出了用于处理元素以形成有序列表的更一般化的方法700的流程图。方法700包括形成多个输入有序列表的动作(动作701),之后是将输入有序列表合并成合并有序列表的动作(动作702)。动作701的示例已经在上文中参考图6描述,但动作701不限于该方法。动作702的示例已经在上文中参考图2和3描述,但动作702不限于该方法。
本文描述的原理可以对元素流操作。在这种情况下,或许没有足够的存储器来保存流中的所有元素。因此,或许只有元素的一部分可使用方法700来制定第一合并有序列表。例如,在上述一个示例中,无序元素序列包括10个元素,如下:
无序序列:5,2,1,4,2,3,8,7,7,6
然而,假设只存在用于处理该无序序列中的前8个元素的空间如下:
无序序列(部分I):5,2,1,4,2,3,8,7。
应用方法600(动作701的示例),处理将与如上所述的前八个元素相同地继续以产生以下输入有序列表。
有序列表I:5,8
有序列表II:2,4,7
有序列表III:1,2,3
动作702然后被执行以制定合并有序列表,如下:
合并有序列表:1,2,2,3,4,5,7,8
合并有序列表中的具有更高优先级的值然后被持久存储在存储中。例如,假设合并有序列表中的最高优先级的一半(例如,具有值3或更小的那些元素)被保存在持久存储中。已持久存储的相应值然后从输入有序列表中移除。这将产生以下相关状态:
有序列表I(存储器中):5,8
有序列表II(存储器中):4,7
有序列表III(存储器中):*(空)
持久存储的元素:1,2,2,3。
来自无序序列的附加元素(即7和6)然后通过动作701来处理。例如,使用方法600,新元素7将被分配给有序列表II,这导致以下状态:
有序列表I(存储器中):5,8
有序列表II(存储器中):4,7,7
有序列表III(存储器中):*(空)
持久存储的元素:1,2,2,3
无序序列中的最后元素6然后将被分配给有序列表III,这导致以下状态:
有序列表I(存储器中):5,8
有序列表II(存储器中):4,7,7
有序列表III(存储器中):6
持久存储的元素:1,2,2,3
动作702然后再次被应用于制定以下状态:
有序列表I(存储器中):5,8
有序列表II(存储器中):4,7,7
有序列表III(存储器中):6
合并有序列表:4,5,6,7,7,8
持久存储的元素:1,2,2,3
合并有序列表中的其余部分然后可被附加到持久存储的元素以形成以下持久存储的有序元素:
持久存储的元素:1,2,2,3,4,5,6,7,7,8。
在流化元素的第二示例中,可能存在包括多个元素、但还在某一点包括以下通知的流:超过该点的附加元素只包括具有比多个有序列表中的任一值更低的排序优先级的值。由此,方法700可被执行以便对到该通知点为止的所有元素进行排序。然后,方法700可以对在流中接收到的该点后的所有元素单独执行,直到流结束或者直到再次遇到类似通知。
因此,本文描述的原理提供了用于将多个输入有序列表合并成单个合并有序列表、以及用于在即使无序序列通过流接收到或者太大以至于无法同时装在存储器中的情况下制定输入有序列表的有效机制。
本发明可具体化为其它具体形式而不背离其精神或本质特征。所描述的实施例在所有方面都应被认为仅是说明性而非限制性的。从而,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变应被权利要求书的范围所涵盖。
Claims (5)
1.一种包括合并多个有序列表以形成合并有序列表的动作的方法,所述合并多个有序列表的动作包括:
访问多个输入有序列表的动作,包括:
访问多个元素的动作;以及
使用所述多个元素来制定所述多个输入有序列表的动作;
用存储器中的第一数组中的第一多个元素来连续表示第一有序列表和第二有序列表的动作;
在所述第一数组中的所述第一有序列表中的第一元素处建立第一输入光标的动作;
在所述第一数组中的所述第二有序列表中的第一元素处建立第二输入光标的动作;
制定存储器中的第二数组的动作,所述第二数组包括包含数量上与所述第一多个元素相等的第二多个元素的至少一部分;
按序将值分配给所述第二多个元素中的各个元素以由此制定所述第一和第二有序列表的第一合并有序列表的动作;
所述按序分配动作包括对所述第二多个元素中的第一元素到后续元素中的每一个执行以下动作:
将所述第一输入光标指向的元素处的值与所述第二输入光标指向的元素处的值进行比较的动作;
如果所述第一输入光标指向的元素处的值相对于所述第二输入光标指向的元素处的值满足排序优先级,则用所述第一输入光标指向的元素处的值来填充所述第二多个元素中的相应元素的动作;以及在所述第一有序列表中还有任何元素的情况下将所述第一输入光标移至所述第一多个元素的所述第一有序列表中的下一元素的动作,并且如果所述第一有序列表中不再有任何元素,则所述第二多个元素中的相应元素是所述第二多个元素中的后续元素,并由此所述方法还包括用所述第二有序列表中的从所述第二输入光标指向的元素开始的任何未经处理的其余元素来进一步填充所述第二多个元素的其余部分的动作;以及
如果所述第一输入光标指向的元素处的值相对于所述第二输入光标指向的元素处的值不满足排序优先级,则用所述第二输入光标指向的元素处的值来填充所述第二多个元素中的相应元素的动作;以及在所述第二有序列表中还有任何元素的情况下将所述第二输入光标移至所述第一多个元素的所述第二有序列表中的下一元素的动作,并且如果所述第二有序列表中不再有任何元素,则所述第二多个元素中的相应元素是所述第二多个元素中的后续元素,并由此所述方法还包括用所述第一有序列表中的从所述第一输入光标指向的元素开始的任何未经处理的其余元素来进一步填充所述第二多个元素的其余部分的动作;
其中合并所述多个有序列表以形成所述合并有序列表的动作是响应于检测到以下通知的动作而执行的:有序列表流中的超过所述多个有序列表的附加有序列表只包括具有比所述多个有序列表中的任一值更低的排序优先级的值。
2.如权利要求1所述的方法,其特征在于,所述第一数组包括第三有序列表,所述第三有序列表连续排列有所述第一数组中的第一多个元素以形成所述第一数组中的第一多个元素的超集,所述方法还包括将所述第一合并有序列表与所述第三有序列表合并的动作,所述动作包括:
在所述第二数组中的第二多个元素中的所述第一合并有序列表中的第一元素处建立所述第一输入光标的动作;
在所述第一数组中的所述第三有序列表中的第一元素处建立第二输入光标的动作;
按序将值分配给所述第一数组中的所述第一多个元素的超集中的各个元素以由此制定所述第一、第二和第三有序列表的第二合并有序列表的动作;
按序将值分配给所述第一多个元素的超集中的各个元素的动作,包括对于所述第一多个元素的超集中的第一元素到后续元素中的每一个执行以下动作:
将所述第一输入光标指向的元素处的值与所述第二输入光标指向的元素处的值进行比较的动作;
如果所述第一输入光标指向的元素处的值相对于所述第二输入光标指向的元素处的值满足排序优先级,则用所述第一输入光标指向的元素处的值来填充所述第一多个元素的超集中的相应元素的动作;以及在所述第一合并有序列表中还有任何元素的情况下将所述第一输入光标移至所述第一多个元素的所述第一合并有序列表中的下一元素的动作,并且如果所述第一合并有序列表中不再有任何元素,则所述第一多个元素的超集中的相应元素是所述第一多个元素的超集中的后续元素,并由此所述方法还包括用所述第三有序列表中的从所述第二输入光标指向的元素开始的任何未经处理的其余元素来进一步填充所述第一多个元素的超集的其余部分的动作;
如果所述第一输入光标指向的元素处的值相对于所述第二输入光标指向的元素处的值不满足排序优先级,则用所述第二输入光标指向的元素处的值来填充所述第一多个元素的超集中的相应元素的动作;以及在所述第三有序列表中还有任何元素的情况下将所述第二输入光标移至所述第一数组的所述第三有序列表中的下一元素的动作,并且如果所述第三有序列表中不再有任何元素,则所述第一多个元素的超集中的相应元素是所述第一多个元素的超集中的后续元素,并由此所述方法还包括用所述第一合并有序列表中的从所述第一输入光标指向的元素开始的任何未经处理的其余元素来进一步填充所述第一多个元素的超集的其余部分的动作。
3.如权利要求1所述的方法,其特征在于,所述多个有序列表是第一多个有序列表,并且所述合并有序列表是第一合并有序列表,所述方法还包括:
按排序次序持久存储所述合并有序列表中的具有更优先的排序优先级的那些优先级更高的值的动作;
从所述第一多个有序列表中移除持久存储的值的动作;
访问至少一个附加元素的动作;
使用所述至少一个附加元素的组合以及所述第一多个有序列表中的在所述移除动作后留下的任何其余有序列表来制定第二多个有序列表的动作;以及
使用所述第二多个有序列表来制定第二合并有序列表的动作。
4.如权利要求3所述的方法,其特征在于,所述方法还包括合并所述多个有序列表的动作之前的以下动作:
按递增大小次序排列所述多个有序列表以使得所述第一数组内的任何有序列表在元素数量上等于或小于在所述第一数组中的给定有序列表后出现的任何有序列表中的元素数量的动作。
5.一种包括用于合并多个有序列表以形成合并有序列表的装置的系统,所述用于合并多个有序列表的装置包括:
用于访问多个输入有序列表的装置,包括:
用于访问多个元素的装置;以及
用于使用所述多个元素来制定所述多个输入有序列表的装置;
用于用存储器中的第一数组中的第一多个元素来连续表示第一有序列表和第二有序列表的装置;
用于在所述第一数组中的所述第一有序列表中的第一元素处建立第一输入光标的装置;
用于在所述第一数组中的所述第二有序列表中的第一元素处建立第二输入光标的装置;
用于制定存储器中的第二数组的装置,所述第二数组包括包含数量上与所述第一多个元素相等的第二多个元素的至少一部分;
用于按序将值分配给所述第二多个元素中的各个元素以由此制定所述第一和第二有序列表的第一合并有序列表的装置;
所述用于按序分配的装置包括用于对所述第二多个元素中的第一元素到后续元素中的每一个执行以下动作的装置:
将所述第一输入光标指向的元素处的值与所述第二输入光标指向的元素处的值进行比较的动作;
如果所述第一输入光标指向的元素处的值相对于所述第二输入光标指向的元素处的值满足排序优先级,则用所述第一输入光标指向的元素处的值来填充所述第二多个元素中的相应元素的动作;以及在所述第一有序列表中还有任何元素的情况下将所述第一输入光标移至所述第一多个元素的所述第一有序列表中的下一元素的动作,并且如果所述第一有序列表中不再有任何元素,则所述第二多个元素中的相应元素是所述第二多个元素中的后续元素,并由此所述系统还包括用于用所述第二有序列表中的从所述第二输入光标指向的元素开始的任何未经处理的其余元素来进一步填充所述第二多个元素的其余部分的装置;以及
如果所述第一输入光标指向的元素处的值相对于所述第二输入光标指向的元素处的值不满足排序优先级,则用所述第二输入光标指向的元素处的值来填充所述第二多个元素中的相应元素的动作;以及在所述第二有序列表中还有任何元素的情况下将所述第二输入光标移至所述第一多个元素的所述第二有序列表中的下一元素的动作,并且如果所述第二有序列表中不再有任何元素,则所述第二多个元素中的相应元素是所述第二多个元素中的后续元素,并由此所述系统还包括用于用所述第一有序列表中的从所述第一输入光标指向的元素开始的任何未经处理的其余元素来进一步填充所述第二多个元素的其余部分的装置;
其中用于合并所述多个有序列表以形成所述合并有序列表的装置是响应于检测到以下通知的动作而被执行的:有序列表流中的超过所述多个有序列表的附加有序列表只包括具有比所述多个有序列表中的任一值更低的排序优先级的值。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US13/892,799 | 2013-05-13 | ||
US13/892,799 US9418089B2 (en) | 2013-05-13 | 2013-05-13 | Merging of sorted lists using array pair |
PCT/US2014/037616 WO2014186242A1 (en) | 2013-05-13 | 2014-05-12 | Merging of sorted lists using array pair |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105264488A CN105264488A (zh) | 2016-01-20 |
CN105264488B true CN105264488B (zh) | 2018-04-27 |
Family
ID=51023032
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201480027746.XA Active CN105264488B (zh) | 2013-05-13 | 2014-05-12 | 用于使用数组对来合并有序列表的方法和系统 |
Country Status (4)
Country | Link |
---|---|
US (3) | US9418089B2 (zh) |
EP (1) | EP2997461B1 (zh) |
CN (1) | CN105264488B (zh) |
WO (1) | WO2014186242A1 (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9418089B2 (en) | 2013-05-13 | 2016-08-16 | Microsoft Technology Licensing, Llc | Merging of sorted lists using array pair |
US10523596B1 (en) * | 2015-02-06 | 2019-12-31 | Xilinx, Inc. | Circuits for and methods of merging streams of data to generate sorted output data |
US10108466B2 (en) | 2015-06-29 | 2018-10-23 | International Business Machines Corporation | Optimizing the initialization of a queue via a batch operation |
US10334011B2 (en) * | 2016-06-13 | 2019-06-25 | Microsoft Technology Licensing, Llc | Efficient sorting for a stream processing engine |
US10402164B1 (en) * | 2016-12-23 | 2019-09-03 | EMC IP Holding Company LLC | Method for merge sort by representation |
CN107908714B (zh) * | 2017-11-10 | 2021-05-04 | 上海达梦数据库有限公司 | 一种数据归并排序方法及装置 |
CN112947889A (zh) * | 2021-03-09 | 2021-06-11 | 中科驭数(北京)科技有限公司 | 一种归并排序方法及装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB2284079A (en) * | 1993-11-19 | 1995-05-24 | Hewlett Packard Co | Sorting or merging lists |
Family Cites Families (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5179699A (en) * | 1989-01-13 | 1993-01-12 | International Business Machines Corporation | Partitioning of sorted lists for multiprocessors sort and merge |
US5210870A (en) * | 1990-03-27 | 1993-05-11 | International Business Machines | Database sort and merge apparatus with multiple memory arrays having alternating access |
US5307485A (en) * | 1991-05-31 | 1994-04-26 | International Business Machines Corporation | Method and apparatus for merging sorted lists in a multiprocessor shared memory system |
US6366911B1 (en) * | 1998-09-28 | 2002-04-02 | International Business Machines Corporation | Partitioning of sorted lists (containing duplicate entries) for multiprocessors sort and merge |
US7536432B2 (en) * | 2002-04-26 | 2009-05-19 | Nihon University School Juridical Person | Parallel merge/sort processing device, method, and program for sorting data strings |
US7293024B2 (en) * | 2002-11-14 | 2007-11-06 | Seisint, Inc. | Method for sorting and distributing data among a plurality of nodes |
CN1612100A (zh) * | 2003-10-27 | 2005-05-04 | 陈启星 | 分级定位排序和分级定位查找的动态查找表的算法 |
US7454420B2 (en) | 2004-11-08 | 2008-11-18 | Sas Institute Inc. | Data sorting method and system |
US7536532B2 (en) * | 2006-09-27 | 2009-05-19 | International Business Machines Corporation | Merge operations of data arrays based on SIMD instructions |
US9122724B2 (en) | 2008-10-28 | 2015-09-01 | Hewlett-Packard Development Company, L.P. | Combined join |
US8190943B2 (en) * | 2009-03-13 | 2012-05-29 | Massachusetts Institute Of Technology | Systolic merge sorter |
WO2013184975A2 (en) * | 2012-06-06 | 2013-12-12 | Spiral Genetics Inc. | Method and system for sorting data in a cloud-computing environment and other distributed computing environments |
US9418089B2 (en) | 2013-05-13 | 2016-08-16 | Microsoft Technology Licensing, Llc | Merging of sorted lists using array pair |
US9721007B2 (en) * | 2014-10-07 | 2017-08-01 | Oracle International Corporation | Parallel data sorting |
-
2013
- 2013-05-13 US US13/892,799 patent/US9418089B2/en active Active
-
2014
- 2014-05-12 EP EP14733766.1A patent/EP2997461B1/en active Active
- 2014-05-12 CN CN201480027746.XA patent/CN105264488B/zh active Active
- 2014-05-12 WO PCT/US2014/037616 patent/WO2014186242A1/en active Application Filing
-
2016
- 2016-08-09 US US15/232,315 patent/US10552397B2/en active Active
- 2016-08-09 US US15/232,273 patent/US10002147B2/en active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB2284079A (en) * | 1993-11-19 | 1995-05-24 | Hewlett Packard Co | Sorting or merging lists |
Non-Patent Citations (2)
Title |
---|
C语言中数组应用总结;许淑华;《科技广场》;20110331;第255页 * |
分割方式的多线程快速排序算法;宋鸿陟 等;《计算机应用》;20100930;第30卷(第9期);第2374-2378页 * |
Also Published As
Publication number | Publication date |
---|---|
WO2014186242A1 (en) | 2014-11-20 |
CN105264488A (zh) | 2016-01-20 |
US9418089B2 (en) | 2016-08-16 |
EP2997461B1 (en) | 2020-02-19 |
US20140337362A1 (en) | 2014-11-13 |
US20160350341A1 (en) | 2016-12-01 |
US10002147B2 (en) | 2018-06-19 |
US10552397B2 (en) | 2020-02-04 |
EP2997461A1 (en) | 2016-03-23 |
US20160350345A1 (en) | 2016-12-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105264488B (zh) | 用于使用数组对来合并有序列表的方法和系统 | |
Glover et al. | Generalized networks: A fundamental computer-based planning tool | |
CN113033811B (zh) | 两量子比特逻辑门的处理方法及装置 | |
CN104952032B (zh) | 图的处理方法、装置以及栅格化表示及存储方法 | |
WO2021011914A1 (en) | Scheduling operations on a computation graph | |
US20200090051A1 (en) | Optimization problem operation method and apparatus | |
CN105204920B (zh) | 一种基于映射聚合的分布式计算作业的实现方法及装置 | |
JPH02178730A (ja) | 分割法を用いた内部ソート方式 | |
CN108415912A (zh) | 基于MapReduce模型的数据处理方法和设备 | |
US20090254319A1 (en) | Method and system for numerical simulation of a multiple-equation system of equations on a multi-processor core system | |
Sauer | Marking optimization of weighted marked graphs | |
CN112257368A (zh) | 时钟布局方法、装置、eda工具及计算机可读存储介质 | |
WO1998049612A9 (en) | Universal software structure for representing model structures | |
JPH0855013A (ja) | ソート処理方法および装置 | |
CN108845844A (zh) | 一种状态转换方法及装置 | |
CN108196844A (zh) | 信息处理方法、装置、电子设备及存储介质 | |
Reeves et al. | Propositional proof skeletons | |
CN110928253B (zh) | 自动制造系统的动态加权启发式调度方法 | |
CN107808214B (zh) | 车间制造系统的启发式二叉决策图变量序优化表示方法 | |
JP6663875B2 (ja) | 問題解決装置、方法、及びプログラム | |
CN106844242B (zh) | 一种数据交换方法和系统 | |
Souravlas et al. | Petri net modeling and simulation of pipelined redistributions for a deadlock-free system | |
CN111832714A (zh) | 运算方法及装置 | |
Rehak et al. | Evaluation of finite element system architectures | |
CN118052423B (zh) | 智能排产方法、电子设备、存储介质及计算机程序产品 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |