能够在O(1)中回答查询的数据结构“oracle”

时间:2014-08-19 19:17:11

标签: arrays algorithm data-structures

V 成为 n 元素的向量,其中每个单元格可以包含 k 可能的颜色之一,即

V[i] ∈ {c1. . . ,ck}

设计一种算法,给定V,构造一个能够在O(1)中回答以下类型的“oracle”(数据结构):

给定索引 i 和颜色 c ,这是靠近i的单元格的索引,包含颜色c? < / p>

oracle构造算法必须具有O(kn)中的复杂度,O(1)中的查询算法。

修改

O(kn)涉及时间复杂度,因此额外内存没有限制。


我的推理

给定i和c,查询应该返回索引 j

V[j] = c

最小化|我 - j |。如果没有包含颜色c的单元格,则必须返回-1。所以我猜两个函数原型应该如下:

  

ORACLE(数组V,int k)

     

QUERY(数组O,int i,int c)

数组 O 由oracle函数创建,以“保存”预处理的值,这些值随后将由函数查询在O(1)中外推。我陷入了这段经文,因为我无法理解地方价值如何才能获得正确的结果。任何提示?

1 个答案:

答案 0 :(得分:3)

正如你所说,你的oracle应该是一个NxK数组,每个索引的答案和每个颜色存储为整数索引,使索引关闭具有查询颜色的查询索引。将oracle数组初始化为全-1。然后先向前看你的阵列V,然后再做后退。当你前进时,只需跟踪V中的最后一个索引,你已经看到每种颜色k的颜色k(如果你还没有看到颜色,则为-1),然后当你继续进行V in正向顺序,如果你在索引i那么颜色j的oracle的答案是你看到颜色j的最后一个索引。然后向后浏览阵列V,并跟踪上次看到每种颜色的情况。当你在数组V中的位置j时,检查你前进时每种颜色的最近单元格的索引是什么,以及当你向后看到颜色时最后一个单元格的索引是更接近的,然后用更接近的索引覆盖oracle单元格。在向前和向后遍历数组之后,您将完全构造oracle并准备在O(1)时间内进行查询。