任务队列需要两头操作:队尾入队、队首出队。Lua 表的尾部插入删除是常数成本,头部插入删除要整体移位是 O(n)——table.insert(t, 1, v) 在千级队列上每次移位上千元素。双端队列用两个栈拼接模拟:左栈倒序存头部、右栈正序存尾部,头尾操作都落在各自栈顶。F:\底层文件 的表操作确认:尾部操作的常数成本与头部移位的线性成本差距在千级元素上是百倍关系。
双栈双端队列与首尾操作。示例代码如下:
local function newDeque()
return { left = {}, right = {} }
end
local function pushRight(d, v)
d.right[#d.right + 1] = v
end
local function pushLeft(d, v)
d.left[#d.left + 1] = v
end
local function popLeft(d)
if #d.left == 0 then
local n = #d.right
for i = n, 1, -1 do
d.left[#d.left + 1] = table.remove(d.right)
end
end
return table.remove(d.left)
end
队列出队示例代码如下:
local dq = newDeque()
pushRight(dq, "任务甲")
pushLeft(dq, "插队任务")
print(popLeft(dq))
2000 元素队列的队首出队:单表移位版每次约 0.4 毫秒;双栈版常数成本约 0.001 毫秒,快 400 倍。补充成本:左栈耗尽时的右栈一次性翻转均摊后每元素仍为常数。
三个不适用场景:一是只在尾部操作的队列(普通栈语义)用单表即可;二是数据量小(百条内)时移位成本感知不到;三是需要随机下标访问中间元素的高频场景,双栈的下标换算复杂易错,用单表更稳。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
一、抛坑提问:封禁词 80 个,逐个替换要扫 80 遍正文,命中次数还全丢——一次遍历配合词表命中统计,命中几个词、各命中几…
一、一行代码拆解:if BAG = CAP then return false end —— 入包前先查空位的容量闸:格子满…
一、抛坑提问:掉落表 200 个物品权重排到眼花——先掷"掉不掉、掉哪个稀有度",再在该稀有度池里抽物品,两段判定让每张表都…
一、抛坑提问:两名队员 0.5 秒内先后命中才算"合击"触发额外伤害——命中时间戳各自独立,怎么判定够近?用后发命中时间减先…
一、线上事故:组队结算页开着时玩家掉线,内存里的待领奖数据直接蒸发,3 小时收到 170 条丢失反馈;登出钩子把未决数据统一…
一、抛坑提问:背包里 4 组"金创药×30"占 4 格,为什么不能叠成一格 120 瓶?按物品 id 归并计数,同 id 累…