首页 文章

优化lua表备份

提问于
浏览
1

我正在尝试创建一个快速的数独求解器,并在其中一个步骤,我需要保存拼图的状态 . 我开始使用各种深度复制功能来做到这一点,但发现它很慢 . 最后我提出了这两个功能,但luatrace显示这两个功能仍占用了大量时间 .

有没有什么可以做优化这个或是时候用C写它?

local function backupCells(cells)
    local serial = {{}, {}}
    for i = 1, #cells do
        serial[1][i] = {unpack(cells[i].domain)}
        serial[2][i] = cells[i].value
    end
    return serial
end

local function restoreCells(cells, serial)
    for i=1, #cells do
        cells[i].domain = serial[1][i]
        cells[i].value = serial[2][i]
    end
end

Update: (additional info was requested!)

因此, cells 中的每个单元格代表数独网格上的一个正方形 . 一旦确定了单元格的值,就会设置 value 属性(否则为 nil ) . domain 是包含所有可能值的表 . 在对 backupCellsrestoreCells 的调用之间完成了正向检查,并且单元格的值/域发生了很大变化 - serial 不会发生任何此类更改 .

通常,恢复是“撤消”,以便解算器可以猜测另一个值并从那里进行前向检查 .

1 回答

  • 0

    我的建议:
    简化您的单元格布局 .

    每个单元格始终是包含所有可能值的表,因此:

    • 如果 not t[1] ,我们显然犯了一个错误 .

    • 否则,如果 not t[2]t[1] 是单元格的值 .

    • 否则, t 包含多种可能性 .

    因此,您可以复制这样的板:

    local function cloneBoard(cells)
        local r = {}
        for i = 1, #cells do
            -- Option 1
            local t, cell = {}, cells[i]
            r[i] = t
            for j = 1, #cell, 1 do
                t[j] = cell[j]
            end
            -- Option 2
            r[i] = {unpack(cells[i])}
            -- Measure which option is faster for you
        end
        return r
    end
    

    接下来,你扔掉旧板,只需使用(克隆)已保存的板 .

相关问题