2014-10-19 32 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 

接下來,你扔掉舊板,只需用(的克隆)所保存的董事會。