有没有办法对分裂数组进行排序?

时间:2015-08-02 09:26:29

标签: java arrays algorithm

我有三个整数数组(arr1arr2arr3)存储在三个不同的数据库中db1.tabledb2.table,{{1} })。我无法从表中检索整个数组,因为它们太大而无法将其存储到内存中。

我需要从整个数组(数组的并集)中获取所有排序数据,从db3.table10*n索引的升序排序10*(n+1)。我无法检索整个数组,找到它们的联合并对其进行排序。但是对于任何这些数组,我都可以从n >= 010*n按升序检索排序数据。

10*(n+1)

是否有比通过所有阵列进行愚蠢搜索更好的算法?

1 个答案:

答案 0 :(得分:2)

执行跨数据库联合,如果数据库位于同一节点或群集中,大多数引擎都允许您执行此操作。

mysql> select * from test.nums;
+------+
| num  |
+------+
|    1 |
|    3 |
|    5 |
|    7 |
|    9 |
+------+
mysql> select * from test2.nums;
+------+
| num  |
+------+
|    2 |
|    4 |
|    6 |
|    8 |
+------+
mysql> select * from test.nums union select * from test2.nums order by num limit 3, 6;
+------+
| num  |
+------+
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
+------+

如果由于某种原因对您不起作用,在代码中执行此操作的方法是使用游标和三向合并。

假设您可以执行“来自test.nums ORDER BY num的SELECT num”以及另一个“来自test2.nums ORDER BY NUM的SELECT num”(和第三次),那么你将有三个游标来迭代代码中的结果集。现在这取决于连接到数据库的驱动程序的实现,但是游标通常可以使用管理内存的滑动窗口。这意味着您可以透明地迭代整个记录集,但一次只能部分内存。

一旦有了三个游标,就开始一次一个地迭代元素的排序列表。如果你还记得mergesort算法,这就像它的合并阶段,只有三个列表而不是两个。

在迭代游标时,您需要做的另一件事就是忽略在位置x * 100之前添加到已排序合并数组的每个元素,从那里开始添加,并在到达时断开循环(x 1)* 100