设为首页 加入收藏

TOP

矩阵乘法(五):置换(一)
2019-09-06 00:26:07 】 浏览:95
Tags:矩阵 乘法 置换

      矩阵乘法在一些置换问题上有着很好的应用,特别置换次数较多时,采用矩阵快速幂运算可以加快运算过程。

      任意一个置换都能够表示成矩阵的形式。比如,将序列1  2  3  4 置换为 3  1  2  4,相当于以下的矩阵乘法:

          

      一般来说,对于序列1, 2, ..., n,若给出置换方法a1,a2,...,an ,该置换方法表示将原序列的第pi位置上的元素换到第i位置上。

        则可以构造置换矩阵P为: P[ai][i]=1 (1<=i<=n), 其余元素全为0。

        显然,置换矩阵每行只有一个元素为1,其余为0。

        另外,构造的置换矩阵都是可逆的,并且它的逆矩阵等于它的转置矩阵。

【例1】解码字符串。

      给定n个数,代表一个置换。一个长度为n的字符串s经过m次置换后变成另一个字符串t。

      例如,输入5个数:2  3  1  5  4 代表一个置换操作。字符串s为“hello”,经过3次置换操作

"hello"  ->  "elhol"  ->  "lhelo"  ->  "helol"后,可得到字符串t为“helol”。

      输入n、m和结果字符串t,输出转换前的原字符串s。

      (1)编程思路。

       由置换规则  2 3 1 5 4,可以快速构造用于字符串s转换到t的置换矩阵P。

   

 

       而从字符串t转换到s显然是逆操作,而置换矩阵的逆矩阵就是其转置矩阵。因此,用于本题的置换矩阵PT应为:    

     

 

      构造好置换矩阵后,m次操作就是置换矩阵的m次幂,之后再乘以初始序列{1 2 3 4 ....n},然后输出相应位置的字符就可以了。

      (2)源程序。

#include <stdio.h>
#include <string.h>
struct Matrix
{
      int mat[81][81]; // 存储矩阵中各元素
};
Matrix matMul(Matrix a ,Matrix b,int n)
{
      Matrix c;
      memset(c.mat,0,sizeof(c.mat));
      int i,j,k;
      for (k = 1; k<=n ; k++)
           for (i=1 ;i<=n ; i++)
               if (a.mat[i][k]!=0)
                   for (j = 1 ;j<=n ;j++)
                        c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) ;
      return c;
}
Matrix quickMatPow(Matrix a ,int n,int b) // n阶矩阵a快速b次幂
{
      Matrix c;
      memset(c.mat ,0 ,sizeof(c.mat));
      int i;
      for (i = 1 ;i <= n ;i++)
            c.mat[i][i] = 1;
      while (b!=0)
      {
           if (b & 1)
                c = matMul(c ,a ,n); // c=c*a;
           a = matMul(a ,a ,n); // a=a*a
           b /= 2;
      }
      return c;
}
int main()
{
      int n,m,p[81],i;
      Matrix a,b,ans;
      char str[82];
      while (scanf("%d%d",&n,&m) && n!=0 && m!=0)
      {
            memset(b.mat,0,sizeof(b.mat));
            for (i=1;i<=n;i++)
                 b.mat[1][i]=i;
            memset(a.mat,0,sizeof(a.mat));
            for (i=1;i<=n;i++)
            {
                  scanf("%d",&p[i]);
      &n

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇c++数据结构笔记01 下一篇[SNOI2019]字符串

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目