Matrix Search
August 17, 2018
Our strategy is to perform binary search on each row, stopping when we find the target value or reporting failure after searching all rows:
(define (matsearch lt? x mat) (let ((len (vector-length mat))) (let loop ((r 0)) (cond ((= r (vector-length mat)) #f) ((bsearch lt? x (vector-row r mat)) => (lambda (c) (list r c))) (else (loop (+ r 1))))))
This has time complexity O(n log n), as there are n rows, each of which takes logarithmic time for the binary search. Here are some examples:
> (matsearch < 8 '#(#(2 5 8) #(1 4 7) #(3 6 9))) (0 2) > (matsearch < 6 '#(#(2 5 8) #(1 4 7) #(3 6 9))) (2 1) > (matsearch < 0 '#(#(2 5 8) #(1 4 7) #(3 6 9))) #f
The binary search comes from a previous exercise. You can run the program at https://ideone.com/f2TtnH.
Here’s a solution in C.
Output:
Klong version 2
[sourcecode lang="css"]
.comment(“end-of-comment”)
[n s] – Set up 2 local variables
s::#x – Get size of matrix (Number of row/columns)
(,/:~x) – Flatten matrix into 1 row
?y – Find second parameter in flattened matrix
n::… – Assign location of 2nd parameter to n
If not found, assign []
:[0=#n; – If 2nd parameter not found (Size of parameter ([]) is 0)
[-1 -1] – True –> return [-1 -1]
False
n::n@0 – Get element in flattened matrix and assign to n
(…)!s – Get column by getting remainer of n and s
(_n%s) – Get row by integer dividing element by s
(!n…),(n::…) – Return list of row and column
ms::{…} – Make function and name it ms
.p(…) – Print argument
‘!10 – Run function against each element of list from 0 to 9
end-of-comment
Examples:
{{.p(x,” –> “,,ms([[2 5 8][1 4 7][3 6 9]]; x))}’!10}();””
[0 –> [-1 -1]]
[1 –> [1 0]]
[2 –> [0 0]]
[3 –> [2 0]]
[4 –> [1 1]]
[5 –> [0 1]]
[6 –> [2 1]]
[7 –> [1 2]]
[8 –> [0 2]]
[9 –> [2 2]]
“”
Klong version 3
@programmingpraxis: Please delete Klong version 2. Thanks.
Mumps version