判断两个表是否具有相同的键集。
2013-2-22 23:33:42
收藏:0
阅读:202
评论:2
我将 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")
要测试两个集合是否相等,我需要确保它们具有完全相同的键。有没有高效的方法可以做到这一点?
点赞
用户2073257
由于您关心效率问题,我会提供一种替代实现。取决于您期望的输入表格,您可能希望避免第二个循环的查找。如果预计表格相同,则效率更高,如果存在差异,则效率较低。
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
另一个版本避免查找,除非必要。这在另一组用例中可能表现得更快。
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
编辑:经过更多调研和测试,我得出结论需要区分Lua和LuaJIT。对于Lua,性能特征由Lua的解析器主导,并且由源代码记号的数量决定。对于Lua来说,这意味着Phrogz的版本很可能是更快的替代方案。对于LuaJIT,情况发生了巨大变化,因为解析器不再是问题。对于几乎所有情况,我展示的第一版本都是一种改进,当表格非常大时,第二个版本可能最好。我建议每个人运行自己的基准测试,并检查哪个版本在其环境中最好。
2013-02-15 06:27:02
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
循环遍历这两个表格并确保键在另一个表格中具有值。如果找到不匹配的情况,则立即失败;如果遍历完两个表格没有发现不匹配,返回
true。对于大小为M和N的集合来说,其时间复杂度为O(M+N)。function sameKeys(t1,t2) for k,_ in pairs(t1) do if t2[k]==nil then return false end end for k,_ in pairs(t2) do if t1[k]==nil then return false end end return true end在操作中看到:
local a,b,c,d = {},{},{},{} addToSet(a,1,2,3) addToSet(b,3,1,2,3,3,1) addToSet(c,1,2) addToSet(d,2,1) print(sameKeys(a,b)) --> true print(sameKeys(a,c)) --> false print(sameKeys(d,c)) --> true注意,测试
t[k]==nil比not t[k]更好,以处理(不太可能出现的)情况,即您已经为表格条目设置了一个false的值,并且您希望该键存在于集合中。