CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
高级技巧语法算法996引擎

Lua二叉堆:建堆上浮下沉的完整实现

2026-09-27 23:30 作者:996 技术组 996引擎Lua教程传奇脚本高级技巧语法算法996引擎

【语法】
一、机制原理
隐蔽的坑:优先任务调度器上线,每次取最高优先级任务都全表排序一次,任务池过千后调度本身成了大头。二叉堆是正解:数组摆成满层二叉树,下标 i 的孩子是 2i 与 2i+1,父节点恒不大于孩子(小顶堆)。两个核心动作各走一条路径:插入时新元素放末位一路上浮;弹出时末位补顶一路下沉。建堆更是妙手:从最末的非叶节点倒序逐个下沉,乱序数组一趟就理成堆,整体 O(n)。
二、错误写法

lua
-- 错误:每次取最值全表排序,任务池越大越亏
table.sort(pool, function(a, b)
    return a.pri < b.pri
end)
return table.remove(pool, 1)

三、正确写法

lua
local heap = {}
local function sink(i)
    local n = #heap
    while i * 2 <= n do
        local m = i * 2
        if m + 1 <= n and heap[m + 1] < heap[m] then
            m = m + 1
        end
        if heap[m] >= heap[i] then break end
        heap[i], heap[m] = heap[m], heap[i]
        i = m
    end
end
local function push(v)
    heap[#heap + 1] = v
    local i = #heap
    while i > 1 and heap[math.floor(i / 2)] > heap[i] do
        local p = math.floor(i / 2)
        heap[p], heap[i] = heap[i], heap[p]
        i = p
    end
end
local function pop()
    local top = heap[1]
    local last = table.remove(heap)
    if #heap > 0 then
        heap[1] = last
        sink(1)
    end
    return top
end
local function build(arr)
    heap = arr
    for i = math.floor(#heap / 2), 1, -1 do
        sink(i)
    end
end
build({9, 4, 7, 1, 8, 2})
local label = panel:getChildByName("heapText")
label:setString(tostring(pop() == 1) .. "/" .. tostring(pop() == 2))

四、引擎验证
乱序数组建堆后连续弹出,出列次序严格按值升序;建堆一轮 O(n),后续插弹各走单路径。
五、FAQ
问:建堆为什么从非叶节点倒着来?
答:叶节点天然成堆,倒序下沉让每棵子树自底向上先理好。
问:插入与弹出的开销?
答:都只走一条叶到根或根到叶的路径,对数级。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →