A 2D Array is sorted on its row and columns, find a key.
"""
Program to search an element in a 2-d array
The 2D array has sorted rows and sorted columns
"""
from random import randrange
N=10 # we will generate a NxN array
# initializes a 2-d array sorted on rows and columns
ARRAY = [ [i for i in range(j,N+j)] for j in range(N) ]
KEY = randrange(0,ARRAY[N-1][N-1])
# We will skip the brute force method of O(n^2)
# Attempt 1 : Use binary search
def binary_search(lst, l, u, key):
if l > u : return -1;
m = (l+u)/2
if lst[m] == key: return m
if lst[m] < key: return binary_search(lst, m+1,u, key)
else : return binary_search(lst, l, m-1,key)
def binsearch_method():
"Use binary search on each row : takes loglinear time: O( n log(n) )"
for i in range(N):
idx = binary_search(ARRAY[i],0,len(ARRAY[i])-1,KEY)
if idx != -1:
print("found %d at %d,%d" % (KEY, i,idx))
return
def linear_method():
"search in linear time"
currow = 0
curcol = N-1
steps = 0
while curcol > 0 and currow < N:
steps += 1
#print(currow, curcol)
# If the elem in a col is greater than key, we can skip the entire col
if ARRAY[currow][curcol] > KEY: curcol -= 1
# If the first element in a row is > than key or if the last elem is < key, we skip the entire row.
if ARRAY[currow][0] > KEY or ARRAY[currow][curcol] < KEY: currow += 1
if ARRAY[currow][curcol] == KEY:
print("found %d at %d,%d in %d steps" % (KEY, currow,curcol, steps) )
return
if __name__ == "__main__":
print("Key is %d" % KEY )
binsearch_method()
linear_method()
No comments:
Post a Comment