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にエクスポートしてみてください。それはより速くなるかもしれません。また、テーブルを何度もコピーしたり、単一バージョンのリファレンスをCバージョンとして使用する場合は、Luaの実装に依存します。 – Jakuje
残念ながら、このプロジェクトでは別の言語を使用することはできません。 BWTエンコーディングを圧縮して圧縮する必要があるかもしれませんが、圧縮の損失はわずかです – HDeffo