将n组数据排序为一组

时间:2014-03-25 21:41:06

标签: arrays algorithm sorting binary-search

我有n个数据数组,每个数组都按照相同的标准排序。

在几乎所有情况下,阵列数量都不会超过10,因此数量相对较小。但是,在每个数组中,可以是大量的对象,对于我正在寻找的算法,应该将其视为无限。

我现在想要将这些数组视为一个数组。但是,我确实需要一种方法,尽可能快地检索给定范围内的对象,而不触及范围之前的所有对象和/或范围之后的所有对象。因此,不能迭代所有对象并将它们存储在一个单独的数组中。具有低起始值的提取也比具有高起始值的提取更可能。所以例如获取对象[20,40]比获取对象[1000,1020]更有可能,但它可能会发生。

范围本身将非常小,大约20个对象,或者可以增加,如果与性能相关,只要这不会达到内存限制。所以我猜想还有几百件物品也可以。

示例: 3个数组,每个包含几千个entires。我现在想要获得范围[60,80]中的整体对象,而不接触每个集合中的上部60个对象,也不接触数组中对象80之后的所有对象。

我正在考虑某种组合的,修改过的二进制搜索。我目前的想法如下(注意,这还没有完全考虑过,这只是一个想法):

  • 获取每个数组的对象60 - 范围的开头不能在此之后,因为每个数组都已满足要求
  • 将这些对象用作每个数组中二进制搜索的最大值
  • 从其中一个数组中获取居中对象(例如30)
  • 在所有其他数组中使用二进制搜索,尝试在每个数组中找到该对象,该对象将在之前,但尽可能接近拾取的对象。
  • 我们现在有3个对象,例如对象15,10和20.这些对象的总和将是45.因此前面有42个对象,这超过了我们正在寻找的范围的开始(30)。我们继续在其中一个数组
  • 的左半部分进行二分查找
  • 如果我们改为获得一个值小于我们正在寻找的范围的开头的值,我们继续在右边搜索。
  • 在某些时候我们将点击对象30.从那时起,我们可以简单地逐个添加每个数组中的对象,并使用插入排序,直到我们达到范围长度。

我的问题是:

  1. 我在这里描述的这种算法有没有名称?
  2. 是否有针对此问题的其他算法或想法,可能更适合此问题?
  3. 提前做任何想法或帮助!

1 个答案:

答案 0 :(得分:2)

人们通常称这个问题为“多个排序数组联合中的选择”。 One of the questions in the sidebar是关于两个排序数组的特例,而this question是关于一般情况的。在组合答案中出现了几种基于比较的方法;他们或多或少必须确定每个单独阵列中较低端点的位置。您的二分查找答案是更好的方法之一;由于弗雷德里克森和约翰逊,有一个渐近更快的算法,但它很复杂,对于小排名来说显然不是一个改进。