【问题标题】:What is the time complexity of HTML DOM lookups [closed]HTML DOM 查找的时间复杂度是多少[关闭]
【发布时间】:2012-05-04 06:51:02
【问题描述】:

假设没有疯狂的优化(我在看你的 Chrome)。

我说的是原始的、讨厌的、不坏的、不修复的,即 v6 javascript,成本。

下限为:

document.getElementById() 

对比:

document.getElementsByTagName('div') lookup.

【问题讨论】:

  • 如果您正在针对 IE 6 进行优化,我会敦促您重新考虑“没有损坏”部分。
  • @robrich 我没有优化任何东西。只是好奇。我认为 ie6 会标记“aint-broke”背后的讽刺。为了清楚起见,也许我应该“空引用”它。

标签: javascript html dom big-o time-complexity


【解决方案1】:

getElementById 在现代浏览器中可以安全地假定为O(1),因为哈希表是 id=>元素映射的完美数据结构。

如果没有任何优化,任何简单的查询(无论是 css 选择器、id 查找、类或标签名称查找)都不会比 O(n) 差,因为对所有元素进行一次迭代总是足够的。

但是,在一个好的浏览器中,我希望它有一个标记名=>元素映射,所以getElementsByTagName 也是O(1)

【讨论】:

  • 如果没有任何优化,即使在最好的情况下,getElementsByTagName 也必须是 O(n),因为最后一个元素可能是您要查找的元素
  • 那么,这是否意味着浏览器在写入时为每个标签映射多个视图以最大限度地提高读取速度?这不会稍微占用更多内存吗?
  • 这些映射的内存使用情况无关紧要。它会比例如少得多。缓存在内存中的单个图像(例如网站上的背景图像)。
  • 值得注意的是,getElementsByTagName 可以假定为 O(1),因为它的返回类型 HTMLCollection 是实时的(也就是说,如果您添加了正确类型的新元素对于文档,您的HTMLCollection 会在您背后更新),表明它将直接指向浏览器的内部结构。另一方面,最近更流行的querySelectorAll 返回一个非实时的NodeList,这意味着它每次都必须创建一个新的类似数组的对象,使其至少为 O(n)。 (好吧,无论是那个还是插入都变得非常可怕。)
猜你喜欢
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2012-04-06
  • 1970-01-01
  • 2018-11-24
  • 2014-05-27
相关资源
最近更新 更多