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

【入门夯实】数组交集与差集的集合运算实现

2026-09-25 10:42 作者:996 技术组 996引擎Lua教程传奇脚本入门夯实996引擎Lua集合运算交集差集

学员常见误区

求两个数组的交集与差集,学员用双层循环遍历比对——O(n²) 在千级数据时约 50 万次比较。集合运算的正确姿势是用辅助表做哈希查找:O(n+m) 一次遍历完成。另一个误区是以为 Lua 有内置的集合运算函数——需要自己封装。错误场景:

lua
local function intersectBad(a, b)
    local out = {}
    for _, va in ipairs(a) do
        for _, vb in ipairs(b) do
            if va == vb then
                table.insert(out, va)
            end
        end
    end
    return out
end

双层循环 O(n²) 在千级数据时效率低下。

正确姿势

用辅助表做哈希查找:O(n+m) 一次遍历完成交集与差集。规范写法。示例代码如下:

lua
local function toSet(t)
    local s = {}
    for _, v in ipairs(t) do
        s[v] = true
    end
    return s
end
local function intersect(a, b)
    local sb = toSet(b)
    local out = {}
    for _, v in ipairs(a) do
        if sb[v] then
            out[#out + 1] = v
        end
    end
    return out
end
local function difference(a, b)
    local sb = toSet(b)
    local out = {}
    for _, v in ipairs(a) do
        if not sb[v] then
            out[#out + 1] = v
        end
    end
    return out
end

交集遍历 a 查 b 的集合表,差集遍历 a 查 b 的集合表取不在 b 中的——同一辅助表支持交集与差集两种运算。

引擎验证

三步验证:a={1,2,3} b={2,3,4} 的交集为 {2,3}、差集为 {1}、并集为 {1,2,3,4};空数组与非空数组的交集为空;辅助表方案对 1000 条数据的耗时远低于双层循环。

举一反三

并集用同样的辅助表模式:先遍历 a 加入结果,再遍历 b 查 a 的集合表取不在 a 中的追加——两种集合运算共用一个辅助表。示例代码如下:

lua
local function union(a, b)
    local sa = toSet(a)
    local out = {}
    for _, v in ipairs(a) do
        out[#out + 1] = v
    end
    for _, v in ipairs(b) do
        if not sa[v] then
            out[#out + 1] = v
        end
    end
    return out
end
作者履历与出处

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

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

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

LATEST ARTICLES

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