Suchelement in einer sortierten Matrix

Gegeben sei eine sortierte Matrix zusammen mit[][] der Größe n × m und einer ganzen Zahl X Bestimmen Sie, ob x in der Matrix vorhanden ist.
Die Matrix ist wie folgt sortiert:

  • Jede Zeile ist in aufsteigender Reihenfolge sortiert.
  • Das erste Element jeder Zeile ist größer oder gleich dem letzten Element der vorherigen Zeile
    (d. h. mat[i][0] ≥ mat[i−1][m−1] für alle 1 ≤ i < n).

Beispiele:

Eingang: x = 14 mat[][] = [[ 1 5 9]
[14 20 21]
[30 34 43]]
Ausgabe: WAHR
Erläuterung: Der Wert 14 ist in der zweiten Zeile und ersten Spalte der Matrix vorhanden.

Eingang: x = 42 mat[][] = [[ 1 5 9 11]
[14 20 21 26]
[30 34 43 50]]
Ausgabe: FALSCH
Erläuterung: Der Wert 42 erscheint nicht in der Matrix.

Inhaltsverzeichnis

[Naiver Ansatz] Vergleich mit allen Elementen – O(n × m) Zeit und O(1) Raum

Die Idee besteht darin, die gesamte Matrix mat[][] zu durchlaufen und jedes Element mit x zu vergleichen. Wenn ein Element mit x übereinstimmt, geben wir true zurück. Andernfalls geben wir am Ende des Durchlaufs false zurück.

C++
   #include          #include         using     namespace     std  ;   bool     searchMatrix  (  vector   <  vector   <  int  >>&     mat       int     x  )     {      int     n     =     mat  .  size  ();      int     m     =     mat  [  0  ].  size  ();      // traverse every element in the matrix      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )     {      if     (  mat  [  i  ][  j  ]     ==     x  )      return     true  ;      }      }      return     false  ;   }   int     main  ()     {      vector   <  vector   <  int  >>     mat     =     {      {  1       5       9  }      {  14       20       21  }      {  30       34       43  }      };      int     x     =     14  ;      cout      < <     (  searchMatrix  (  mat       x  )     ?     'true'     :     'false'  )      < <     endl  ;   }   
Java
   class   GfG     {      public     static     boolean     searchMatrix  (  int  [][]     mat       int     x  )     {      int     n     =     mat  .  length  ;      int     m     =     mat  [  0  ]  .  length  ;      // traverse every element in the matrix      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )     {      if     (  mat  [  i  ][  j  ]     ==     x  )      return     true  ;      }      }      return     false  ;      }      public     static     void     main  (  String  []     args  )     {      int  [][]     mat     =     {      {  1       5       9  }      {  14       20       21  }      {  30       34       43  }      };      int     x     =     14  ;      System  .  out  .  println  (  searchMatrix  (  mat       x  )     ?     'true'     :     'false'  );      }   }   
Python
   def   searchMatrix  (  mat     x  ):   n   =   len  (  mat  )   m   =   len  (  mat  [  0  ])   # traverse every element in the matrix   for   i   in   range  (  n  ):   for   j   in   range  (  m  ):   if   mat  [  i  ][  j  ]   ==   x  :   return   True   return   False   if   __name__   ==   '__main__'  :   mat   =   [   [  1     5     9  ]   [  14     20     21  ]   [  30     34     43  ]   ]   x   =   14   print  (  'true'   if   searchMatrix  (  mat     x  )   else   'false'  )   
C#
   using     System  ;   class     GfG     {      public     static     bool     searchMatrix  (  int  [][]     mat       int     x  )     {      int     n     =     mat  .  Length  ;      int     m     =     mat  [  0  ].  Length  ;      // traverse every element in the matrix      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )     {      if     (  mat  [  i  ][  j  ]     ==     x  )      return     true  ;      }      }      return     false  ;      }      public     static     void     Main  (  string  []     args  )     {      int  [][]     mat     =     new     int  [][]     {      new     int  []     {  1       5       9  }      new     int  []     {  14       20       21  }      new     int  []     {  30       34       43  }      };      int     x     =     14  ;      Console  .  WriteLine  (  searchMatrix  (  mat       x  )     ?     'true'     :     'false'  );      }   }   
JavaScript
   function     searchMatrix  (  mat       x  )     {      let     n     =     mat  .  length  ;      let     m     =     mat  [  0  ].  length  ;      // traverse every element in the matrix      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      for     (  let     j     =     0  ;     j      <     m  ;     j  ++  )     {      if     (  mat  [  i  ][  j  ]     ===     x  )      return     true  ;      }      }      return     false  ;   }   // Driver Code   let     mat     =     [      [  1       5       9  ]      [  14       20       21  ]      [  30       34       43  ]   ];   let     x     =     14  ;   console  .  log  (  searchMatrix  (  mat       x  )     ?     'true'     :     'false'  );   

Ausgabe
true  

[Besserer Ansatz] Binäre Suche zweimal verwenden – O(log n + log m) Zeit und O(1) Raum

Zuerst suchen wir mithilfe der binären Suche die Zeile, in der sich das Ziel x befinden könnte, und wenden dann innerhalb dieser Zeile erneut die binäre Suche an. Um die richtige Zeile zu finden, führen wir eine binäre Suche nach den ersten Elementen der mittleren Zeile durch.

Schritt-für-Schritt-Implementierungen:

=> Beginnen Sie mit niedrig = 0 und hoch = n - 1.
=> Wenn x kleiner ist als das erste Element der mittleren Zeile (a[mid][0]), dann ist x kleiner als alle Elemente in Zeilen >= mid, also aktualisieren Sie high = mid - 1.
=> Wenn x größer als das erste Element der mittleren Zeile (a[mid][0]) ist, dann ist x größer als alle Elemente in Zeilen < mid so store the current mid row and update low = mid + 1.

Sobald wir die richtige Zeile gefunden haben, können wir innerhalb dieser Zeile eine binäre Suche anwenden, um nach dem Zielelement x zu suchen.

C++
   #include          #include         using     namespace     std  ;   // function to binary search for x in arr[]   bool     search  (  vector   <  int  >     &  arr       int     x  )     {      int     lo     =     0       hi     =     arr  .  size  ()     -     1  ;      while     (  lo      <=     hi  )     {      int     mid     =     (  lo     +     hi  )     /     2  ;      if     (  x     ==     arr  [  mid  ])      return     true  ;      if     (  x      <     arr  [  mid  ])      hi     =     mid     -     1  ;      else      lo     =     mid     +     1  ;      }      return     false  ;   }   // function to search element x in fully    // sorted matrix   bool     searchMatrix  (  vector   <  vector   <  int  >>     &  mat       int     x  )     {      int     n     =     mat  .  size  ()     m     =     mat  [  0  ].  size  ();      int     lo     =     0       hi     =     n     -     1  ;      int     row     =     -1  ;      while     (  lo      <=     hi  )     {      int     mid     =     (  lo     +     hi  )     /     2  ;      // if the first element of mid row is equal to x      // return true      if     (  x     ==     mat  [  mid  ][  0  ])      return     true  ;          // if x is greater than first element of mid row      // store the mid row and search in lower half      if     (  x     >     mat  [  mid  ][  0  ])     {      row     =     mid  ;      lo     =     mid     +     1  ;      }          // if x is smaller than first element of mid row      // search in upper half      else      hi     =     mid     -     1  ;      }          // if x is smaller than all elements of mat[][]      if     (  row     ==     -1  )      return     false  ;      return     search  (  mat  [  row  ]     x  );   }   int     main  ()     {      vector   <  vector   <  int  >>     mat     =     {{  1       5       9  }     {  14       20       21  }     {  30       34       43  }};      int     x     =     14  ;      if     (  searchMatrix  (  mat       x  ))      cout      < <     'true'  ;      else      cout      < <     'false'  ;      return     0  ;   }   
Java
   class   GfG     {          // function to binary search for x in arr[]      static     boolean     search  (  int  []     arr       int     x  )     {      int     lo     =     0       hi     =     arr  .  length     -     1  ;      while     (  lo      <=     hi  )     {      int     mid     =     (  lo     +     hi  )     /     2  ;      if     (  x     ==     arr  [  mid  ]  )      return     true  ;      if     (  x      <     arr  [  mid  ]  )      hi     =     mid     -     1  ;      else      lo     =     mid     +     1  ;      }      return     false  ;      }          // function to search element x in fully       // sorted matrix      static     boolean     searchMatrix  (  int  [][]     mat       int     x  )     {      int     n     =     mat  .  length       m     =     mat  [  0  ]  .  length  ;      int     lo     =     0       hi     =     n     -     1  ;      int     row     =     -  1  ;      while     (  lo      <=     hi  )     {      int     mid     =     (  lo     +     hi  )     /     2  ;      // if the first element of mid row is equal to x      // return true      if     (  x     ==     mat  [  mid  ][  0  ]  )      return     true  ;      // if x is greater than first element of mid row      // store the mid row and search in lower half      if     (  x     >     mat  [  mid  ][  0  ]  )     {      row     =     mid  ;      lo     =     mid     +     1  ;      }      // if x is smaller than first element of mid row      // search in upper half      else      hi     =     mid     -     1  ;      }      // if x is smaller than all elements of mat[][]      if     (  row     ==     -  1  )      return     false  ;      return     search  (  mat  [  row  ]       x  );      }      public     static     void     main  (  String  []     args  )     {      int  [][]     mat     =     {      {  1       5       9  }      {  14       20       21  }      {  30       34       43  }      };      int     x     =     14  ;      if     (  searchMatrix  (  mat       x  ))      System  .  out  .  println  (  'true'  );      else      System  .  out  .  println  (  'false'  );      }   }   
Python
   # function to binary search for x in arr[]   def   search  (  arr     x  ):   lo   =   0   hi   =   len  (  arr  )   -   1   while   lo    <=   hi  :   mid   =   (  lo   +   hi  )   //   2   if   x   ==   arr  [  mid  ]:   return   True   if   x    <   arr  [  mid  ]:   hi   =   mid   -   1   else  :   lo   =   mid   +   1   return   False   # function to search element x in fully    # sorted matrix   def   searchMatrix  (  mat     x  ):   n   =   len  (  mat  )   m   =   len  (  mat  [  0  ])   lo   =   0   hi   =   n   -   1   row   =   -  1   while   lo    <=   hi  :   mid   =   (  lo   +   hi  )   //   2   # if the first element of mid row is equal to x   # return true   if   x   ==   mat  [  mid  ][  0  ]:   return   True   # if x is greater than first element of mid row   # store the mid row and search in lower half   if   x   >   mat  [  mid  ][  0  ]:   row   =   mid   lo   =   mid   +   1   # if x is smaller than first element of mid row   # search in upper half   else  :   hi   =   mid   -   1   # if x is smaller than all elements of mat[][]   if   row   ==   -  1  :   return   False   return   search  (  mat  [  row  ]   x  )   if   __name__   ==   '__main__'  :   mat   =   [[  1     5     9  ]   [  14     20     21  ]   [  30     34     43  ]]   x   =   14   if   searchMatrix  (  mat     x  ):   print  (  'true'  )   else  :   print  (  'false'  )   
C#
   using     System  ;   class     GfG     {          // function to binary search for x in arr[]      static     bool     Search  (  int  []     arr       int     x  )     {      int     lo     =     0       hi     =     arr  .  Length     -     1  ;      while     (  lo      <=     hi  )     {      int     mid     =     (  lo     +     hi  )     /     2  ;      if     (  x     ==     arr  [  mid  ])      return     true  ;      if     (  x      <     arr  [  mid  ])      hi     =     mid     -     1  ;      else      lo     =     mid     +     1  ;      }      return     false  ;      }          // function to search element x in fully       // sorted matrix      static     bool     SearchMatrix  (  int  [][]     mat       int     x  )     {      int     n     =     mat  .  Length       m     =     mat  [  0  ].  Length  ;      int     lo     =     0       hi     =     n     -     1  ;      int     row     =     -  1  ;      while     (  lo      <=     hi  )     {      int     mid     =     (  lo     +     hi  )     /     2  ;      // if the first element of mid row is equal to x      // return true      if     (  x     ==     mat  [  mid  ][  0  ])      return     true  ;      // if x is greater than first element of mid row      // store the mid row and search in lower half      if     (  x     >     mat  [  mid  ][  0  ])     {      row     =     mid  ;      lo     =     mid     +     1  ;      }      // if x is smaller than first element of mid row      // search in upper half      else      hi     =     mid     -     1  ;      }      // if x is smaller than all elements of mat[][]      if     (  row     ==     -  1  )      return     false  ;      return     Search  (  mat  [  row  ]     x  );      }      static     void     Main  (  string  []     args  )     {      int  [][]     mat     =     new     int  [][]     {      new     int  []     {  1       5       9  }      new     int  []     {  14       20       21  }      new     int  []     {  30       34       43  }      };      int     x     =     14  ;      if     (  SearchMatrix  (  mat       x  ))      Console  .  WriteLine  (  'true'  );      else      Console  .  WriteLine  (  'false'  );      }   }   
JavaScript
   // function to binary search for x in arr[]   function     search  (  arr       x  )     {      let     lo     =     0       hi     =     arr  .  length     -     1  ;      while     (  lo      <=     hi  )     {      let     mid     =     Math  .  floor  ((  lo     +     hi  )     /     2  );      if     (  x     ===     arr  [  mid  ])      return     true  ;      if     (  x      <     arr  [  mid  ])      hi     =     mid     -     1  ;      else      lo     =     mid     +     1  ;      }      return     false  ;   }   // function to search element x in fully    // sorted matrix   function     searchMatrix  (  mat       x  )     {      let     n     =     mat  .  length       m     =     mat  [  0  ].  length  ;      let     lo     =     0       hi     =     n     -     1  ;      let     row     =     -  1  ;      while     (  lo      <=     hi  )     {      let     mid     =     Math  .  floor  ((  lo     +     hi  )     /     2  );      // if the first element of mid row is equal to x      // return true      if     (  x     ===     mat  [  mid  ][  0  ])      return     true  ;      // if x is greater than first element of mid row      // store the mid row and search in lower half      if     (  x     >     mat  [  mid  ][  0  ])     {      row     =     mid  ;      lo     =     mid     +     1  ;      }      // if x is smaller than first element of mid row      // search in upper half      else      hi     =     mid     -     1  ;      }      // if x is smaller than all elements of mat[][]      if     (  row     ===     -  1  )      return     false  ;      return     search  (  mat  [  row  ]     x  );   }   // Driver code   const     mat     =     [      [  1       5       9  ]      [  14       20       21  ]      [  30       34       43  ]   ];   const     x     =     14  ;   if     (  searchMatrix  (  mat       x  ))      console  .  log  (  'true'  );   else      console  .  log  (  'false'  );   

Ausgabe
true 

[Erwarteter Ansatz] Einmalige Verwendung der binären Suche – O(log(n × m)) und O(1) Raum

Die Idee besteht darin, die gegebene Matrix als 1D-Array zu betrachten und nur eine binäre Suche durchzuführen.
Beispielsweise wäre für eine Matrix der Größe n x m, die wir als 1D-Array der Größe n*m ​​betrachten können, der erste Index 0 und der letzte Index n*m-1. Wir müssen also eine binäre Suche von niedrig = 0 bis hoch = (n*m-1) durchführen.

Wie finde ich das Element in der 2D-Matrix, das index = mid entspricht?

Da jede Zeile von mat[][] m Elemente haben wird, können wir die finden Reihe des Elements als (Mitte / m) und die Spalte des Elements als (Mitte % m) . Dann können wir x mit arr[mid/m][mid%m] für jede Mitte vergleichen und unsere binäre Suche abschließen.

C++
   #include          #include         using     namespace     std  ;   bool     searchMatrix  (  vector   <  vector   <  int  >>&     mat       int     x  )     {      int     n     =     mat  .  size  ()     m     =     mat  [  0  ].  size  ();      int     lo     =     0       hi     =     n     *     m     -     1  ;      while     (  lo      <=     hi  )     {      int     mid     =     (  lo     +     hi  )     /     2  ;          // find row and column of element at mid index      int     row     =     mid     /     m  ;      int     col     =     mid     %     m  ;          // if x is found return true      if     (  mat  [  row  ][  col  ]     ==     x  )         return     true  ;          // if x is greater than mat[row][col] search       // in right half      if     (  mat  [  row  ][  col  ]      <     x  )         lo     =     mid     +     1  ;          // if x is less than mat[row][col] search       // in left half      else         hi     =     mid     -     1  ;      }      return     false  ;   }   int     main  ()     {      vector   <  vector   <  int  >>     mat     =     {{  1       5       9  }         {  14       20       21  }         {  30       34       43  }};      int     x     =     14  ;      if     (  searchMatrix  (  mat       x  ))      cout      < <     'true'  ;      else      cout      < <     'false'  ;      return     0  ;   }   
Java
   class   GfG     {      static     boolean     searchMatrix  (  int  [][]     mat       int     x  )     {      int     n     =     mat  .  length       m     =     mat  [  0  ]  .  length  ;      int     lo     =     0       hi     =     n     *     m     -     1  ;      while     (  lo      <=     hi  )     {      int     mid     =     (  lo     +     hi  )     /     2  ;      // find row and column of element at mid index      int     row     =     mid     /     m  ;      int     col     =     mid     %     m  ;      // if x is found return true      if     (  mat  [  row  ][  col  ]     ==     x  )      return     true  ;      // if x is greater than mat[row][col] search       // in right half      if     (  mat  [  row  ][  col  ]      <     x  )      lo     =     mid     +     1  ;      // if x is less than mat[row][col] search       // in left half      else      hi     =     mid     -     1  ;      }      return     false  ;      }      public     static     void     main  (  String  []     args  )     {      int  [][]     mat     =     {{  1       5       9  }         {  14       20       21  }         {  30       34       43  }};      int     x     =     14  ;      if     (  searchMatrix  (  mat       x  ))      System  .  out  .  println  (  'true'  );      else      System  .  out  .  println  (  'false'  );      }   }   
Python
   def   searchMatrix  (  mat     x  ):   n   =   len  (  mat  )   m   =   len  (  mat  [  0  ])   lo     hi   =   0     n   *   m   -   1   while   lo    <=   hi  :   mid   =   (  lo   +   hi  )   //   2   # find row and column of element at mid index   row   =   mid   //   m   col   =   mid   %   m   # if x is found return true   if   mat  [  row  ][  col  ]   ==   x  :   return   True   # if x is greater than mat[row][col] search    # in right half   if   mat  [  row  ][  col  ]    <   x  :   lo   =   mid   +   1   # if x is less than mat[row][col] search    # in left half   else  :   hi   =   mid   -   1   return   False   if   __name__   ==   '__main__'  :   mat   =   [[  1     5     9  ]   [  14     20     21  ]   [  30     34     43  ]]   x   =   14   if   searchMatrix  (  mat     x  ):   print  (  'true'  )   else  :   print  (  'false'  )   
C#
   using     System  ;   class     GfG     {          // function to search for x in the matrix       // using binary search      static     bool     searchMatrix  (  int  []     mat       int     x  )     {      int     n     =     mat  .  GetLength  (  0  )     m     =     mat  .  GetLength  (  1  );      int     lo     =     0       hi     =     n     *     m     -     1  ;      while     (  lo      <=     hi  )     {      int     mid     =     (  lo     +     hi  )     /     2  ;      // find row and column of element at mid index      int     row     =     mid     /     m  ;      int     col     =     mid     %     m  ;      // if x is found return true      if     (  mat  [  row       col  ]     ==     x  )      return     true  ;      // if x is greater than mat[row col] search      // in right half      if     (  mat  [  row       col  ]      <     x  )      lo     =     mid     +     1  ;      // if x is less than mat[row col] search       // in left half      else      hi     =     mid     -     1  ;      }      return     false  ;      }      static     void     Main  ()     {      int  []     mat     =     {     {     1       5       9     }     {     14       20       21     }     {     30       34       43     }     };      int     x     =     14  ;      if     (  searchMatrix  (  mat       x  ))      Console  .  WriteLine  (  'true'  );      else      Console  .  WriteLine  (  'false'  );      }   }   
JavaScript
   function     searchMatrix  (  mat       x  )     {      let     n     =     mat  .  length       m     =     mat  [  0  ].  length  ;      let     lo     =     0       hi     =     n     *     m     -     1  ;      while     (  lo      <=     hi  )     {      let     mid     =     Math  .  floor  ((  lo     +     hi  )     /     2  );      // find row and column of element at mid index      let     row     =     Math  .  floor  (  mid     /     m  );      let     col     =     mid     %     m  ;      // if x is found return true      if     (  mat  [  row  ][  col  ]     ===     x  )      return     true  ;      // if x is greater than mat[row][col] search       // in right half      if     (  mat  [  row  ][  col  ]      <     x  )      lo     =     mid     +     1  ;      // if x is less than mat[row][col] search       // in left half      else      hi     =     mid     -     1  ;      }      return     false  ;   }   // Driver Code   let     mat     =     [[  1       5       9  ]     [  14       20       21  ]     [  30       34       43  ]];   let     x     =     14  ;   if     (  searchMatrix  (  mat       x  ))      console  .  log  (  'true'  );   else      console  .  log  (  'false'  );   

Ausgabe
true 
Quiz erstellen