2017-07-02 18 views
6

में सर्वश्रेष्ठ क्रमपरिवर्तन गिनती एल्गोरिदम मैं बाइनरी रूप में 1 और 0 के पी संख्या द्वारा व्यक्त की गई संख्याओं की संख्या को गिनने की कोशिश कर रहा हूं। पी = 2 है, तो संख्या व्यक्त कर रहे हैं 0011, 1100, 0110, 0101, 1001, 1010, इसलिए गिनती 6.रूबी

मैंने कोशिश की है:

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

लेकिन यह के लिए सबसे अच्छा समाधान नहीं है बड़ी संख्या (पी < = 30 हो सकता है)।

सर्वश्रेष्ठ क्रमपरिवर्तन तकनीक क्या हो सकती है, या क्या हमारे पास ऐसा करने के लिए कोई सीधा आगे गणित है?

+0

आपके मुद्दे के लिए दशमलव कैसे प्रासंगिक है? ऐसा नहीं लगता है। – sawa

+0

यह तथ्य कैसे है कि पी 30 से कम या उससे कम हो सकता है बड़ी संख्या में गणना के लिए गणना को प्रभावित करता है? पी बड़ा होने पर वह गंभीर नहीं है? – sawa

+0

@sawa प्रश्न के दूसरे भाग में एक दशमलव सीमा ए, बी E.g शामिल है। हमें किसी दिए गए श्रेणी ए, बी के आधार पर गिनती मुद्रित करने की आवश्यकता है। जैसे एक ही उदाहरण के लिए ए = 5, बी = 10, पी = 2 तो मेरे पास इस श्रेणी में केवल 4 मान हैं (3 और 12 को छोड़कर) – Yusuf

उत्तर

8

Number of permutation can be calculated using factorial.

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

दोहराया आइटम गिनती करने के लिए, आप 2 के साथ ऊपर विभाजित करने के लिए की जरूरत है! और 2! (2 => 0 की संख्या, 1s)


=>4!/(2! * 2!) => 6

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

a.size.factorial/a.group_by(&:itself).map { |k, v| v.size.factorial }.inject(:*) 
=> 6 

दिया p के लिए, वहाँ (p*2)! क्रमपरिवर्तन है/और दूर करने के लिए (p! * p!) द्वारा विभाजित किया जाना चाहिए डुप्लिकेशन:

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

कॉम्बिनेटोरिक्स-चुनौतीपूर्ण पाठक: पी = 3 के लिए कल्पना करें कि 1 (0) काला हो (सफेद) ब्लॉक 1, 2 और 3. क्रमांकित 6 ब्लॉक 6 आदेश दिया जा सकता है! तरीके। अब उन 6 में से किसी एक पर विचार करें! ऑर्डरिंग (उदा।, डब्ल्यू 3, बी 1, बी 3, डब्ल्यू 1, डब्ल्यू 2, बी 2)। अगर हम केवल रंगों के क्रम के बारे में परवाह करते हैं, तो हम पूछ सकते हैं कि इस अनुक्रम में काले ब्लॉक कितने तरीकों से पुन: व्यवस्थित किए जा सकते हैं। पहले ब्लॉक को चुनने के 3 तरीके हैं और उनमें से प्रत्येक के लिए दो अन्य ब्लैक ब्लॉकों को ऑर्डर करने के दो तरीके हैं। इसलिए, 3 हैं! = काले रंग के 6 रंग-संरक्षण आदेश ... –

+4

... उन आदेशों में से प्रत्येक के लिए 3 हैं! सफेद ब्लॉक के रंग-संरक्षण आदेश। इसलिए, 6 ब्लॉक के दिए गए अनुक्रम के लिए, 3! * 3 हैं! ब्लॉक के रंग-संरक्षण आदेश, यही कारण है कि falsetru विभाजित (2 पी)! पी द्वारा! * पी! क्रमपरिवर्तन की वांछित संख्या प्राप्त करने के लिए। –

+0

@CarySwoveland, दयालु स्पष्टीकरण के लिए धन्यवाद! – falsetru