[解決済み] ソートされた数値の配列に数値を挿入する効率的な方法?
2022-03-03 11:12:58
質問
ソートされたJavaScriptの配列があり、その配列にもう1つアイテムを挿入して、結果の配列をソートしたままにしたい。 私は確かに単純なクイックソートスタイルの挿入関数を実装することができました。
var array = [1,2,3,4,5,6,7,8,9];
var element = 3.5;
function insert(element, array) {
array.splice(locationOf(element, array) + 1, 0, element);
return array;
}
function locationOf(element, array, start, end) {
start = start || 0;
end = end || array.length;
var pivot = parseInt(start + (end - start) / 2, 10);
if (end-start <= 1 || array[pivot] === element) return pivot;
if (array[pivot] < element) {
return locationOf(element, array, pivot, end);
} else {
return locationOf(element, array, start, pivot);
}
}
console.log(insert(element, array));
警告
このコードには、配列の先頭に挿入しようとしたときに発生するバグがあります。
insert(2, [3, 7 ,9]
) は、正しくない [ 3, 2, 7, 9 ] を生成します。
しかし、Array.sort関数の実装が、私のために、そしてネイティブに、これを行う可能性があることに気づきました。
var array = [1,2,3,4,5,6,7,8,9];
var element = 3.5;
function insert(element, array) {
array.push(element);
array.sort(function(a, b) {
return a - b;
});
return array;
}
console.log(insert(element, array));
2番目の実装ではなく、1番目の実装を選択する正当な理由はあるのでしょうか?
編集 : 一般的なケースでは、O(log(n))挿入(最初の例で実装)は一般的なソートアルゴリズムより高速であることに注意してください。しかし、これは特にJavaScriptでは必ずしもそうとは限りません。そのことに注意してください。
- いくつかの挿入アルゴリズムのベストケースは O(n) で、これはまだ O(log(n)) とは大きく異なりますが、以下に述べる O(n log(n)) ほどではありません。 これは、使用される特定のソートアルゴリズムに起因するものでしょう ( JavascriptのArray.sortの実装は? )
- JavaScript の sort メソッドはネイティブ関数であり、潜在的に大きな利点を実現します -- 巨大な係数を持つ O(log(n)) は、適度な大きさのデータセットでは O(n) よりはるかに悪い場合もあります。
どのように解決するのか?
Windows 7 の Chrome を使って、10万個のソート済み数値の配列に1000個のランダムな要素を挿入する方法を試してみたところ、1つのデータが得られました。
First Method:
~54 milliseconds
Second Method:
~57 seconds
つまり、少なくともこの設定においては、ネイティブメソッドでは補えないのです。 これは、1000の配列に100の要素を挿入するような小さなデータセットでも同様です。
First Method:
1 milliseconds
Second Method:
34 milliseconds
関連
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み】TypeError: res.status は関数ではありません。
-
[解決済み] 数値の配列の和の求め方
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] JavaScriptで2つの数値の間の乱数を生成する
-
[解決済み] 簡単な面接問題が難しくなった:1~100の数字が与えられたとき、ちょうどk個の数字が欠けていることを見つけなさい。
-
[解決済み] 配列の項目を別の配列にコピーする
-
[解決済み] AngularJSのコントローラからビューにHTMLを挿入する
-
[解決済み】元の配列を変異させずに配列を並べ替えるには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】node.js TypeError: path must be absolute or specify root to res.sendFile [JSONのパースに失敗しました]。
-
[解決済み] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングした
-
[解決済み】「Uncaught TypeError: Chromeで "Illegal invocation "が発生する。
-
[解決済み】ある要素が可視DOMに存在するかどうかを確認するにはどうすればいいですか?
-
[解決済み】別のjsファイル内でJavaScriptの関数を呼び出す
-
[解決済み】未定義のプロパティ 'bind' を読み込めない。React.js【重複あり
-
[解決済み] エラー。モジュールhtmlが見つからない
-
[解決済み】WebpackとBabelで「このファイルタイプを扱うには適切なローダーが必要な場合があります。
-
[解決済み】Kendo Observable Bindingと併用する場合、Kendo Switch Labelsを変更することは可能ですか?[Kendo-UI]です。
-
[解決済み] [Solved] JavascriptのArray.sortの実装は?