क्रमपरिवर्तन से संख्या को
:
:
Let कश्मीर चरित्र वर्गों (AAABBC तीन चरित्र वर्गों है उदाहरण) की संख्या हो
एन [के] प्रत्येक चरित्र वर्ग में तत्वों की संख्या होने दें। (उदाहरण: एएएबीबीसी के लिए, हमारे पास एन [के] = [3,2,1] है, और एन = योग (एन [के])
अनुक्रम का प्रत्येक कानूनी क्रमपरिवर्तन तब विशिष्ट रूप से एक पथ से मेल खाता है अधूरा कश्मीर जिस तरह से पेड़।
क्रमपरिवर्तन की अद्वितीय संख्या तो कश्मीर-ary पेड़ टर्मिनल नोड्स के बाद आदेश ट्रावर्सल में पेड़-नोड के सूचकांक से मेल खाती है।
सौभाग्य से, हम वास्तव में पेड़ के ट्रैवर्सल को निष्पादित नहीं करना है - हमें केवल यह जानने की जरूरत है कि पेड़ में कितने टर्मिनल नोड लेक्सिकोग्राफिक रूप से कम हमारे नोड से हैं।पेड़ में किसी नोड पर गणना करना बहुत आसान है, से नीचे टर्मिनल नोड्स वर्तमान नोड अनुक्रम में अप्रयुक्त तत्वों का उपयोग करके क्रमपरिवर्तन की संख्या के बराबर है, जिसमें एक बंद फॉर्म समाधान है जो एक साधारण है फैक्ट्रोरियल का गुणा।
तो हमारे 6 मूल पत्र दिए गए हैं, और हमारे क्रमपरिवर्तन का पहला तत्व एक 'बी' है, हम निर्धारित करते हैं कि 5 होगा!/3! 1! 1! = 20 तत्व जो 'ए' से शुरू हुए, इसलिए हमारा क्रमपरिवर्तन संख्या 20 से अधिक होनी चाहिए। अगर हमारा पहला पत्र 'सी' था, तो हम इसे 5 के रूप में गणना कर सकते थे!/2! 2! 1! (ए नहीं) + 5!/3! 1! 1! (बी नहीं) = 30+ 20, या वैकल्पिक रूप से 60 (कुल) - 5!/3! 2! 0! (सी) = 50
इसका उपयोग करके, हम क्रमपरिवर्तन (जैसे 'बीएएबीसीए') ले सकते हैं और निम्नलिखित गणनाएं कर सकते हैं: पर्म्यूशन # = (5!/2! 2! 1!) ('बी') + 0 ('ए') + 0 ('ए') + 3!/1! 1! 1! ('बी') + 2!/1!
= 30 + 3 +2 = 35
जांच की जा रही है कि इस काम करता है: CBBAAA
(5/2 से मेल खाती है 2 1 (नहीं एक) + 5/3 1!!!!! 1! (बी नहीं)) 'सी' + 4!/2! 2! 0! (ए नहीं) 'बी' + 3!/2! 1! 0! (ए नहीं) 'बी' = (30 + 20) +6 + 3 = 59
इसी तरह, एएएबीबीसी = 0 ('ए') + 0 'ए' + '0' ए '+ 0' बी ' + 0 'बी' + 0 'सी = 0
नमूना कार्यान्वयन:
import math
import copy
from operator import mul
def computePermutationNumber(inPerm, inCharClasses):
permutation=copy.copy(inPerm)
charClasses=copy.copy(inCharClasses)
n=len(permutation)
permNumber=0
for i,x in enumerate(permutation):
for j in xrange(x):
if(charClasses[j]>0):
charClasses[j]-=1
permNumber+=multiFactorial(n-i-1, charClasses)
charClasses[j]+=1
if charClasses[x]>0:
charClasses[x]-=1
return permNumber
def multiFactorial(n, charClasses):
val= math.factorial(n)/ reduce(mul, (map(lambda x: math.factorial(x), charClasses)))
return val
संख्या से क्रमपरिवर्तन में: इस प्रक्रिया को रिवर्स में किया जा सकता है, हालांकि मुझे यकीन है कि नहीं कर रहा हूँ कुशलता से कैसे: को देखते हुए एक क्रमपरिवर्तन संख्या, और वर्णमाला जो इसे उत्पन्न किया गया था, शेष क्रमपरिवर्तन संख्या से कम या उसके बराबर नोड्स की सबसे बड़ी संख्या घटाना।
उदा। 59 की क्रमपरिवर्तन संख्या को देखते हुए, हम पहले 30 + 20 = 50 ('सी') को छोड़कर 9 घटा सकते हैं। फिर हम 'बी' (6) और दूसरा 'बी' (3) घटा सकते हैं, हमारे मूल क्रमपरिवर्तन को फिर से उत्पन्न कर सकते हैं ।
परिभाषा सेट में डुप्लिकेट तत्व नहीं होते हैं, उदाहरण के लिए, '{1,2,3} == {1,2,3,2,1} 'सोचने में सेट करें। क्या आप अपने प्रश्न को स्पष्ट कर सकते हैं? –
@ हाईफेरफॉर्मेंसमार्क जब आप तकनीकी रूप से सही होते हैं, तो यह ओपी का अर्थ है कि यह काफी स्पष्ट है। – phant0m