2014-10-19 66 views
1

我想创建一个快速的Sudoku求解器,并在其中一个步骤中我需要保存拼图的状态。我开始使用各种深层复制功能来做到这一点,但发现它很慢。最后,我提出了这两个功能,但luatrace显示这两个功能仍然占用大量时间。优化lua表备份

有没有什么可以做到这一点,以优化或现在写在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不会发生任何此类更改。

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

+0

我不是很确定为什么它们是按原样书写的,对于任何有用的答案,“细胞”(含语义和基本原理)的确切布局是必需的。同样有趣的是,在调用之间'cells'会发生什么,'serial'会发生什么。 – Deduplicator 2014-10-19 18:45:37

+0

我已更新该帖子以包含有关数独解算器的其他信息! – FourierTransformer 2014-10-19 21:03:42

回答

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 

接下来,你扔掉旧板,只需用(的克隆)所保存的董事会。