2016-04-11 17 views
1

Şu anda, boş olmayan bir dizi farklı pozitif tamsayılar için benzersiz bir group_ID üretmek için gereken bir Javascript projesi üzerinde çalışıyorum: Bu durumda Javascript - farklı pozitif tamsayılar dizisi için ikili bir temsili hızlı bir şekilde nasıl oluşturabilirim

var a = [1, 2, 5]

, bir ikili sayı ile bu dizi tespit etmek istiyorum: 0b11001 (yani, bir ikili sayı elemanları 1, 2 ve 5 grupta olduğunu söyler ve diğer elementler bulunmadığına). Burada sipariş önemli değil, bu yüzden [2, 1, 5] veya [5, 1, 2] için aynı group_ID === 0b11001'u alırdım.

Bu kimliği yerel JS veya alt çizgi/lodash kullanarak oluşturmanın hızlı bir yolu olup olmadığını merak ediyorum.

cevap

4

Hile, her öğe için karşılık gelen ikili sayıyı almak için 1 öğesinin sol tarafından kaydırılmasıdır. Sonra onları toplamak için bit usulü kullanmak "veya":

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

Ya tek astar olarak biraz daha "modern":

bu sadece JavaScript 32 kadar sayıları için çalışacağını
groupId = a.reduce(function(p, c) {return p | (1 << (c - 1));}, 0); 

Not . Daha büyük sayılar için, grup kimlikleri için bir dizi kullanmanız gerekecektir (belki de bir BitSet sınıfında gizlenmiş)

p.s. sayılar> 32 (dahil 0) için:

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

daha moderner 'a.reduce ((p, c) => p | 1 << (c - 1), 0);' – CupawnTae

+0

teşekkür ederiz! 32'den büyük sayılar için çalışmanın kolay bir yolu olmadığı talihsiz bir durumdur. Buraya geldiğim çözüm şu şekildedir: 'groupId = _.reduce (a, function (bin, s) {return bin + Math. pow (2, s-1)}, 0) .toString (2) 'buna rağmen bir String dizisi çıkar. Meraktan, JS ikili diziler vs Strings ile çalışırken daha hızlı olacak? –

+0

Evet ikili sayılar daha hızlıdır ve çözümünüz çoğaltmaları denetlemelidir (eğer oluşabileceklerse) ve hala 53 ile sınırlıdır. –

İlgili konular