2017-07-02 16 views
6

1'lerin P sayısı ve 0'ın ikili biçimiyle ifade edilen sayıların sayısını saymaya çalışıyorum. P = 2, sonra ifade sayıları 0011, 1100, 0110, 0101, 1001, 1010, böylece sayımı denedim 6.Ruby'de en iyi permütasyon sayımı algoritması

olduğunu şunlardır:

[0,0,1,1].permutation.to_a.uniq 

Ama parasını en iyi çözüm değildir büyük sayılar (P < = 30 olabilir).

En iyi permütasyon tekniği ne olabilir, yoksa bunu yapmak için herhangi bir düz matematik var mı?

+0

Sorununuzla ilgili ondalık nasıl? Öyle görünmüyor. – sawa

+0

P'nin 30'a eşit ya da daha az olması, büyük sayılar elde etme hesaplamasını nasıl etkiler? P büyüdüğünde bu kadar şiddetli değil mi? – sawa

+0

@sawa sorusunun diğer kısmı, ondalık sınır A, B'yi içerir. E.g. Sayımı A, B aralığına göre yazdırmamız gerekiyor. Örneğin. Aynı örnek için A = 5, B = 10, P = 2, bu aralıkta sadece 4 değerim var (3 & 12 hariç) – Yusuf

cevap

8

Number of permutation can be calculated using factorial.

a = [0, 0, 1, 1] 
(1..a.size).inject(:*) # => 4! => 24 

çoğaltılamaz öğeyi saymak, sen 2 ile yukarıdaki bölmek gerekiyor! ve 2! (0s 2 => numarası, 1s)


=>4!/(2! * 2!) =>p verilen için


class Fixnum 
    def factorial 
    (1..self).inject(:*) 
    end 
end 

a.size.factorial/a.group_by(&:itself).map { |k, v| v.size.factorial }.inject(:*) 
=> 6 
, orada (p*2)! permütasyon var/ve kaldırmak için (p! * p!) bölünmelidir çoğaltma:

p = 2 
(p*2).factorial/(p.factorial ** 2)            
# => 6 
+3

Kombinatorik zorlanmış okuyucular: p = 3 için 1'lerin (0'ların) siyah olacağını hayal edin. beyaz) 1, 2 ve 3 numaralı bloklar. 6 blok sipariş edilebilir 6! yolları. Şimdi bunlardan herhangi birini düşünün! düzenler (ör., w3, b1, b3, w1, w2, b2). Sadece renklerin sıralamasını önemsersek, bu sıradaki siyah blokların yeniden düzenlenmesi için kaç tane yol olduğunu sorabiliriz. İlk bloğu seçmenin 3 yolu vardır ve bunların her biri için diğer iki siyah bloğu sipariş etmek için iki yol vardır. Dolayısıyla 3 tane var! = Siyah blokların 6 renk koruyucu siparişi ... –

+4

... Bu siparişlerin her biri için 3 tane var! beyaz blokların renk koruyucu siparişleri. Bu nedenle, 6 blok verilen dizi için, 3 var! blokların renk-koruyucu siparişleri, bu yüzden falsetru bölünmüş (2p)! p! * p! İstenen sayıda permütasyon elde etmek için. –

+0

@CarySwoveland, tür açıklama için teşekkürler! – falsetru