Javascript HTML DOM查找的时间复杂度是多少

Javascript HTML DOM查找的时间复杂度是多少,javascript,html,dom,big-o,time-complexity,Javascript,Html,Dom,Big O,Time Complexity,假设没有疯狂的优化(我在看你的Chrome) 我说的是原始的、讨厌的、不破产的、不修复的,即v6javascript、成本 下限为: document.getElementById() document.getElementsByTagName('div') lookup. 与: document.getElementById() document.getElementsByTagName('div') lookup. getElementById在现代浏览器中可以安全地假定为O(1

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

我说的是原始的、讨厌的、不破产的、不修复的,即v6javascript、成本

下限为:

document.getElementById() 
document.getElementsByTagName('div') lookup.
与:

document.getElementById() 
document.getElementsByTagName('div') lookup.

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

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


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

如果没有任何优化,getElementsByTagName将必须是O(n),即使在最好的情况下,因为最后一个元素可能就是您要查找的元素,这是否意味着浏览器在写入时为每个标记映射多个视图以最大化读取速度?这不是会稍微占用内存吗?这些映射的内存使用将是不相关的。它比缓存在内存中的单个图像(例如网站上的背景图像)要小得多。值得注意的是,
getElementsByTagName
可以假定为O(1),因为其返回类型
HTMLCollection
,是活动的(也就是说,如果您向文档中添加了正确类型的新元素,您的
HTMLCollection
将在背后更新),表示它将直接指向浏览器的内部结构。另一方面,最近比较流行的
querySelectorAll
,返回一个非活动的
NodeList
,这意味着它每次必须创建一个新的类似数组的对象,使其至少为O(n)。(好吧,无论是这样还是插入都会变得非常可怕。)如果你在为IE 6进行优化,我会敦促你重新考虑“未破产”部分。@robrich我没有优化任何东西。只是好奇。我想ie6会标记“未破产”背后的讽刺。也许为了清晰起见,我应该“空中引用”它。