我意识到每个浏览器都会以不同的方式实现它,但有没有指定这个的参考或基准?
最简单的实施似乎是O(n)
Node
编辑:我运行了一些基准测试。结果如下
Linux上的FireFox 3.6.10
inserted 1000 elements into 1000 elements in 131.44 ms (average over 101 trials, 291.31 ms inc appendChild) while in dom: true
inserted 1000 elements into 10000 elements in 235.91 ms (average over 11 trials, 1311.36 ms inc appendChild) while in dom: true
inserted 1000 elements into 100000 elements in 2349.00 ms (average over 2 trials, 14150.50 ms inc appendChild) while in dom: true
inserted 1000 elements into 1000 elements in 13.13 ms (average over 101 trials, 267.00 ms inc appendChild) while in dom: false
inserted 1000 elements into 10000 elements in 67.45 ms (average over 11 trials, 1517.09 ms inc appendChild) while in dom: false
inserted 1000 elements into 100000 elements in 617.00 ms (average over 2 trials, 15214.50 ms inc appendChild) while in dom: false
Linux上的Chrome 7:
inserted 1000 elements into 1000 elements in 0.65 ms (average over 101 trials, 30.34 ms inc appendChild) while in dom: true
inserted 1000 elements into 10000 elements in 1.55 ms (average over 11 trials, 175.09 ms inc appendChild) while in dom: true
inserted 1000 elements into 100000 elements in 12.00 ms (average over 2 trials, 2255.00 ms inc appendChild) while in dom: true
inserted 1000 elements into 1000 elements in 0.49 ms (average over 101 trials, 41.13 ms inc appendChild) while in dom: false
inserted 1000 elements into 10000 elements in 1.36 ms (average over 11 trials, 301.18 ms inc appendChild) while in dom: false
inserted 1000 elements into 100000 elements in 12.00 ms (average over 2 trials, 2565.50 ms inc appendChild) while in dom: false
我创建了一个dom Node,用N
元素填充它,然后调用insertBefore(newchild, randominitialchild)
M
次。
in dom: false
表示父节点未添加到文档树中,因此浏览器不应重新计算布局(我希望?)
结果似乎表明插入是O(n)
答案 0 :(得分:1)
a.insertBefore(b)
如果节点存储在链表中,那么该过程就像在b
之前找到节点一样简单,这需要花费O(n)时间,因为没有向后指针,只有下一个节点指针。然后,我们将b
之前的节点的下一个指针更改为a
。
所以是的,你是对的,除了列表是双重链接之外,该过程最多只需要一个链表的O(n)。
答案 1 :(得分:0)
我假设节点存储在双向链表中,在这种情况下insertBefore
将占用恒定时间。单链表在实际应用中很少使用。
答案 2 :(得分:0)
将节点实际添加到树中所花费的时间将是最小的。需要时间的是更新和重新计算布局。