2016-04-11 8 views
1

現在、私はJavascriptプロジェクトで作業しています。ここでは、空でない別個の正の整数の配列に対して一意のgroup_IDを素早く生成する必要があります。この場合Javascript - 異なる正の整数の配列のバイナリ表現を素早く構築する方法

var a = [1, 2, 5]

、I 2進数使用して、この配列を同定したい:0b11001(すなわち、2進数の要素1,2、及び5は、グループ内にあり、他の要素が存在しないことを言います)。ここでは、順序は関係ありませんので、私は[2, 1, 5]または[5, 1, 2]について同じgroup_ID === 0b11001を得るでしょう。

ネイティブJSまたはアンダースコア/ロダッシュのいずれかを使用してこのIDを生成する簡単な方法があるのでしょうか?

答えて

4

トリックは、要素によって左に1シフトして、各要素に対応する2進数を取得することです。これはJavaScriptのみで32までの数字のために働くことを

groupId = a.reduce(function(p, c) {return p | (1 << (c - 1));}, 0); 

注:ワンライナーとして

var groupId = 0; 
for (var i = 0; i < a.length; i++) { 
    groupId |= 1 << (a[i] - 1); 
} 

それとももう少し「現代」:そして、それらを収集するためにビット単位「または」を使用。より大きい数値の場合は、グループIDに配列を使用する必要があります(BitSetクラスでは隠されている可能性があります)。

p.s.数字> 32(0を含む)の場合:

var groupId = []; 
for (var i = 0; i < a.length; i++) { 
    var e = a[i]; 
    groupId[Math.floor(e/32)] |= 1 << (e % 32); 
} 
// convert the array to a hex string or similar for simpler handling 
+0

さらにmoderner 'a.reduce((P、C)=> P | 1 <<(C - 1)、0);' – CupawnTae

+0

ありがとうございました!私が思いついた解決策は次のとおりです: 'groupId = _.reduce(a、function(bin、s){return bin + Math。 pow(2、s-1)}、0).toString(2) 'これはStringを出力します。好奇心の外に、バイナリ数と文字列を扱うときにJSが高速になるのでしょうか? –

+0

はいバイナリの数値が速く、ソリューションで重複がないかどうかチェックする必要がありますが、それでも53に制限されています –

関連する問題