web-dev-qa-db-ja.com

Google Chromeのarray.splice()の時間計算量はどれくらいですか?

次のようにsplice()を使用して配列から1つの要素を削除すると、次のようになります。

_arr.splice(i, 1);
_

最悪の場合、これはiの後のすべての要素をシフトするため、O(n)になりますか?それとも、リンクリストの魔法が下にある一定の時間ですか?

32
Ivan

最悪の場合shouldO(n)(すべての_n-1_要素を新しい配列にコピー)。

リンクリストは、1回の削除ではO(1)になります。

興味のある人のために、私はこれを怠惰に作成しました ベンチマーク 。 ( Windows XP/Vistaでは実行しないでください )。 ただし、これからわか​​るように、かなり一定に見えます(つまり、O(1))。したがって、これを非常に高速にするために、舞台裏で何をしているのかは誰にもわかりません。とにかく、実際のspliceは非常に高速であることに注意してください。

拡張ベンチマーク をV8シェルで直接再実行すると、O(n)が示唆されます。ただし、コードに影響を与える可能性のあるランタイムを取得するには、巨大な配列サイズが必要であることに注意してください。これは、memmoveを使用して新しい配列を作成するV8コードを見るかのように予想されます。

20
Andrew Marshall