【问题标题】:Associative array lookup cost关联数组查找成本
【发布时间】:2013-01-29 02:23:49
【问题描述】:

考虑两个查找函数:

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

【问题讨论】:

  • 这里有3个问题,没有一个

标签: algorithm lua big-o array-algorithms


【解决方案1】:

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

第一个是Ω(n)

【讨论】:

    【解决方案2】:

    本质上,所有表都是哈希表,而您的第一个表只是隐式使用整数键 1..n。一个写得体面的哈希表和一个体面的哈希函数(都是给定的)需要预期的恒定时间,尽管在非常不可能最坏的情况下它可能需要线性时间。您的第二个函数利用了它,第一个函数没有 - 它总是需要与表格大小成线性关系的时间。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 2014-01-02
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多