2010-09-25 73 views
1

我意識到每個瀏覽器都會以不同的方式實現它,但是有沒有任何引用或基準指定它?Node.insertBefore的運行時間是多少?

最簡單的實現似乎是O(n)Node

編輯的孩子的數量:我跑了一些基準。下面是結果

火狐3.6.10 Linux上

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 

的Chrome 7在Linux上:

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節點,與N元素填充它,然後叫insertBefore(newchild, randominitialchild)M倍。

in dom: false意味着父節點未添加到文檔樹,所以瀏覽器不應該重新計算佈局(我希望?)

結果似乎表明,插入是O(n)

回答

1
a.insertBefore(b) 

如果節點存儲在一個鏈表中,那麼這個過程就像在b之前找到節點一樣簡單,因爲沒有向後指針,只有下一個節點指針,所以耗時O(n)。然後,我們將b之前的節點的下一個指針更改爲a

所以是的,你是對的,除非列表是雙向鏈接的,否則這個過程最好帶有一個鏈接列表,O(n)。

0

我假設節點存儲在一個雙向鏈表中,在這種情況下insertBefore將需要一段時間。單鏈表很少用於實際應用。

0

實際將節點添加到樹中所花費的時間將很少。需要花費時間的是更新和重新計算佈局。

相關問題