【问题标题】:Optimizing a lua table backup优化 lua 表备份
【发布时间】:2014-12-14 17:42:21
【问题描述】:

我正在尝试创建一个快速的数独求解器,并且在其中一个步骤中我需要保存拼图的状态。我开始使用各种深拷贝功能来做到这一点,但发现它很慢。最后我想出了这两个函数,但 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 不会引起任何此类变化。

通常,还原是一种“撤消”,因此求解器可以猜测另一个值并从那里进行前向检查。

【问题讨论】:

  • 我不太确定为什么要按原样编写它们,对于任何有用的答案,需要cells 的确切布局(具有语义和基本原理)。同样有趣的是,在通话之间cells 会发生什么,serial 可能会发生什么。
  • 我已经更新了帖子以包含一些关于数独求解器的额外信息!

标签: arrays optimization lua lua-table


【解决方案1】:

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

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

  • 如果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

接下来,你扔掉旧的棋盘,只使用保存的棋盘(的克隆)。

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 2013-10-11
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    相关资源
    最近更新 更多