TL; DR :对单调谓词域的二进制搜索。
我的单调递增谓词
大于mid
的元素数量是否小于或等于total - n - 1
?
我的代码
def nthElement(los, his, n):
"""Find the n-th element...
los - array, lower bounds of intervals
his - array, upper bounds of intervals
n - int, index of the target element
"""
# search space for the binary search.
lo, hi = min(los), max(his)
# total number of elements in the search space.
total = sum(j-i+1 for i, j in zip(los, his))
# search the space.
while lo < hi:
mid = lo + (hi - lo) // 2
# number of elements in search space
# greater than `mid`. Note that `mid`
# might not be a valid member
# of search space, i.e. it may fall
# between intervals.
ngreater = 0
for llim, hlim in zip(los, his):
# for valid members of search space
if mid < hlim and mid >= llim:
ngreater += hlim - mid
# if `mid` is between intervals
elif mid < hlim:
ngreater += hlim - llim + 1
# evaluate predicate
if ngreater <= total - n - 1:
hi = mid
else:
lo = mid + 1
return lo
我的问题是关于mid
不是搜索空间的有效成员的情况,如代码注释中所述。我的解决方案看起来正确吗?
假设mid
等于 e ,因此 e 不是搜索空间的成员。
情况1:假设谓词在 e 处的计算结果为true。由于谓词必须对某些元素严格小于 e ( e 不是搜索空间的成员)求值为true,并且hi
设置为< em> e ,下一个迭代的搜索空间将包含目标。
情况2:假设谓词在 e 处的计算结果为false。然后,目标位于严格大于 e 的搜索空间子集中。 lo
设置为 e +1,下一次迭代的搜索空间包含目标。
由于这两种情况都会为下一次迭代产生有效的搜索空间,所以 e 不会破坏程序。