优化lua表备份

时间:2014-10-19 18:16:15

标签: arrays optimization lua lua-table

我正在尝试创建一个快速的Sudoku解算器,并且在我需要保存拼图状态的其中一个步骤中。我开始使用各种深度复制功能来做到这一点,但发现它很慢。最后我想出了这两个函数,但是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

更新:(已请求其他信息!)

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

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

1 个答案:

答案 0 :(得分: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

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