Search in a 2D Array or Matrix - Algorithms and Problem SolvingAlgorithms and Problem Solving



Search in a 2D Array or Matrix - Algorithms and Problem SolvingAlgorithms and Problem Solving

Search in a 2D Array or Matrix

Write an efficient algorithm that searches for a value in an m x n matrix.

Matrix can have two forms. Solve it for each form of the matrix. This matrix has the following properties:

Version 1
Integers in each row are sorted from left to right.
The first integer of each row is greater than the last integer of the previous row.

For example,

  [1,   3,  5,  7],    [10, 11, 16, 20],    [23, 30, 34, 50]  

Then,
search(mat, 11) = true
search(mat, 2) = false
search(mat, 17) = false

Version 2
Integers in each row are sorted in ascending from left to right.
Integers in each column are sorted in ascending from top to bottom.

For example,

  [1,   4,  7, 11, 15],    [2,   5,  8, 12, 19],    [3,   6,  9, 16, 22],    [10, 13, 14, 17, 24],    [18, 21, 23, 26, 30]  

Then,
search(mat, 11) = true
search(mat, 3) = false
search(mat, 17) = true

version 1 : First element is greater then last element of previous row
At each row we can know in O(lgn) time if the desired element is there or not. But which row to look into. As the rows are wrapped around in sorted order so, we can easily find the row which may contain the target. So, we will do a vertical binary search over first column to identify the row.

1. If the mid is greater than the key than we know that this row and all next rows do not contain the mid. So, search upward.   2. On the other hand if mid is less than the key than either this row may contain the key or all subsequent rows.   

Now, we found a candidate row. We now do normal horizontal binary search in that row to search the key. Below is implementation of this idea which simply runs in O(lgn) time .


Read full article from Search in a 2D Array or Matrix - Algorithms and Problem SolvingAlgorithms and Problem Solving


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts