Trouver si la matrice donnée est Toeplitz ou non

Trouver si la matrice donnée est Toeplitz ou non

Étant donné une matrice carrée avec[][] de commande n votre tâche est de vérifier s'il s'agit d'une matrice Toeplitz.

Note: Une matrice de Toeplitz - également appelée matrice diagonale constante - est une matrice dans laquelle les éléments de chaque diagonale descendante individuelle sont les mêmes de gauche à droite. De manière équivalente pour tout tapis d'entrée[i][j], c'est la même chose que mat[i-1][j-1] ou mat[i-2][j-2] et fils.

Exemples :

Saisir: avec[][] = [ [6 7 8]
[4 6 7]
[1 4 6] ]
Sortir: Oui
Explication: Toutes les diagonales de la matrice donnée sont [6 6 6] [7 7] [8] [4 4] [1]. Pour chaque diagonale, comme tous les éléments sont identiques, la matrice donnée est la matrice de Toeplitz.

Saisir: avec[][] = [ [6 3 8]
[4 9 7]
[1 4 6] ]
Sortir: Non
Explication: Les principaux éléments diagonaux de la matrice donnée sont [6 9 6]. Comme les éléments diagonaux ne sont pas les mêmes, la matrice donnée n'est pas la matrice de Toeplitz.

[Approche attendue - 1] - Vérification de chaque diagonale - O(n * n) Temps et O(1) Espace

L'idée est de parcourir chaque diagonale descendante de la matrice en utilisant chaque élément de la première ligne et chaque élément de la première colonne comme point de départ et de vérifier que chaque élément le long de cette diagonale correspond à la valeur en tête.

Suivez les étapes ci-dessous :

  • Laisser n = mat.size() et m = mat[0].size() .
  • Pour chaque index de colonne i depuis 0 à m - 1 appel checkDiagonal(mat 0 i) ; s'il renvoie faux, renvoie immédiatement faux de isToeplitz .
  • Pour chaque index de ligne i depuis 0 à n - 1 appel checkDiagonal(mat i 0) ; s'il renvoie faux, renvoie immédiatement faux de isToeplitz .
  • Si tous les appels à checkDiagonal réussir, retourner vrai.
  • Dans checkDiagonal(mat x y) comparer mat[i][j] à mat[x][y] pour chacun i = x+1 j = y+1 alors que i < n && j < m ; renvoie false au premier décalage, sinon renvoie true après avoir atteint le bord.

Ci-dessous est donné le mise en œuvre:

C++
   #include          using     namespace     std  ;   // function to check if diagonal elements are same   bool     checkDiagonal  (  vector   <  vector   <  int  >>     &  mat       int     x       int     y  )     {      int     n     =     mat  .  size  ()     m     =     mat  [  0  ].  size  ();      for  (  int     i     =     x     +     1       j     =     y     +     1  ;         i      <     n     &&     j      <     m  ;     i  ++       j  ++  )     {      if  (  mat  [  i  ][  j  ]     !=     mat  [  x  ][  y  ])      return     false  ;      }      return     true  ;   }   // Function to check whether given   // matrix is toeplitz matrix or not   bool     isToeplitz  (  vector   <  vector   <  int  >>     &  mat  )     {      int     n     =     mat  .  size  ()     m     =     mat  [  0  ].  size  ();      // check each descending diagonal starting from      // first row and first column of the matrix      for  (  int     i     =     0  ;     i      <     m  ;     i  ++  )      if  (  !  checkDiagonal  (  mat       0       i  ))      return     false  ;      for  (  int     i     =     0  ;     i      <     n  ;     i  ++  )         if  (  !  checkDiagonal  (  mat       i       0  ))      return     false  ;          // if all diagonals are same return true      return     true  ;   }   int     main  ()     {      vector   <  vector   <  int  >>     mat     =     {      {  6       7       8  }      {  4       6       7  }      {  1       4       6  }      };      if  (  isToeplitz  (  mat  ))     {      cout      < <     'Yes'  ;      }     else     {      cout      < <     'No'  ;      }      return     0  ;   }   
Java
   import     java.util.*  ;   class   GfG     {      // function to check if diagonal elements are same      static     boolean     checkDiagonal  (  List   <  List   <  Integer  >>     mat       int     x       int     y  )     {      int     n     =     mat  .  size  ()     m     =     mat  .  get  (  0  ).  size  ();      for  (  int     i     =     x     +     1       j     =     y     +     1  ;         i      <     n     &&     j      <     m  ;     i  ++       j  ++  )     {      if  (  !  mat  .  get  (  i  ).  get  (  j  ).  equals  (  mat  .  get  (  x  ).  get  (  y  )))      return     false  ;      }      return     true  ;      }      // Function to check whether given      // matrix is toeplitz matrix or not      static     boolean     isToeplitz  (  List   <  List   <  Integer  >>     mat  )     {      int     n     =     mat  .  size  ()     m     =     mat  .  get  (  0  ).  size  ();      // check each descending diagonal starting from      // first row and first column of the matrix      for  (  int     i     =     0  ;     i      <     m  ;     i  ++  )      if  (  !  checkDiagonal  (  mat       0       i  ))      return     false  ;      for  (  int     i     =     0  ;     i      <     n  ;     i  ++  )         if  (  !  checkDiagonal  (  mat       i       0  ))      return     false  ;      // if all diagonals are same return true      return     true  ;      }      public     static     void     main  (  String  []     args  )     {      List   <  List   <  Integer  >>     mat     =     Arrays  .  asList  (      Arrays  .  asList  (  6       7       8  )      Arrays  .  asList  (  4       6       7  )      Arrays  .  asList  (  1       4       6  )      );      if  (  isToeplitz  (  mat  ))     {      System  .  out  .  println  (  'Yes'  );      }     else     {      System  .  out  .  println  (  'No'  );      }      }   }   
Python
   # function to check if diagonal elements are same   def   checkDiagonal  (  mat     x     y  ):   n     m   =   len  (  mat  )   len  (  mat  [  0  ])   i     j   =   x   +   1     y   +   1   while   i    <   n   and   j    <   m  :   if   mat  [  i  ][  j  ]   !=   mat  [  x  ][  y  ]:   return   False   i   +=   1   j   +=   1   return   True   # Function to check whether given   # matrix is toeplitz matrix or not   def   isToeplitz  (  mat  ):   n     m   =   len  (  mat  )   len  (  mat  [  0  ])   # check each descending diagonal starting from   # first row and first column of the matrix   for   i   in   range  (  m  ):   if   not   checkDiagonal  (  mat     0     i  ):   return   False   for   i   in   range  (  n  ):   if   not   checkDiagonal  (  mat     i     0  ):   return   False   # if all diagonals are same return true   return   True   mat   =   [   [  6     7     8  ]   [  4     6     7  ]   [  1     4     6  ]   ]   if   isToeplitz  (  mat  ):   print  (  'Yes'  )   else  :   print  (  'No'  )   
C#
   using     System  ;   using     System.Collections.Generic  ;   class     GfG     {      // function to check if diagonal elements are same      static     bool     checkDiagonal  (  List   <  List   <  int  >>     mat       int     x       int     y  )     {      int     n     =     mat  .  Count       m     =     mat  [  0  ].  Count  ;      for  (  int     i     =     x     +     1       j     =     y     +     1  ;         i      <     n     &&     j      <     m  ;     i  ++       j  ++  )     {      if  (  mat  [  i  ][  j  ]     !=     mat  [  x  ][  y  ])      return     false  ;      }      return     true  ;      }      // Function to check whether given      // matrix is toeplitz matrix or not      static     bool     isToeplitz  (  List   <  List   <  int  >>     mat  )     {      int     n     =     mat  .  Count       m     =     mat  [  0  ].  Count  ;      // check each descending diagonal starting from      // first row and first column of the matrix      for  (  int     i     =     0  ;     i      <     m  ;     i  ++  )      if  (  !  checkDiagonal  (  mat       0       i  ))      return     false  ;      for  (  int     i     =     0  ;     i      <     n  ;     i  ++  )         if  (  !  checkDiagonal  (  mat       i       0  ))      return     false  ;      // if all diagonals are same return true      return     true  ;      }      static     void     Main  ()     {      var     mat     =     new     List   <  List   <  int  >>     {      new     List   <  int  >     {  6       7       8  }      new     List   <  int  >     {  4       6       7  }      new     List   <  int  >     {  1       4       6  }      };      if  (  isToeplitz  (  mat  ))     {      Console  .  WriteLine  (  'Yes'  );      }     else     {      Console  .  WriteLine  (  'No'  );      }      }   }   
JavaScript
   // function to check if diagonal elements are same   function     checkDiagonal  (  mat       x       y  )     {      let     n     =     mat  .  length       m     =     mat  [  0  ].  length  ;      for  (  let     i     =     x     +     1       j     =     y     +     1  ;         i      <     n     &&     j      <     m  ;     i  ++       j  ++  )     {      if  (  mat  [  i  ][  j  ]     !==     mat  [  x  ][  y  ])      return     false  ;      }      return     true  ;   }   // Function to check whether given   // matrix is toeplitz matrix or not   function     isToeplitz  (  mat  )     {      let     n     =     mat  .  length       m     =     mat  [  0  ].  length  ;      // check each descending diagonal starting from      // first row and first column of the matrix      for  (  let     i     =     0  ;     i      <     m  ;     i  ++  )      if  (  !  checkDiagonal  (  mat       0       i  ))      return     false  ;      for  (  let     i     =     0  ;     i      <     n  ;     i  ++  )         if  (  !  checkDiagonal  (  mat       i       0  ))      return     false  ;      // if all diagonals are same return true      return     true  ;   }   let     mat     =     [      [  6       7       8  ]      [  4       6       7  ]      [  1       4       6  ]   ];   if  (  isToeplitz  (  mat  ))     {      console  .  log  (  'Yes'  );   }     else     {      console  .  log  (  'No'  );   }   

Sortir
Yes 

[Approche attendue - 2] - Vérification en diagonale au-dessus de l'élément - O(n * n) Temps et O(1) Espace

L'idée est d'analyser chaque cellule à partir de la deuxième ligne et de la deuxième colonne en comparant chaque valeur à sa voisine en haut à gauche. Si un élément diffère de celui situé en diagonale au-dessus, vous avez constaté une violation de la propriété Toeplitz et pouvez vous arrêter immédiatement ; si vous parcourez toute la matrice sans décalage, chaque diagonale est constante.

Suivez les étapes ci-dessous :

  • Laisser n = mat.size() et m = mat[0].size() .
  • Répéter i de 1 à n - 1 et à l'intérieur de cela j de 1 à m - 1 .
  • Si mat[i][j] != mat[i - 1][j - 1] à tout moment revenir false .
  • Une fois que toutes les paires ont été vérifiées sans discordance, retournez true .

Ci-dessous est donné le mise en œuvre:

C++
   #include          using     namespace     std  ;   // Function to check whether given   // matrix is toeplitz matrix or not   bool     isToeplitz  (  vector   <  vector   <  int  >>     &  mat  )     {      int     n     =     mat  .  size  ()     m     =     mat  [  0  ].  size  ();      // check diagonally above element of      // each element in the matrix      for  (  int     i     =     1  ;     i      <     n  ;     i  ++  )     {      for  (  int     j     =     1  ;     j      <     m  ;     j  ++  )     {      if  (  mat  [  i  ][  j  ]     !=     mat  [  i     -     1  ][  j     -     1  ])      return     false  ;      }      }          // if all diagonals are same return true      return     true  ;   }   int     main  ()     {      vector   <  vector   <  int  >>     mat     =     {      {  6       7       8  }      {  4       6       7  }      {  1       4       6  }      };      if  (  isToeplitz  (  mat  ))     {      cout      < <     'Yes'  ;      }     else     {      cout      < <     'No'  ;      }      return     0  ;   }   
Java
   import     java.util.*  ;   class   GfG     {      // Function to check whether given      // matrix is toeplitz matrix or not      static     boolean     isToeplitz  (  List   <  List   <  Integer  >>     mat  )     {      int     n     =     mat  .  size  ()     m     =     mat  .  get  (  0  ).  size  ();      // check diagonally above element of      // each element in the matrix      for  (  int     i     =     1  ;     i      <     n  ;     i  ++  )     {      for  (  int     j     =     1  ;     j      <     m  ;     j  ++  )     {      if  (  mat  .  get  (  i  ).  get  (  j  )     !=     mat  .  get  (  i     -     1  ).  get  (  j     -     1  ))      return     false  ;      }      }          // if all diagonals are same return true      return     true  ;      }      public     static     void     main  (  String  []     args  )     {      List   <  List   <  Integer  >>     mat     =     Arrays  .  asList  (      Arrays  .  asList  (  6       7       8  )      Arrays  .  asList  (  4       6       7  )      Arrays  .  asList  (  1       4       6  )      );      if  (  isToeplitz  (  mat  ))     {      System  .  out  .  println  (  'Yes'  );      }     else     {      System  .  out  .  println  (  'No'  );      }      }   }   
Python
   # Function to check whether given   # matrix is toeplitz matrix or not   def   isToeplitz  (  mat  ):   n     m   =   len  (  mat  )   len  (  mat  [  0  ])   # check diagonally above element of   # each element in the matrix   for   i   in   range  (  1     n  ):   for   j   in   range  (  1     m  ):   if   mat  [  i  ][  j  ]   !=   mat  [  i   -   1  ][  j   -   1  ]:   return   False   # if all diagonals are same return true   return   True   mat   =   [   [  6     7     8  ]   [  4     6     7  ]   [  1     4     6  ]   ]   if   isToeplitz  (  mat  ):   print  (  'Yes'  )   else  :   print  (  'No'  )   
C#
   using     System  ;   using     System.Collections.Generic  ;   class     GfG     {      // Function to check whether given      // matrix is toeplitz matrix or not      static     bool     isToeplitz  (  List   <  List   <  int  >>     mat  )     {      int     n     =     mat  .  Count       m     =     mat  [  0  ].  Count  ;      // check diagonally above element of      // each element in the matrix      for  (  int     i     =     1  ;     i      <     n  ;     i  ++  )     {      for  (  int     j     =     1  ;     j      <     m  ;     j  ++  )     {      if  (  mat  [  i  ][  j  ]     !=     mat  [  i     -     1  ][  j     -     1  ])      return     false  ;      }      }          // if all diagonals are same return true      return     true  ;      }      static     void     Main  ()     {      var     mat     =     new     List   <  List   <  int  >>     {      new     List   <  int  >     {  6       7       8  }      new     List   <  int  >     {  4       6       7  }      new     List   <  int  >     {  1       4       6  }      };      if  (  isToeplitz  (  mat  ))     {      Console  .  WriteLine  (  'Yes'  );      }     else     {      Console  .  WriteLine  (  'No'  );      }      }   }   
JavaScript
   // Function to check whether given   // matrix is toeplitz matrix or not   function     isToeplitz  (  mat  )     {      let     n     =     mat  .  length       m     =     mat  [  0  ].  length  ;      // check diagonally above element of      // each element in the matrix      for  (  let     i     =     1  ;     i      <     n  ;     i  ++  )     {      for  (  let     j     =     1  ;     j      <     m  ;     j  ++  )     {      if  (  mat  [  i  ][  j  ]     !==     mat  [  i     -     1  ][  j     -     1  ])      return     false  ;      }      }          // if all diagonals are same return true      return     true  ;   }   let     mat     =     [      [  6       7       8  ]      [  4       6       7  ]      [  1       4       6  ]   ];   if  (  isToeplitz  (  mat  ))     {      console  .  log  (  'Yes'  );   }     else     {      console  .  log  (  'No'  );   }   

Sortir
Yes 

[Approche alternative] - Utilisation du hachage - O(n * n) Temps et O(n) Espace

L'idée est d'attribuer un identifiant unique à chaque diagonale inférieure droite (l'index de ligne moins l'index de colonne) et d'utiliser une carte de hachage pour enregistrer la première valeur vue pour cette diagonale. Lorsque vous analysez la matrice entière, vous calculez cette clé pour chaque cellule et vérifiez qu'elle correspond à la valeur stockée ou si elle est nouvelle, stockez-la. Une seule inadéquation vous permet de vous en sortir avec false ; sinon vous concluez vrai à la fin.

Suivez les étapes ci-dessous :

  • Déterminez les dimensions de la matrice (nombre de lignes et nombre de colonnes) à partir de mat .
  • Créer une hashmap vide mp pour mapper chaque touche diagonale à sa valeur représentative.
  • Parcourez chaque cellule de mat par son index de ligne i et index de colonne j .
  • Pour chaque cellule, formez la clé diagonale en soustrayant j depuis i .
  • Si mp détient déjà cette clé, compare l'élément actuel à la valeur stockée ; s'ils diffèrent, retournez false immédiatement.
  • Si la clé n'est pas encore insérée mp enregistrez l'élément actuel sous cette clé.
  • Si vous terminez le parcours sans aucune incompatibilité, renvoyez true.

Illustration:

Le diagramme ci-dessous donne une meilleure visualisation de cette idée. Considérez la diagonale de couleur jaune. La différence entre la valeur x et la valeur y de tout indice sur cette diagonale est de 2 (2-0 3-1 4-2 5-3). La même chose peut être observée pour toutes les diagonales du corps.

Trouver si la matrice donnée est Toeplitz ou non

Pour la couleur rouge, la différence diagonale est de 3. Pour la couleur verte, la différence diagonale est de 0. Pour la couleur orange, la différence diagonale est de -2 et ainsi de suite...

Ci-dessous est donné le mise en œuvre:

C++
   #include          using     namespace     std  ;   // Function to check whether given   // matrix is toeplitz matrix or not   bool     isToeplitz  (  vector   <  vector   <  int  >>     &  mat  )     {      int     n     =     mat  .  size  ()     m     =     mat  [  0  ].  size  ();          // HashMap to store keyvalue pairs      unordered_map   <  int       int  >     mp  ;          for  (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      for  (  int     j     =     0  ;     j      <     m  ;     j  ++  )     {      int     key     =     i     -     j  ;          // If key value exists in the hashmap      if     (  mp  [  key  ])     {          // check if the value is same       // as the current element      if     (  mp  [  key  ]     !=     mat  [  i  ][  j  ])      return     false  ;      }          // Else we put keyvalue pair in hashmap      else     {      mp  [  i     -     j  ]     =     mat  [  i  ][  j  ];      }      }      }      return     true  ;   }   int     main  ()     {      vector   <  vector   <  int  >>     mat     =     {      {  6       7       8  }      {  4       6       7  }      {  1       4       6  }      };      if  (  isToeplitz  (  mat  ))     {      cout      < <     'Yes'  ;      }     else     {      cout      < <     'No'  ;      }      return     0  ;   }   
Java
   // JAVA program to check whether given matrix   // is a Toeplitz matrix or not   import     java.util.*  ;   class   GFG     {      static     boolean     isToeplitz  (  int  [][]     matrix  )      {      // row = number of rows      // col = number of columns      int     row     =     matrix  .  length  ;      int     col     =     matrix  [  0  ]  .  length  ;      // HashMap to store keyvalue pairs      HashMap   <  Integer       Integer  >     map      =     new     HashMap   <  Integer       Integer  >  ();      for     (  int     i     =     0  ;     i      <     row  ;     i  ++  )         {      for     (  int     j     =     0  ;     j      <     col  ;     j  ++  )         {      int     key     =     i     -     j  ;      // if key value exists in the hashmap      if     (  map  .  containsKey  (  key  ))         {      // we check whether the current value      // stored in this key matches to element      // at current index or not. If not      // return false      if     (  map  .  get  (  key  )     !=     matrix  [  i  ][  j  ]  )      return     false  ;      }      // else we put keyvalue pair in hashmap      else     {      map  .  put  (  i     -     j       matrix  [  i  ][  j  ]  );      }      }      }      return     true  ;      }      // Driver Code      public     static     void     main  (  String  []     args  )      {      int  [][]     matrix     =     {     {     12       23       -  32     }      {     -  20       12       23     }      {     56       -  20       12     }      {     38       56       -  20     }     };          // Function call      String     result     =     (  isToeplitz  (  matrix  ))     ?     'Yes'     :     'No'  ;      System  .  out  .  println  (  result  );      }   }   
Python
   # Python3 program to check whether given matrix   # is a Toeplitz matrix or not   def   isToeplitz  (  matrix  ):   # row = number of rows   # col = number of columns   row   =   len  (  matrix  )   col   =   len  (  matrix  [  0  ])   # dictionary to store keyvalue pairs   map   =   {}   for   i   in   range  (  row  ):   for   j   in   range  (  col  ):   key   =   i  -  j   # if key value exists in the map   if   (  key   in   map  ):   # we check whether the current value stored   # in this key matches to element at current   # index or not. If not return false   if   (  map  [  key  ]   !=   matrix  [  i  ][  j  ]):   return   False   # else we put keyvalue pair in map   else  :   map  [  key  ]   =   matrix  [  i  ][  j  ]   return   True   # Driver Code   if   __name__   ==   '__main__'  :   matrix   =   [[  12     23     -  32  ]   [  -  20     12     23  ]   [  56     -  20     12  ]   [  38     56     -  20  ]]   # Function call   if   (  isToeplitz  (  matrix  )):   print  (  'Yes'  )   else  :   print  (  'No'  )   
C#
   using     System  ;   using     System.Collections.Generic  ;   class     GfG     {      // Function to check whether given      // matrix is toeplitz matrix or not      static     bool     isToeplitz  (  List   <  List   <  int  >>     mat  )     {      int     n     =     mat  .  Count       m     =     mat  [  0  ].  Count  ;          // HashMap to store keyvalue pairs      Dictionary   <  int    int  >     mp     =     new     Dictionary   <  int    int  >  ();          for  (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      for  (  int     j     =     0  ;     j      <     m  ;     j  ++  )     {      int     key     =     i     -     j  ;          // If key value exists in the hashmap      if     (  mp  .  ContainsKey  (  key  ))     {          // check if the value is same       // as the current element      if     (  mp  [  key  ]     !=     mat  [  i  ][  j  ])      return     false  ;      }          // Else we put keyvalue pair in hashmap      else     {      mp  [  i     -     j  ]     =     mat  [  i  ][  j  ];      }      }      }      return     true  ;      }      static     void     Main  ()     {      var     mat     =     new     List   <  List   <  int  >>     {      new     List   <  int  >     {  6       7       8  }      new     List   <  int  >     {  4       6       7  }      new     List   <  int  >     {  1       4       6  }      };      if  (  isToeplitz  (  mat  ))     {      Console  .  WriteLine  (  'Yes'  );      }     else     {      Console  .  WriteLine  (  'No'  );      }      }   }   
JavaScript
   // Function to check whether given   // matrix is toeplitz matrix or not   function     isToeplitz  (  mat  )     {      let     n     =     mat  .  length       m     =     mat  [  0  ].  length  ;          // HashMap to store keyvalue pairs      const     mp     =     new     Map  ();          for  (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      for  (  let     j     =     0  ;     j      <     m  ;     j  ++  )     {      let     key     =     i     -     j  ;          // If key value exists in the hashmap      if     (  mp  .  has  (  key  ))     {          // check if the value is same       // as the current element      if     (  mp  .  get  (  key  )     !==     mat  [  i  ][  j  ])      return     false  ;      }          // Else we put keyvalue pair in hashmap      else     {      mp  .  set  (  i     -     j       mat  [  i  ][  j  ]);      }      }      }          return     true  ;   }   let     mat     =     [      [  6       7       8  ]      [  4       6       7  ]      [  1       4       6  ]   ];   if  (  isToeplitz  (  mat  ))     {      console  .  log  (  'Yes'  );   }     else     {      console  .  log  (  'No'  );   }   

Sortir
Yes