Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 二进制搜索,一个点有多少间隔_Python - Fatal编程技术网

Python 二进制搜索,一个点有多少间隔

Python 二进制搜索,一个点有多少间隔,python,Python,我试图在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]:

我试图在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))
#O(logn)
def算法(inter、i、j、punto):
如果i==j:
res=-1
其他:
p=int((i+j)/2)
如果punto==inter[p][0]:
res=[inter[p][0],inter[p][1]]
elif punto只需保存对(x,num_of_segments_从这个_x_到下个_)并对查询进行二进制搜索。
预处理可以按照线段的左端点对其进行排序,并在其上绘制扫描线

假设你的细分是[1,5][2,4][3,7] 您将保存[1,1][2,2][3,3][4,2][5,1][7,0] 其中,左侧的每个数字是x坐标,右侧的每个数字是从左向右行走时有多少条“活动”线

然后在查询中,您只需进行二进制搜索。例如,如果你想知道有多少线段穿过6,你可以得到它的位置(在[5,1]和[7,0]之间),从那里你可以知道在5到7之后,所有的点都与一条线段相交),然后返回6。
当然,根据您的实现,您应该处理端点本身的细节。在我的例子中,如果你问EG为4,你必须返回3对应于前一点,但是如果你要求3,你会返回3(如果你认为端点在段中)。为了避免这种复杂性,我还将存储每个端点的特定响应,这取决于问题的细节

我将尝试一些东西,它位于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
interval=[[0,10]、[5,12]、-4,3]、[8,10]]
点=9
结果=[]
对于枚举(间隔)中的i(低,高):
如果较低<点<较高:
结果+=[i]
打印(结果)#[0,1,3],即点位于第一、第二和第四个间隔

一般建议:不要在python中使用递归。所以建议:解释你所说的“OX”是什么意思,给出你函数的输入示例,解释你所说的“它不工作”是什么意思。它是否引发了一个例外?它的输出是否与您期望的不同?OX是x坐标。没有显示正确的解决方案,但什么是
i
j
punto
?无论哪种方式,都可以用一个示例函数调用编辑您的问题。@nicoco ready!。现在有用的是
intervalos
的实际内容,以及预期的输出。您能再指定一点吗?您现在更了解它了吗?