需要"名字查编号"的反查表,学员写一个函数遍历原表逐个比对——每次反查 O(n),高频调用拖慢整段逻辑;正确做法是启动时一次遍历构建反查表,之后常数级查询。错误场景:
local function findIdByName(name)
for id, pname in pairs(nameById) do
if pname == name then
return id
end
end
end
每次反查都要遍历全表——1000 次反查就是 1000 次全表扫描。
启动时一次性构建反查表:遍历原表把值写成新键。规范写法。示例代码如下:
local nameById = { [101] = "裁决持有者", [102] = "沙城老兵" }
local idByName = {}
for id, name in pairs(nameById) do
idByName[name] = id
end
print(idByName["裁决持有者"])
输出 101——反查表一次构建,之后每次查询都是常数级。
三步验证:朴素遍历反查 1000 次计时;建反查表后同样 1000 次查询计时,差距立现;核对原表与反查表的键数相等,确认数据一致。
双向表封装:正反两张表同步维护,插删都更新。示例代码如下:
local function biAdd(fwd, rev, id, name)
fwd[id] = name
rev[name] = id
end
local fwd, rev = {}, {}
biAdd(fwd, rev, 101, "裁决持有者")
print(fwd[101], rev["裁决持有者"])
正向按 id 查名、反向按名查 id——双向查询都是常数级,增删改走 biAdd 保证两张表同步。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、隐蔽陷阱 打印 5 层星号金字塔,每层比上层多 2 颗星、左侧空格少 1 个——空格与星数的数量关系不清晰时,…
【游戏】 一、业务场景 帮会下午没活动,成员上线点个卯就走。狩猎场上线:每晚 8 点开门 30 分钟,场内刷固定猎物,猎杀计…
【游戏】 一、业务场景 帮战开打才发现帮会没有物资储备,临时收捐谁也不交。粮仓上线:平日捐粮入库记账,帮战期间按配给开仓领补…
【语法】 一、隐蔽陷阱 验证"任一整数的立方都能写成连续奇数之和"时,起点从 1 开始逐个试,n 稍大就长跑几百步还没对上—…
【游戏】 一、业务场景 帮会大厅一面空墙,有人提议留言,结果聊天区刷屏根本留不住。题字墙上线:花 100 帮贡刻一句题字永久…
【游戏】 一、业务场景 灯谜活动上线半小时谜底被解题工具全数搜出——谜面与谜底同放在一份客户端配置里,读表即得。服务端重构:…