Algorithm 关联数组查找成本

Algorithm 关联数组查找成本,algorithm,lua,big-o,array-algorithms,Algorithm,Lua,Big O,Array Algorithms,考虑两个查找函数: simple={1,3,5} function isX(id) for _,v in ipairs(simple) do if v==id then return true end end return false end assoc={[1]=true,[3]=true,[5]=true} function isX2(id) return assoc[id] or false end 哪个函数的查找成本较低?或者他们是平等的? Lua如何

考虑两个查找函数:

simple={1,3,5}

function isX(id) 
 for _,v in ipairs(simple) do 
  if v==id then return true end 
 end 
 return false 
end


assoc={[1]=true,[3]=true,[5]=true}

function isX2(id) 
 return assoc[id] or false 
end
哪个函数的查找成本较低?或者他们是平等的?
Lua如何在内部存储关联数组?

第二个当然更快。Lua使用基于散列的表实现,这意味着在大多数情况下直接读取将是次线性的,甚至
O(1)

第一个是
Ω(n)

本质上,所有表都是哈希表,第一个表只是隐式使用整数键
1..n
。一个写得像样的哈希表和像样的哈希函数(都是给定的)需要预期的恒定时间,尽管在极不可能的最坏情况下可能需要线性时间。您的第二个函数利用了这一点,而第一个函数没有——它总是需要时间来处理表格的大小

对用作数组(连续整数键)的表进行了优化,如中所述(您还可以找到有关哈希表的一些详细信息)。如果本文中的信息是准确的,并且我正确地解释了它,那么这个优化也应该由您的第二个表触发(使用了
1..5
中的5个索引中的3个)。所以它很可能只在一个C数组中存储五个值,并对这个数组执行有保证的常数时间索引


无论哪种方式,你都可以在你的房子里打赌,第二种方法的速度是渐进的。也就是说,当元素数量接近无穷大时,它将比线性扫描更快。实际上,你不需要去任何接近无限的地方(我的直觉是几十个就足够了,可能更少)就能看到显著的差异。

这里有三个问题,不是一个