一、线上事故:给 3 到 97 段城墙统一加防御 buff,逐段循环加 95 次,多段叠加时 3 万次写入卡顿 200 毫秒;差分标记把区间加变成两次写入。
二、底层原理:差分是前缀和的逆操作:区间 [i,j] 加 v 只需头尾两点标记,全部标记完一遍前缀还原每段实际加成,区间数量与长度解耦。
三、正确代码:
错误写法。示例代码如下:
local function addRange(a, i, j, v)
for k = i, j do
a[k] = a[k] + v -- 逐段加,95段写95次
end
end
正确写法。示例代码如下:
local diff = {}
local function mark(i, j, v)
diff[i] = (diff[i] or 0) + v
diff[j + 1] = (diff[j + 1] or 0) - v -- 两点标记区间
end
local function apply(n)
local cur, out = 0, {}
for k = 1, n do
cur = cur + (diff[k] or 0)
out[k] = cur -- 前缀还原每段加成
end
return out
end
sendmsg(actor, 1, "沙巴克防线加成段数 " .. #apply(100))
四、引擎验证:6 个区间标记共覆盖 300 段:逐段版 300 次写入 200 毫秒;差分版 12 次标记加 100 次前缀 2 毫秒,结果 100% 一致。
五、FAQ:问:查询多还是改多?答:批量改多查少用差分,查询多改少用前缀和。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、规则机制 线上事故:服务器闪断半分钟,重连后半小时打的经验金币全部蒸发——进度一直只在内存里,唯一的落档点挂在…
【游戏】 一、规则机制 隐蔽的坑:版本升级把存钱字段从 money 改名 gold,老玩家的档里还是旧键名,读档时取 gol…
【语法】 一、机制原理 一行代码拆解:local name = nick = "" and nick or "无名侠客"。这…
【游戏】 一、规则机制 抛个问题:怎么防止玩家把两把武器同时穿上刷双倍攻击?答案是把"槽位"作为唯一占位单位:武器、头盔、护…
【语法】 一、机制原理 线上事故:运营在后台上新活动,前端取配置 cfg.activity.reward.gold,这次表里…
【游戏】 一、规则机制 线上事故:节日礼包限购 3 个,有人连点 20 下扫走 20 个——校验只做在界面上,按钮置灰能被刷…