我需要创建一个带分页的HTML表格。数据来自2个不同的来源(可能是来自2个不同数据库的2个表,如一个Oracle,另一个是MySQL),您无法使用连接的select语句。为了使它更复杂,我需要按升序显示按时间戳排序的数据(其中一个属性是时间戳)。
例如,源A有45条记录,源B有55条记录。因此,该表将显示总记录100,但只显示一次说15条记录。所以必须有7页(6页有15条记录,1页有10条记录)。
上面的例子总共只有100条记录,内存可能很容易加载它们。但在实际生产中,它可能是数千或数百万条记录。有谁知道我可以使用的任何算法?我可以提供的参数是页码和每页的记录数。
答案 0 :(得分:4)
据我了解,你关心的是记忆。
如果单个表(A和B)没有按时间戳排序,那么您需要将所有记录合并到一个文件中,然后使用一些基于文件的排序算法(类似于MergeSort,在一次通过中,您将获得已排序的记录对,在第二遍你得到排序4s等)。当您的文件包含按时间戳升序排列的所有记录时,您可以将其分成页面。
如果表已经排序,则需要将合并 N个已排序的序列合并为一个。我建议您组织某种Heap来跟踪N个来源中哪一个具有最小时间戳的项目。在伪代码中,它看起来像这样:
for i=1,N
{
Add the 1st record from each table to the Heap
}
while(Heap not empty)
{
x = take the smallest item from the heap, noting which table j this record belonged to
Add x to output
if (the j-th table is not completely processed)
{
take the next value from the j-th table and insert it into the heap
}
}
复杂度为O(M * logN),其中M是表中记录的总数,N是表的数量。如果N足够大(我的猜测是~100),整个Heap的东西只值得麻烦。否则我会选择线性搜索和O(N * M)。