这是一个非常通用的技巧,可用于散列以外的其他目的。下面我给出一个实现(用伪代码)。
让3个未初始化矢量,P和V大小的Ñ每个。我们将使用它们来执行数据结构所要求的操作。我们还保持变量p o s。具体实现如下:APVnpos
init:
pos <- 0
set(i,x):
if not(V[i] < pos and P[V[i]] = i)
V[i] <- pos, P[pos] <- i, pos <- pos + 1
A[i] <- x
get(i):
if (V[i] < pos and P[V[i]] = i)
return A[i]
else
return empty
数组仅存储通过s e t过程传递的值。数组V和P用作证书,可以判断A中的给定位置是否已初始化。AsetVPA
请注意,每时每刻都会初始化从0到p o s − 1的元素。因此,我们可以安全地将这些值用作A中初始化值的证书。对于初始化后的A中的每个位置i,向量P中都有一个对应的元素,其值等于i。这由V [ i ]指出。因此,如果我们查看对应的元素P [ V [ i ] ],其值为iP0pos−1AiAPiV[i]P[V[i]]i,我们知道已被初始化(因为P永远不会说谎,因为我们考虑的所有元素都已初始化)。同样,如果A [ i ]未初始化,则V [ i ]可能指向P在0范围之外的位置。p o s − 1,当我们确定它尚未初始化时,或者可能指向在该范围内的位置。但是这个特定的P [ j ]对应于A中的不同位置,因此A[i]PA[i]V[i]P0..pos−1P[j]A,所以我们知道P[j]≠i尚未初始化。A[i]
显而易见,所有这些操作都是在恒定时间内完成的。同样,每个向量使用的空间为,变量p o s的使用空间为O (1 ),因此总计为O (n )。O(n)O(1)posO(n)