判断两个表是否有相同的键集

Phr*_*ogz 2 performance lua set

我将 Lua 表用作集合,将集合的值放入表键中并1作为表值,例如

function addToSet(s,...)      for _,e in ipairs{...} do s[e]=1   end end
function removeFromSet(s,...) for _,e in ipairs{...} do s[e]=nil end end

local logics = {}
addToSet(logics,true,false,"maybe")
Run Code Online (Sandbox Code Playgroud)

为了测试两组是否相等,我需要确保它们具有完全相同的键。什么是有效的方法来做到这一点?

Dan*_*rey 5

既然您询问效率,我将提供替代实现。根据您预期的输入表,您可能希望避免第二个循环的查找。如果表预计相同,则效率更高,如果存在差异,则效率较低。

function sameKeys(t1,t2)
  local count=0
  for k,_ in pairs(t1) do
    if t2[k]==nil then return false end
    count = count + 1
  end
  for _ in pairs(t2) do
    count = count - 1
  end
  return count == 0
end
Run Code Online (Sandbox Code Playgroud)

另一个版本避免查找,除非有必要。在另一组用例中,这可能会执行得更快。

function sameKeys(t1,t2)
  local count=0
  for _ in pairs(t1) do count = count + 1 end
  for _ in pairs(t2) do count = count - 1 end
  if count ~= 0 then return false end
  for k,_ in pairs(t1) do if t2[k]==nil then return false end end
  return true
end
Run Code Online (Sandbox Code Playgroud)

编辑:经过更多的研究和测试,我得出的结论是你需要区分 Lua 和 LuaJIT。对于 Lua,性能特征由 Lua 的解析器决定,因此由源代码标记的数量决定。对于 Lua 来说,这意味着 Phrogz 的版本很可能是更快的替代方案。对于 LuaJIT,情况发生了巨大的变化,因为解析器不再是问题。对于几乎所有情况,我展示的第一个版本都是改进,当表很大时,第二个版本可能是最好的。我建议每个人运行自己的基准测试并检查哪个版本最适合他们的环境。