local function fShallowCopy(tData)
local tOutput = {}
for k,v in ipairs(tData) do
tOutput[k] = v
end
return tOutput
end
local function fLexTblSort(tA,tB) --sorter for tables
for i=1,#tA do
if tA[i]~=tB[i] then
return tA[i]<tB[i]
end
end
return false
end
function fBWT(tData)
--setup--
local iSize = #tData
local tSolution = {}
local tSolved = {}
--key table--
for n=1,iSize do
tData[iSize] = fRemove(tData,1)
tSolution[n] = fShallowCopy(tData)
end
table.sort(tSolution,fLexTblSort)
--encode output--
for i=1,iSize do
tSolved[i] = tSolution[i][iSize]
end
--finalize--
for i=1,iSize do
if fIsEqual(tSolution[i],tData) then
return i,tSolved
end
end
return false
end
以上是我目前在Lua中實現BWT編碼的代碼。這個問題是因爲表的大小和循環的長度,需要很長時間才能運行。對於1000個字符的輸入,平均編碼時間約爲1.15秒。有沒有人有建議做出更快的BWT編碼功能?在Lua中快速實施BWT
最大的減速似乎在fLexTblSort和fShallowCopy中。我已經在BWT功能之上加入了這兩個功能。
儘管這是一個非常輝煌的解決方案,但它似乎並不能解決問題。您的快速排序和比較器功能與我的舊功能運行時間相同。仍然感謝您的幫助!我想它只是不會移交給Lua。 – HDeffo
是的。 Lua比C慢一些。如果你尋求性能,你可以嘗試在C中實現壓縮並將函數導出到Lua。它可能會變得更快。還取決於你的Lua實現,如果它反覆複製表,或者使用單引用作爲C版本。 – Jakuje
不幸的是,在這個項目中不能使用其他語言。我可能只需要將BWT編碼從我的壓縮中解脫出來,並受到壓縮損失較小的影響 – HDeffo