解題說明
Design an Ordered Stream
題目描述:設計一個串流資料結構,共有 n 個插槽(編號 1 到 n)。每次呼叫 insert(idKey, value) 會將 value 放入第 idKey 個插槽,並回傳從當前指標 ptr 開始的最長連續已填入值的序列。
解題思路:用一個長度為 n 的字串陣列和一個指標 ptr(初始為 1)來管理串流。每次 insert 時,將 value 放入對應位置,然後從 ptr 開始檢查,只要該位置已有值就收集並向前推進 ptr。回傳收集到的所有值。由於每個插槽最多被 ptr 掃過一次,整體操作的總時間為 O(n)。
C++ 解法
複雜度分析
時間複雜度:O(n)(均攤)— 每個插槽最多被指標掃過一次,所有 insert 操作的總時間為 O(n)。
空間複雜度:O(n) — 儲存 n 個插槽的字串值。
虛擬碼
1. Initialize stream array of size n+1 (empty strings)
2. Set ptr = 1
3. On insert(idKey, value):
a. Set stream[idKey] = value
b. Create empty result list
c. While ptr < size and stream[ptr] is not empty:
- Append stream[ptr] to result
- Increment ptr
d. Return result其他解法
雜湊表版本:不使用陣列,而用 unordered_map 儲存已插入的 (id, value)。每次 insert 後檢查 ptr 是否在 map 中。空間效率在稀疏插入時更好,但查詢速度略慢。
佇列版本:維護一個緩衝佇列,insert 時先加入佇列,再按順序彈出。適合需要處理延遲確認的情境,但實作較複雜。
延伸思考
- 如果 insert 可能被並行呼叫,如何保證線程安全?
- 若需要支持刪除操作(將某個位置清空),ptr 的邏輯該如何調整?
- 若 n 非常大但實際插入稀疏,如何優化空間?