考虑以下算法min,它将列表x,y作为参数,并返回x和y联合的第z个最小元素。 前提条件:X和Y是按升序排列的整数排序列表,它们是不相交的。
请注意它的伪代码,因此索引从1开始而不是0。
Min(x,y,z):
if z = 1:
return(min(x[1]; y[1]))
if z = 2:
if x[1] < y[1]:
return(min(x[2],y[1]))
else:
return(min(x[1], y[2]))
q = Ceiling(z/2) //round up z/2
if x[q] < y[z-q + 1]:
return(Min(x[q:z], y[1:(z - q + 1)], (z-q +1)))
else:
return(Min(x[1:q], B[(z -q + 1):z], q))
我可以证明它终止了,因为z继续减少2并且最终会达到一个基本情况,但我无法证明部分正确性。
答案 0 :(得分:0)
您的代码不正确。
考虑以下输入:
x = [0,1]
y = [2]
z = 3
然后,您获得q = 2
,并在随后的if
子句中访问y[z-q+1]
,即y[2]
。这是一个数组边界违规。