杨氏矩阵是什么?
比如一个矩阵:
1 3 6
2 4 7
6 8 9
从左往右是增大的,从上到下也是增大的。
实际上我第一次见到这玩意是在牛客网上做到的一道题:“已知这样一个矩阵,请在线性时间找到是否含有目标元素。”
答案是这样:
命令指针指向左下角元素,如果小于目标值,就往右移动,如果大于目标值,就向上移动,直到越界。
这个看似精妙的矩阵就是杨氏矩阵,在《算法导论》第六章提到,而且第六章是讲述的堆及其算法。
思考一下,这二者有何关系呢?
我们会发现如果从左上角一层一层看,分别就是1,2 3,6 4 6...
恰好是一个最小堆啊。
构建它的代码如下:
def build_tableau(arr):
Max_Number=0xFFFFFFFF
import math
n=int(math.sqrt(len(arr)))
m=n
if n**2<len(arr):
m+=1
table=[[Max_Number for x in range(n)] for y in range(m)]
temp=sorted(arr)
index=0
for s in range(m+n-1):
for i in range(s+1):
j=s-i
if 0<=i<m and 0<=j<n:
table[i][j]=temp[index]
index+=1
return table
比如序列:
a=[5,8,9,2,3,4,14,12,16]
将生成:
[[2, 3, 5], [4, 8, 12], [9, 14, 16]]
然后我们就可以使用前面提到的搜索算法啦。
def tableau_search(table,target):
m=len(table)
n=len(table[0])
i=m-1
j=0
while 0<=i<m and 0<=j<n:
if table[i][j]==target:
return (i,j)
elif table[i][j]>target:
i-=1
else:
j+=1
return 'No Such Element'
大功告成咯。