Arrays 一种数据结构&x201C;甲骨文”;能够回答O(1)中的问题

Arrays 一种数据结构&x201C;甲骨文”;能够回答O(1)中的问题,arrays,algorithm,data-structures,Arrays,Algorithm,Data Structures,设V为n元素的向量,其中每个单元格可以包含k可能的颜色之一,即 V[i] ∈ {c1. . . ,ck} 设计一种算法,在给定V的情况下,构造一个能够在O(1)中回答以下类型查询的“oracle”(数据结构): 给定一个索引i和一个颜色c,哪个是更接近包含颜色c的单元格i的索引 oracle构造算法必须具有O(kn)中的复杂性,查询算法必须具有O(1)中的复杂性 编辑 O(kn)涉及时间复杂度,因此附加内存没有限制 我的推理 给定i和c,查询应该返回一个带有 V[j] = c 使| i-j

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

V[i] ∈ {c1. . . ,ck}
设计一种算法,在给定V的情况下,构造一个能够在O(1)中回答以下类型查询的“oracle”(数据结构):

给定一个索引i和一个颜色c,哪个是更接近包含颜色c的单元格i的索引

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

编辑

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


我的推理

给定i和c,查询应该返回一个带有

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

ORACLE(数组V,整数k)

查询(数组O、int i、int c)


oracle函数创建数组O,以“保存”预处理的值,这些值随后将由函数查询在O(1)中外推。我被困在这篇文章中,因为我不明白如何放置值以获得正确的结果。有什么提示吗?

如您所述,您的oracle应该是一个NxK数组,每个索引和每个颜色的答案都存储为一个整数索引,使索引接近具有查询颜色的查询索引。将oracle阵列初始化为all-1。然后先向前然后向后穿过你的阵型V。前进时,只需跟踪V中的最后一个索引,其中每个颜色k都有颜色k(如果还没有看到颜色,则使用-1),然后按前进顺序通过V,如果在索引i,则颜色j的oracle的答案是看到颜色j的最后一个索引。然后向后遍历数组V,并记录最后一次看到每种颜色的时间。当您在数组V中的位置j时,检查前进时每种颜色中最近单元格的索引是什么,如果后退时看到颜色的最后一个单元格的索引更接近,则使用更接近的索引重写oracle单元格。在向前和向后遍历阵列之后,您将完全构建oracle,并在O(1)时间内准备好查询。

O允许的最大大小是多少?它能包含n*k个元素吗?@user2040251 O(kn)被声明为时间复杂性,那么我相信O也可以是一个矩阵。非常广泛:你可以构造k一维,每种颜色一个。我怀疑制作一张图是O(n)时间,所以制作k张图需要O(kn)时间。那么oracle的查找结果就是O(1)@Kevin很好很有趣的提示,我甚至不知道这个方法。