【发布时间】: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。从那时起,我们可以简单地通过插入排序将每个数组中的对象一一添加,直到达到范围长度。
我的问题是:
- 我在这里描述的这种算法有什么名字吗?
- 对于这个问题是否有其他算法或想法可能更适合这个问题?
感谢任何想法或帮助!
【问题讨论】:
标签: arrays algorithm sorting binary-search