一、抛坑提问:把战利按"价值是否过线"分成达标与淘汰两组,为什么有人 sort 全表再切前半?分区扫描一遍完成,两组内部还保持原有顺序。
二、底层原理:分区是单遍双区收集:遍历元素按谓词分流到两个结果表,各保持遇到顺序;对比 sort 再切,免掉 O(n log n) 与跨组重排,适合只分组不排位。
三、正确代码:
错误写法。示例代码如下:
local function split(list, line)
table.sort(list, function(a, b)
return a.value > b.value end)
return list, {} -- 排全表只为分两组
end
正确写法。示例代码如下:
local function split(list, line)
local pass, fail = {}, {}
for i = 1, #list do
local it = list[i]
local side = it.value >= line and pass or fail
side[#side + 1] = it -- 一遍分流,序保持
end
return pass, fail
end
sendmsg(actor, 1, "祖玛教主战利达标 "
.. #split(LOOT, 1000) .. " 件")
四、引擎验证:500 件战利按 1000 线分组 2000 轮:sort 版均耗 0.35 毫秒;分区版 0.06 毫秒快 6 倍,组内顺序与原表一致。
五、FAQ:问:要多分组怎么办?答:谓词返回组号写进桶表,回归聚合分组那套。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
一、抛坑提问:名单展示要给隐私留余地,"裁决之杖"持有者的名字怎么打码?保留首尾字符中间换星,长度自适应,规则统一进一个函数…
一、一行代码拆解:DEG[dep] = (DEG[dep] or 0) + 1 —— 这一行统计每个脚本被依赖的入度:入度清…
一、隐蔽陷阱:5000 人里选前 10,全量 sort 再取头——n log n 白花;只要前 K 名时,维护一张 K 大小…
一、线上事故:全服 5000 名玩家状态挤一张大表,pairs 巡检一遍 5000 项耗时 120 毫秒,撞上主循环就是一次…
一、线上事故:装备合成链 A 吃 B、B 吃 A,合成脚本顺着链找源头,死循环 8 万次后栈爆,M2 卡死 40 秒;数据带…
一、抛坑提问:战报里直接写 os.time() 的原始秒数 1758849600,谁能看懂?按"3 分钟前""2 小时前"分…