2014-10-19 4 views
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 

업데이트 : (! 추가 정보를 요청한는)

그래서, cells의 각 셀은 스도쿠 그리드에 사각형을 나타냅니다. value 속성은 셀 값이 결정되면 설정됩니다 (그렇지 않으면 nil입니다). domain은 가능한 모든 값의 테이블입니다. backupCellsrestoreCells에 대한 호출 사이에서 순방향 검사가 완료되고 셀의 값/도메인이 상당히 변경됩니다. serial 이러한 변경이 발생하지 않습니다.

일반적으로 복원은 "실행 취소"이므로 솔버는 다른 값을 추측하여 거기에서 검사를 전달할 수 있습니다.

+0

필자는 왜 그들이 쓰여졌는지 잘 모르겠다. 유용한 대답을 위해서는'셀'의 정확한 레이아웃 (의미와 근거가 필요함)이 필요하다. 또한 관심사 사이에, 호출 사이에 '셀'이 발생할 수 있으며 '연속'은 어떻게 될지도 모릅니다. – Deduplicator

+0

스도쿠 해결사에 대한 추가 정보를 포함하도록 게시물을 업데이트했습니다! – FourierTransformer

답변

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 

다음, 당신은 단지 (의 클론)을 사용하여, 기존의 보드를 던져 저장된 보드.