JavaScript_javascript スキルで最も効率的な配列シャッフル方法を実装する

WBOY
リリース: 2016-05-16 16:34:10
オリジナル
2009 人が閲覧しました

配列の並べ替えとは、配列内のすべての要素の順序を破壊することを意味します。

一般的な方法は、配列のネイティブ ソート メソッドに関数を渡すことです。この関数は、配列要素をランダムに配置するという目的を達成するために、ランダムに 1 または -1 を返します。

コードをコピーします コードは次のとおりです:

arr.sort(function(a,b){ return Math.random()>.5 ? -1 : 1;});

この方法は直感的ですが、あまり効率的ではありません。テストしたところ、10,000 個の要素の配列をスクランブルするのにかかる時間は約 35 ミリ秒です (Firefox)

私は昔から答えを求めるのが得意だったので、効率的な方法を探しました。 原文はこちらからご覧ください

コードをコピーします コードは次のとおりです:

if (!Array.prototype.shuffle) {
Array.prototype.shuffle = function() {
for(var j, x, i = this.length; i; j = parseInt(Math.random() * i), x = this[--i], this[i] = this[j], this[j ] = x);
これを返します;
};
}
arr.shuffle();

このメソッドは、Array.prototype に shuffle という関数を追加します。ただし、名前は重要ではありません。重要なのはその効率です。

上記の 10,000 要素の配列をテストしてみましょう。このメソッドを使用すると、アウトオブオーダー操作を完了するのに 7 ~ 8 ミリ秒しかかかりません。

配列の要素を 10 倍にして 100000 個に増やすと、最初のソート方法では約 500 ミリ秒かかり、シャッフル方法では約 40 ミリ秒かかります。

完全なテストコード:

コードをコピーします コードは次のとおりです:

var count = 100000,arr = [];
for(var i=0;i.5 ? -1 : 1;});
Array.prototype.sort.call(arr,function(a,b){ return Math.random()>.5 ? -1 : 1;});
document.write(arr '
');
var t1 = 新しい Date().getTime();
document.write(t1-t);

//次の方法が最も効率的です
if (!Array.prototype.shuffle) {
Array.prototype.shuffle = function() {
for(var j, x, i = this.length; i; j = parseInt(Math.random() * i), x = this[--i], this[i] = this[j], this[j ] = x);
これを返します;
};
}
var t = new Date().getTime();
arr.shuffle();
document.write('
「ああ」
');
var t1 = 新しい Date().getTime();
document.write(t1-t);

さらに、シャッフル コードの for ループには後半がないことに気づきましたか?つまり、for(..) だけがあり、その後ろに {..} はありません。このように書くことができます。そして、実際には正常に実行されます。気になるので、ブログパークに行って聞いてみます。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート