logo

Atrodiet, vai dotā matrica ir Toeplitz vai nē

Dota kvadrātveida matrica kopā ar [][] kārtībā n tavs uzdevums ir pārbaudīt, vai tā ir Toeplitz Matrix.

Piezīme: Toeplica matrica, ko sauc arī par diagonāles konstantes matricu, ir matrica, kurā katras atsevišķās dilstošās diagonāles elementi ir vienādi no kreisās uz labo pusi. Līdzvērtīgi jebkuram ieejas paklājiņam[i][j] tas ir tāds pats kā mat[i-1][j-1] vai paklājam[i-2][j-2] un son on.



Piemēri:

Ievade: ar [][] = [ [6 7 8]
[4 6 7]
[1 4 6] ]
Izvade:
Paskaidrojums: Visas dotās matricas diagonāles ir [6 6 6] [7 7] [8] [4 4] [1]. Katrai diagonālei, jo visi elementi ir vienādi, dotā matrica ir Toeplitz matrica.

Ievade: ar [][] = [ [6 3 8]
[4 9 7]
[1 4 6] ]
Izvade:
Paskaidrojums: Dotās matricas primārie diagonālie elementi ir [6 9 6]. Tā kā diagonālie elementi nav vienādi, dotā matrica nav Toeplitz matrica.



[Paredzamā pieeja — 1] — katras diagonāles pārbaude — O(n * n) laiks un O(1) telpa

Ideja ir šķērsot katru matricas lejupvērsto diagonāli, kā sākumpunktu izmantojot katru elementu pirmajā rindā un katru elementu pirmajā kolonnā, un pārbaudīt, vai katrs elements gar šo diagonāli atbilst vērtībai tā sākumā.

char uz virkni

Izpildiet tālāk norādītās darbības:

  • Ļaujietn = mat.size()unm = mat[0].size().
  • Katrai kolonnas indeksamino0uzm - 1zvanucheckDiagonal(mat 0 i); ja tas atgriež false, nekavējoties atgriezieties false noisToeplitz.
  • Katrai rindas indeksamino0uzn - 1zvanucheckDiagonal(mat i 0); ja tas atgriež false, nekavējoties atgriezieties false noisToeplitz.
  • Ja visi aicina uzcheckDiagonalizdodas atgriezties taisnība.
  • IncheckDiagonal(mat x y)salīdzinietmat[i][j]uzmat[x][y]katrami = x+1 j = y+1kamēri < n && j < m; atgriezties false pirmajā nesakritībā, pretējā gadījumā atgriezt patiesu pēc malas sasniegšanas.

Zemāk ir dota īstenošana:



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'); } 

Izvade
Yes

[Paredzamā pieeja — 2] — pārbaude pa diagonāli virs elementa — O(n * n) laiks un O(1) telpa

Ideja ir skenēt katru šūnu no otrās rindas un otrās kolonnas, salīdzinot katru vērtību ar tās augšējo kreiso kaimiņu. Ja kāds elements atšķiras no tā, kas atrodas pa diagonāli virs tā, jūs esat atklājis Toeplitz īpašības pārkāpumu un varat nekavējoties apturēt; ja iziet cauri visai matricai bez neatbilstības, katra diagonāle ir nemainīga.

Izpildiet tālāk norādītās darbības:

  • Ļaujietn = mat.size()unm = mat[0].size().
  • Atkārtotino 1 līdzn - 1un tā ietvarosjno 1 līdzm - 1.
  • Jamat[i][j] != mat[i - 1][j - 1]jebkurā brīdī atgrieztiesfalse.
  • Kad visi pāri ir pārbaudīti bez neatbilstības, atgriežastrue.

Zemāk ir dota īstenošana:

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'); } 

Izvade
Yes

[Alternatīva pieeja] — jaukšanas izmantošana — O(n * n) laiks un O(n) telpa

Ideja ir katrai lejupvērstajai diagonālei piešķirt unikālu identifikatoru (rindas indekss mīnus kolonnas indekss) un izmantot jaucējkarti, lai reģistrētu pirmo šīs diagonāles vērtību. Skenējot visu matricu, šī atslēga tiek aprēķināta katrai šūnai un vai nu pārbauda, ​​vai tā atbilst saglabātajai vērtībai, vai arī saglabā to, ja tā ir jauna. Viena neatbilstība ļauj jums glābt ar viltus; pretējā gadījumā beigās jūs secināt, ka ir taisnība.

tīmekļa draiveris

Izpildiet tālāk norādītās darbības:

  • Nosakiet matricas izmērus (rindu skaitu un kolonnu skaitu) nomat.
  • Izveidojiet tukšu hashmap mp lai kartētu katru diagonālo atslēgu ar tās reprezentatīvo vērtību.
  • Izejiet cauri katrai šūnaimatpēc rindas indeksaiun kolonnu indekssj.
  • Katrai šūnai izveidojiet diagonālo atslēgu, atņemotjnoi.
  • Jampjau ir šī atslēga, salīdziniet pašreizējo elementu ar saglabāto vērtību; ja tie atšķiras, nekavējoties atgriezt nepatiesu.
  • Ja atslēga vēl nav ievietotampierakstiet pašreizējo elementu zem šīs atslēgas.
  • Ja pabeidzat šķērsošanu bez neatbilstības, atgriežat patiesu.

Ilustrācija:

Zemāk redzamā diagramma sniedz labāku šīs idejas vizualizāciju. Apsveriet pa diagonāli dzeltenā krāsā. Atšķirība starp jebkura indeksa x vērtību un y vērtību šajā diagonālē ir 2 (2-0 3-1 4-2 5-3). To pašu var novērot visām ķermeņa diagonālēm.

Atrodiet, vai dotā matrica ir Toeplitz vai nē

Sarkanai krāsai diagonāles atšķirība ir 3. Zaļai diagonāles atšķirība ir 0. Oranžā krāsā diagonāles atšķirība ir -2 un tā tālāk...

Zemāk ir dota īstenošana:

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<intint> mp = new Dictionary<intint>();    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'); } 

Izvade
Yes