陣列極大 (如 2³²),無法 O(N) 初始化。需實現直接定址字典:
SEARCH/INSERT/DELETE 均 O(1),初始化 O(1),每元素 O(1) 空間。
stack[],大小 = 當前元素數。big[] 只存 stack 的索引 (初始值未定義無所謂)。top 指向棧頂,有效索引範圍 [0, top]。stack[++top] = {key, val}big[key] = topidx = big[key]idx < 0 || idx > top → 不存在。stack[idx].key != key → 碰撞/殘留垃圾值,不存在。stack[idx].val。SEARCH 確認存在,得 idx。stack[top] 移至 idx:stack[idx] = stack[top]big[stack[idx].key] = idx--top,big[key] = -1 (或任意無效值)。struct Node { int key, val; };
class DirectAddressDict {
vector big; // 大數組,存 stack 索引
vector stk; // 棧,存真實節點
int top = -1;
public:
DirectAddressDict(int BIG_SIZE, int MAX_ELEM) : big(BIG_SIZE), stk(MAX_ELEM) {}
void insert(int key, int val) {
stk[++top] = {key, val};
big[key] = top;
}
bool search(int key, int& val) {
int idx = big[key];
if (idx < 0 || idx > top) return false;
if (stk[idx].key != key) return false;
val = stk[idx].val;
return true;
}
void erase(int key) {
int idx = big[key];
if (idx < 0 || idx > top) return;
if (stk[idx].key != key) return;
stk[idx] = stk[top];
big[stk[idx].key] = idx;
big[key] = -1;
--top;
}
};
big[key] 指向的 stk 位置若在 [0,top] 且 key 匹配,必為最新插入值 (DELETE 會更新)。big[key] 可能落在 [0,top],但 stk[idx].key != key 會攔截。O(1) 最壞情況。這是教科書級的「空間換時間 + 延遲綁定」經典技巧,工程上常見於位圖、稀疏集合實現。