Saddleback Search | Algorithms Notes



Saddleback Search | Algorithms Notes

M is an n * n integer matrix in which the entries of each row are in increasing order (reading left to right) and the entries in each column are in increasing order (reading top to bottom). Give an efficient algorithm to find the position of an integer x in M, or determine that x is not there. Tell how many comparisons of x with matrix entries your algorithm does in the worst case.

Solution:

If M[i][j] > x, then M[i][k] ≠ x for all j ≤ kn and M[k][j] ≠ x for all 1 ≤ ki. Likewise, M[i][j] < x reveals corresponding information. Hence, let i = 1 and j = n initially, if M[i][j] = x, report it; if M[i][j] > x or M[i][j] < x, compare x with M[i][j-1] or M[i+1][j] respectively in the next iteration, unless j-1 < 1 or i+1 > n, which implies that x is not in M. Since the increments and decrements of i and j are O(n), the total running time is O(n).

For m time n sorted matrix, finding an element can be done in O(m lg (n / m)) [1], where m is the number of rows and n is the number of columns, m ≤ n. First do binary in the middle row M[mid] to find the index i, such that M[mid][i] < x < M[mid][i+1]. Then, the submatrix in the top-left of M[mid][i] and the submatrix in the bottom-right of M[mid][i+1] cannot have x. We can recursively solve the problem in the remaining two submatrices.

Note: This technique can be generalized to 3D [2]

[1] Richard S. Bird, "Improving Saddleback Search: A Lesson in Algorithm Design," Mathematics of Program Construction Lecture Notes in Computer Science Volume 4014, 2006, pp 82-89

[2] N Linial, M Saks, "Searching ordered structures," Journal of Algorithms Volume 6, Issue 1, March 1985, Pages 86–103

解法

如果 M[i][j]大於x,那M[i][k]不等於x對於所有j ≤ k ≤ nM[k][j]不等於x對於所有1 ≤ k ≤ i。相同的,如果M[i][j]小於x也能得到類似的資訊。因此,令i為1、jn,如果M[i][j]等於x,那就找到了解答。如果M[i][j]大於或是小於x,在下一輪中就要拿xM[i][j-1]或M[i+1][j]來比較,除非j-1小於1或是i+1大於n,這代表x不在M中。因為ij頂多只能被遞增或是遞減O(n)次,所以時間複雜度為O(n)。


Read full article from Saddleback Search | Algorithms Notes


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