मैट्रिक्स श्रृंखला गुणन का अनुकूलन करें


9

यह चुनौती कई मैट्रिक्स के उत्पाद के लिए सबसे कुशल गुणन क्रम की गणना करना है ।

मानक इनपुट की एक पंक्ति पर मेट्रिसेस का आकार निर्दिष्ट है। आपको मानक आउटपुट पर प्रिंट करना चाहिए पूर्णांकों की एक सूची उस क्रम को दर्शाती है जिसमें कुल गुणा लागत को कम करने के लिए गुणन करना है।

उदाहरण 1

इनपुट

5x6 6x12 12x100 100x7

उत्पादन

3 2 1

इनपुट लाइन एक मैट्रिक्स-आकार की अंतरिक्ष-अलग-अलग सूची होगी, जिनमें से प्रत्येक पंक्तियों की संख्या है, उसके xबाद कॉलम की संख्या है। उदाहरण के लिए, 4 मैट्रिसेस को एक साथ गुणा करने के लिए (इसलिए 3 कुल गुणन) हैं, और चूंकि मैट्रिक्स गुणन सहयोगी है इसलिए उन्हें किसी भी क्रम में किया जा सकता है।

आउटपुट वह क्रम होना चाहिए जिसमें कुल लागत को कम करने के लिए गुणन करना है। यह अगले प्रदर्शन करने के लिए गुणक के सूचकांक का प्रतिनिधित्व करने वाले पूर्णांकों की एक अलग-अलग सूची होनी चाहिए। एन मैट्रिसेस के लिए, इस सूची में एन -1, समावेशी के माध्यम से नंबर 1 होना चाहिए। उदाहरण 1 के लिए, आउटपुट का 3 2 1मतलब है कि आपको 12x100 * 100x7पहले गुणा करना चाहिए , फिर 6x12 * 12x7गुणा (पिछले चरण का दूसरा मैट्रिक्स परिणाम), फिर अंत में परिणाम 5x6 * 6x7गुणा करना चाहिए।

मैट्रिक्स गुणन हमेशा संगत होगा, अर्थात मैट्रिक्स के कॉलम की संख्या बाद के मैट्रिक्स की पंक्तियों की संख्या से मेल खाएगी। मान लें कि दो मेट्रिसेस AxB * BxCको गुणा करने की लागत है A*B*C

आपके कोड को 100 मैट्रिसेस तक की सूचियों को संभालना होगा, प्रत्येक आयाम को 999 तक, और उचित समय में ऐसा करना होगा।

उदाहरण 2

इनपुट

5x10 10x5 5x15 15x5

उत्पादन

1 3 2

या

3 1 2

उदाहरण 3

इनपुट

22x11 11x78 78x123 123x666 666x35 35x97 97x111 111x20 20x50

उत्पादन

2 3 4 5 6 7 8 1

नोट: सत्यापन के लिए, तीन उदाहरणों के लिए सबसे अच्छी कुल लागत 9114, 750 और 1466344 है।

सबसे छोटा कोड जीतता है!


क्या आप अंतिम उदाहरण के बारे में निश्चित हैं? मेरे कोड द्वारा दी गई कुल लागत 1466344 है।
हॉवर्ड

@ हॉवर्ड: हां, आप सही कह रहे हैं, मेरे कोड में एक बग। फिक्स्ड।
कीथ रान्डेल

जवाबों:


1

रूबी, 176 172 205 अक्षर

यहाँ एक और संस्करण है (कई चार्ट अधिक लंबा) जो उचित समय में बड़े इनपुट के लिए भी चलेगा।

q=(gets.split<<$_[/\d+$/]).map &:to_i
r=Hash.new{|h,i|h[i]=Hash.new{|h,j|h[j]=1e12;h[j]=i==j ?[0,[]]:(i...j).map{|k|a,c=r[i][k];b,d=r[k+1][j];[a+b+q[i-1]*q[k]*q[j],c+d+[k]]}.min}}
$><<r[1][q.size-1][1]*' '

पहला संस्करण: रूबी में सीधे पुनरावर्ती कार्यान्वयन। यह पूर्ण खोज करता है और इस प्रकार बड़े इनपुट पर धीमा हो सकता है।

k=->m{m[2]?(1..m.size-2).map{|l|s=k[m[0,l]+m[l+1..-1]];[m[l-1]*m[l]*m[l+1]+s[0],[l]+s[1].map{|u|u<l ?u:u+1}]}.min: [0,[]]}
$><<k[(gets.split<<$_[/\d+$/]).map &:to_i][1]*' '

चुनौती का एक हिस्सा उचित समय में 100 मैट्रिसेस को संभालना है, जो यह कोड नहीं करता है।
कीथ रान्डेल

@KeithRandall आह, मैंने वह वाक्य नहीं पढ़ा (और मुझे यह पसंद नहीं है - यह एक बहुत मजबूत संयम है)। मैं एक समाधान बनाने की कोशिश करूंगा जो इस मामले को भी संभाल सकता है।
हावर्ड 14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.