我正在尝试在O(nlogn)时间内创建预处理,给定OX上的一个点,我可以及时找到O(logn)它所属的间隔数。
预处理:我已经考虑过使用快速排序算法对列表进行排序
算法:我以为我是用二分搜索做的,但它不起作用
#O(logn)
def algoritmo(inter,i,j,punto):
if i == j:
res = -1
else:
p = int((i + j) / 2)
if punto == inter[p][0]:
res = [inter[p][0],inter[p][1]]
elif punto <= inter[p][0]:
res = algoritmo(inter,i,p,punto)
else:
res = algoritmo(inter,p,j,punto)
return res
print(algoritmo(intervalos,0,len(intervalos),15))
有什么建议吗?另一种方法呢?
答案 0 :(得分:0)
只需保存对(x,num_of_segments_from_this_x_to_the_next)并对查询进行二进制搜索。 可以通过左端点对段进行排序并对它们进行扫描来完成预处理。
说你的片段是[1,5] [2,4] [3,7] 你会节省[1,1] [2,2] [3,3] [4,2] [5,1] [7,0] 左边的每个数字都是一个x坐标,右边的每个数字是多少&#34;活跃的&#34;从左到右行走时的行。
然后在查询中,您只需要进行二分查找。例如,如果你想知道有多少段通过6你得到它的位置(在[5,1]和[7,0]之间,你知道在5和7之后所有的点都与一个线段相交)和返回6。 当然,根据您的实现,您应该处理端点本身的细节。在我的例子中,如果你要求例如4,你必须返回3对应于前一点,但是如果你要求3,你将返回3(如果你认为端点在段中)。为了避免这种复杂性,我还会存储每个端点的具体响应,这取决于问题的细节
答案 1 :(得分:0)
我会尝试一下,它在O(n)中。我真的不明白递归或二叉搜索树的必要性,但至少可以说你的问题不是很明确。
intervals = [[0,10],[5,12],[-4,3],[8,10]]
point = 9
result = []
for i, (lower, higher) in enumerate(intervals):
if lower < point < higher:
result += [i]
print(result) # [0,1,3], i.e., point is in the first, second and fourth interval