Array関数のJavaScript実行時の複雑さ
質問
JS規格で定義されているランタイムの複雑さは、一般的な
Array
のような関数で
push
,
pop
,
shift
,
slice
または
splice
? Esp.私はランダムな位置でエントリを削除および挿入することに興味があります。複雑さが定義されていない場合、私は、例えば、V8で何を期待できますか?
(この質問は この . また このベンチマーク を掲載しました。 ここに も気になりますが、関係ない現象かもしれません)
(非常に関連した質問として はこちら . しかし、受理された回答に対するコメントの1つに、今は間違っていると書かれています。また、採用された回答には、規格が本当にそのように定義しているのかについての言及はありません)。
どのように解決するのですか?
ECMA仕様では、境界のある複雑さは指定されていませんが、仕様のアルゴリズムから導き出すことができます。
push
は
O(1)
となりますが、実際には
O(N)
コピーコストは、スロット配列が再割り当てされる必要があるため、エンジンで定義された境界で発生します。これらの境界は通常対数です。
pop
は
O(1)
と同じような注意点があり
push
と同じですが
O(N)
のコピーは、しばしばガベージコレクションに折り込まれるため、めったに遭遇しません(たとえば、コピーコレクターは配列の使用部分のみをコピーすることができます)。
shift
は最悪の場合
O(N)
として実装できますが、特別な場合には
O(1)
として実装することも可能ですが、インデックス作成の速度を落とすという代償を払うことになります。
slice
は
O(N)
ここで
N
は
end - start
. 両方の配列への書き込みを大幅に遅くすることなく、ここでの最適化の機会はそれほど多くはありません。
splice
は、最悪の場合
O(N)
. を分割するアレイストレージ技術があります。
N
を定数で割る配列ストレージ技術がありますが、これらはインデックスの作成を著しく遅くしてしまいます。エンジンがこのような技術を使用する場合、アクセス パターンの変更によってストレージ技術を切り替えるので、異常に遅いオペレーションに気づくかもしれません。
あなたが言及しなかったもののひとつは
sort
. これは、平均的なケースで
O(N log N)
. しかし、エンジンが選択したアルゴリズムによっては、次のようになります。
O(N^2)
を得ることができる場合があります。たとえば、エンジンが QuickSort を使用する場合(InsertionSort へのレイトアウトがあっても)、よく知られているように
N^2
のケースがあります。これはアプリケーションの DoS の原因となる可能性があります。これが懸念される場合、ソートする配列のサイズを制限するか(多分、サブ配列をマージする)、HeapSortに救済されます。
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] アサインの左側にJavascriptのオブジェクトブラケット表記({ ナビゲーション } =)があります。
-
[解決済み] 文字列が空白であるかどうかをチェックする
-
[解決済み] ECMAScriptとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ソートされた数値の配列に数値を挿入する効率的な方法?
-
[解決済み] JavaScript, Node.js: Array.forEachは非同期なのか?
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] Chromeの拡張機能開発にWebStormを使用するにはどうすればよいですか?
-
[解決済み] jqueryはjavascriptのライブラリなのかフレームワークなのか?[クローズド]
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
-
[解決済み] リダイレクトされずにHTMLフォームを送信する方法
-
[解決済み] JavaScript 配列のビッグ・オー