让 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)中外推。我陷入了这段经文,因为我无法理解地方价值如何才能获得正确的结果。任何提示?
答案 0 :(得分:3)
正如你所说,你的oracle应该是一个NxK数组,每个索引的答案和每个颜色存储为整数索引,使索引关闭具有查询颜色的查询索引。将oracle数组初始化为全-1。然后先向前看你的阵列V,然后再做后退。当你前进时,只需跟踪V中的最后一个索引,你已经看到每种颜色k的颜色k(如果你还没有看到颜色,则为-1),然后当你继续进行V in正向顺序,如果你在索引i那么颜色j的oracle的答案是你看到颜色j的最后一个索引。然后向后浏览阵列V,并跟踪上次看到每种颜色的情况。当你在数组V中的位置j时,检查你前进时每种颜色的最近单元格的索引是什么,以及当你向后看到颜色时最后一个单元格的索引是更接近的,然后用更接近的索引覆盖oracle单元格。在向前和向后遍历数组之后,您将完全构造oracle并准备在O(1)时间内进行查询。