【发布时间】:2017-04-08 00:08:37
【问题描述】:
我有一个排序的非重叠间隔列表(从零开始,半开),例如
{[0, 5), [10, 20), [35, 40)}
假设我在其中一个间隔中有一个点(例如,在这种情况下为 3)和一个步长值为 +10(即向右移动 10 个位置)。有没有一种算法可以在 O(1) 时间内计算出我的最终位置? (编辑:也许我应该说,比 O(n) 更好)
区间未覆盖的数字被视为不存在的位置,因此在上述区间上使用步骤 +10 的位置 3 将导致最终位置为 19(+1 将我的位置移动到 4,然后剩余的+9 从位置10 开始直到位置19)。另一个例子是,如果我们将位置 15 作为起点,步长值为 -10,那么最终位置将是 0。
为简单起见,我们还可以假设最终位置总是以某个区间结束。然而,我们可能知道也可能不知道应该从哪个时间间隔开始计数。
我当然可以在 O(n) 时间内迭代间隔列表(n = 间隔数)。但我觉得应该有更好的方法来解决这个问题。
附:这个问题有名字吗?这感觉它应该有一个合适的名称,但我不确定它是什么。
【问题讨论】:
-
您不能只使用预处理步骤将所有值放入一个数组中,然后在 O(1) 中获取它们吗?如果您多次执行此操作(至少 Omega(n) 次),则平均成本为 O(1)...
-
您可以通过将区间排列成二叉树来轻松获得对数时间(非叶节点应同时公开其子树的最小覆盖区间和宽度的实际总和)。不过,我不确定如何达到恒定时间。
-
@Useless 您介意将您的评论转换为更详细的答案吗?我对具体细节感兴趣,显然这是一个正确的解决方案。