যদি ম্যাট্রিক্সের একটি চেইন দেওয়া হয়, তাহলে গুণ করার জন্য আমাদের ম্যাট্রিকের সঠিক ক্রমটির ন্যূনতম সংখ্যা খুঁজে বের করতে হবে।
আমরা জানি যে ম্যাট্রিক্স গুণনটি সহযোগী, তাই চারটি ম্যাট্রিক্স ABCD, আমরা এই ক্রমগুলিতে A(BCD), (AB)(CD), (ABC)D, A(BC)D, গুণ করতে পারি। এই সিকোয়েন্সের মতো, আমাদের কাজ হল কোন ক্রমটি গুণ করার জন্য কার্যকর তা খুঁজে বের করা।
প্রদত্ত ইনপুটে একটি অ্যারে বলা আছে 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