美文网首页
c语言矩阵乘法计算量估算

c语言矩阵乘法计算量估算

作者: 一路向后 | 来源:发表于2021-05-12 23:06 被阅读0次

1.题目描述

矩阵乘法的运算量与矩阵乘法的顺序强相关。
例如:

A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵

计算ABC有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。

编写程序计算不同的计算顺序需要进行的乘法次数。

2.输入输出

输入多行,先输入要计算乘法的矩阵个数n,每个矩阵的行数,列数,总共2n的数,最后输入要计算的法则
计算的法则为一个字符串,仅由左右括号和大写字母('A'~'Z')组成,保证括号是匹配的且输入合法!
输出需要进行的乘法次数

3.解题思路

[m,n] x [n,p] 共会有npm次乘法运算,运算后的矩阵为 [m,p]

4.源码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int mul_with_brackets(int *a, char *buf)
{
    int b[128][3];
    int m = strlen(buf);
    int u = 0;
    int v = 0;
    int i;
    int k;
    int j = 0;

    for(i=0; i<m; i++)
    {
        if(buf[i] >= 'A' && buf[i] <= 'Z')
        {
            k = buf[i] - 'A';

            /*printf("u=%d, a[%d]=%d, a[%d]=%d\n", u, 2*k, a[2*k], 2*k+1, a[2*k+1]);*/

            if(!v)
            {
                v = 1;
            }

            if(u)
            {
                b[j][0] = a[2*k];
                b[j][1] = a[2*k+1];
                b[j][2] = 0;

                /*printf("b[%d][0]=%d, b[%d][1]=%d, b[%d][1]=%d\n", j-1, b[j-1][0], j-1, b[j-1][1], j, b[j][1]);*/

                b[j-1][2] += b[j-1][0] * b[j-1][1] * b[j][1];
                b[j-1][1] = b[j][1];

                u = 2;
            }
            else
            {
                b[j][0] = a[2*k];
                b[j][1] = a[2*k+1];
                b[j][2] = 0;
                u = 1;
                j++;
            }
        }
        else if(buf[i] == '(')
        {
            if(u == 1 || u == 2)
            {

            }
            else if(u == 0)
            {
                b[j][0] = -1;
                b[j][1] = -1;
                b[j][2] = 0;
                j++;
            }

            u = 0;
        }
        else if(buf[i] == ')')
        {
            if(u == 2 || u == 1)
            {
                if(b[j-2][0] == -1 && b[j-2][1] == -1)
                {
                    j--;

                    b[j-1][0] = b[j][0];
                    b[j-1][1] = b[j][1];
                    b[j-1][2] = b[j][2];

                    /*printf("b[%d][0]=%d, b[%d][1]=%d, b[%d][2]=%d\n", j-1, b[j-1][0], j-1, b[j-1][1], j-1, b[j-1][2]);*/

                    u = 1;
                }
                else
                {
                    j--;

                    b[j-1][2] += b[j][2];

                    /*printf("b[%d][0]=%d, b[%d][1]=%d, b[%d][2]=%d\n", j-1, b[j-1][0], j-1, b[j-1][1], j-1, b[j-1][2]);*/

                    b[j-1][2] += b[j-1][0] * b[j-1][1] * b[j][1];
                    b[j-1][1] = b[j][1];

                    u = 2;
                }
            }
        }
    }

    if(!v)
    {
        return 0;
    }

    return b[0][2];
}

int main()
{
    char buf[1024];
    int a[26*2];
    int n;
    int b;
    int i;

    while(scanf("%d", &n) != EOF)
    {
        for(i=0; i<n; i++)
        {
            scanf("%d %d", a+2*i, a+2*i+1);
        }
    
        scanf("%s", buf);
    
        b = mul_with_brackets(a, buf);
    
        printf("%d\n", b);
    }

    return 0;
}

5.编译源码

$ gcc -o example examle.c -std=c89

6.运行及其结果

$ ./example
3
50 10
10 20
20 5
(A(BC))
3500

相关文章

网友评论

      本文标题:c语言矩阵乘法计算量估算

      本文链接:https://www.haomeiwen.com/subject/imizdltx.html