关联数组查找成本

时间:2013-02-13 13:59:45

标签: 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如何在内部存储关联数组?

2 个答案:

答案 0 :(得分:5)

实质上,所有表都是哈希表,而您的第一个表只隐式使用整数键1..n。一个体面的散列表具有良好的散列函数(两者都是给定的)需要预期的恒定时间,但在非常不可能的最坏情况下,它可能需要线性时间。你的第二个函数使用了它,第一个函数没有 - 它总是需要时间线性的表格大小。

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

无论哪种方式,你可以打赌你的房子,第二个是渐近更快。也就是说,随着元素数量接近无穷大,它将变得比线性扫描更快。在实践中,你不需要接近无限(我的直觉是几十个就足够了,可能更少)看到显着的差异。

答案 1 :(得分:4)

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

第一个是Ω(n)