【问题标题】:Sorting n sets of data into one将 n 组数据归为一组
【发布时间】:2014-05-04 00:33:18
【问题描述】:

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

数组的数量几乎在所有情况下都不会超过 10,因此它是一个相对较小的数字。然而,在每个数组中,可以有大量对象,对于我正在寻找的算法,它们应该被视为无限。

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

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

示例: 3 个数组,每个数组包含几千个整数。我现在想要获取范围 [60, 80) 内的整体对象,而不触及每个集合中的前 60 个对象,也不触及数组中对象 80 之后的所有对象。

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

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

我的问题是:

  1. 我在这里描述的这种算法有什么名字吗?
  2. 对于这个问题是否有其他算法或想法可能更适合这个问题?

感谢任何想法或帮助!

【问题讨论】:

    标签: arrays algorithm sorting binary-search


    【解决方案1】:

    人们通常将此问题称为“在多个排序数组的联合中进行选择”。 One of the questions in the sidebar 是关于两个排序数组的特殊情况,this question 是关于一般情况。组合答案中出现了几种基于比较的方法;他们或多或少必须确定每个单独数组中的下端点在哪里。您的二进制搜索答案是更好的方法之一;由于 Frederickson 和 Johnson,有一个渐近更快的算法,但它很复杂,而且对于小等级来说显然没有改进。

    【讨论】:

    • 非常感谢您的回答和您提供的链接!我将从我的实现开始,看看它是如何执行的!再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 2013-03-12
    • 1970-01-01
    • 2021-04-04
    • 2020-03-16
    • 1970-01-01
    • 2015-12-13
    • 2017-03-03
    相关资源
    最近更新 更多