Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में मैट्रिक्स चेन गुणन (A O(N^3) Solution)

यदि आव्यूहों की एक श्रृंखला दी गई है, तो हमें गुणा करने के लिए आव्यूहों के सही अनुक्रम की न्यूनतम संख्या ज्ञात करनी होगी।

हम जानते हैं कि मैट्रिक्स गुणा सहयोगी है, इसलिए चार मैट्रिक्स एबीसीडी, हम इन अनुक्रमों में ए (बीसीडी), (एबी) (सीडी), (एबीसी) डी, ए (बीसी) डी गुणा कर सकते हैं। इन अनुक्रमों की तरह, हमारा कार्य यह पता लगाना है कि कौन सा क्रम गुणा करने के लिए कुशल है।

दिए गए इनपुट में arr कहने वाला एक ऐरे है, जिसमें arr[] ={1, 2, 3, 4} शामिल है। इसका मतलब है कि मैट्रिक्स (1 x 2), (2 x 3), (3 x 4) क्रम के हैं।

इनपुट - इनपुट मैट्रिसेस के आदेश। {1, 2, 3, 4}। इसका मतलब है कि मैट्रिक्स हैं

{(1 x 2), (2 x 3), (3 x 4)}.

आउटपुट - संचालन की न्यूनतम संख्या को इन तीन मैट्रिक्स को गुणा करने की आवश्यकता है। यहां परिणाम 18 है।

एल्गोरिदम

matOrder(array, n)
Input: List of matrices, the number of matrices in the list.
Output: Minimum number of matrix multiplication.
Begin
   define table minMul of size n x n, initially fill with all 0s
   for length := 2 to n, do
      for i:=1 to n-length, do
         j := i + length – 1
         minMul[i, j] := ∞
         for k := i to j-1, do
            q := minMul[i, k] + minMul[k+1, j] + array[i-1]*array[k]*array[j]
            if q < minMul[i, j], then
               minMul[i, j] := q
            done
         done
      done
   return minMul[1, n-1]
End

उदाहरण

#include<iostream>
using namespace std;
int matOrder(int array[], int n){
   int minMul[n][n]; //holds the number of scalar multiplication needed
   for (int i=1; i<n; i++)
      minMul[i][i] = 0; //for multiplication with 1 matrix, cost is 0
      for (int length=2; length<n; length++){ //find the chain length starting from 2
         for (int i=1; i<n-length+1; i++){
            int j = i+length-1;
            minMul[i][j] = INT_MAX; //set to infinity
            for (int k=i; k<=j-1; k++){
               //store cost per multiplications
               int q = minMul[i][k] + minMul[k+1][j] + array[i-1]*array[k]*array[j];
               if (q < minMul[i][j])
                  minMul[i][j] = q;
            }
      }
   }
   return minMul[1][n-1];
}
int main(){
   int arr[] = {1, 2, 3, 4};
   int size = 4;
   cout << "Minimum number of matrix multiplications: "<<matOrder(arr, size);
}

आउटपुट

Minimum number of matrix multiplications: 18

  1. C++ . में मैट्रिक्स का ज़िगज़ैग (या विकर्ण) ट्रैवर्सल

    इस समस्या में, हमें एक 2D मैट्रिक्स दिया गया है। हमारा काम मैट्रिक के सभी तत्वों को तिरछे क्रम में प्रिंट करना है। समस्या को समझने के लिए एक उदाहरण लेते हैं, 1    2    3 4    5    6 7    8    9 आउटपुट - 1 4    2 7    

  1. सी++ में सर्पिल मैट्रिक्स III

    मान लीजिए कि हमारे पास आर पंक्तियों और सी कॉलम के साथ एक 2 आयामी ग्रिड है, हम पूर्व की ओर (r0, c0) से शुरू करते हैं। यहां, ग्रिड का उत्तर-पश्चिम कोना पहली पंक्ति और स्तंभ पर है, और ग्रिड का दक्षिण-पूर्व कोना अंतिम पंक्ति और स्तंभ पर है। हम इस ग्रिड में हर स्थिति का दौरा करने के लिए एक दक्षिणावर्त सर

  1. सी++ में मैट्रिक्स सममित है या नहीं यह जांचने के लिए प्रोग्राम

    रैखिक बीजगणित में एक मैट्रिक्स M[][] को एक सममित मैट्रिक्स कहा जाता है यदि और केवल तभी जब मैट्रिक्स का स्थानान्तरण मैट्रिक्स के बराबर हो। मैट्रिक्स का ट्रांसपोज़ तब होता है जब हम मैट्रिक्स को उसके विकर्ण पर फ़्लिप करते हैं, जिसके परिणामस्वरूप मैट्रिक्स की पंक्ति और कॉलम इंडेक्स स्विच हो जाते हैं। स