Python 使用三元搜索查找范围内的所有元素?

Python 使用三元搜索查找范围内的所有元素?,python,algorithm,search,Python,Algorithm,Search,我正在寻找一个平均案例性能为O(log(N))的算法,以从排序列表中提取介于(或等于)最小值和最大值之间的元素 问题在于,由于最小值和最大值实际上可能不在列表中,或者甚至可能不重复,因此二进制搜索将不起作用。三元搜索似乎更接近于我所寻找的,但到目前为止,我还无法创建一个函数来实现我在三元搜索基础上看到的功能 例如,输入: list=[1,2,3,4,5,6,7], min=3, max=6 应该返回[3,4,5,6]。同样地 list=[500,757,2412,10000,123123],

我正在寻找一个平均案例性能为O(log(N))的算法,以从排序列表中提取介于(或等于)最小值和最大值之间的元素

问题在于,由于最小值和最大值实际上可能不在列表中,或者甚至可能不重复,因此二进制搜索将不起作用。三元搜索似乎更接近于我所寻找的,但到目前为止,我还无法创建一个函数来实现我在三元搜索基础上看到的功能

例如,输入:

list=[1,2,3,4,5,6,7], min=3, max=6
应该返回[3,4,5,6]。同样地

list=[500,757,2412,10000,123123], min = 600, max = 5000
应返回[7572412]

这也可以在python中使用以下方法来降低效率:

def withinRange(values,min,max):
   return [val for val in sorted(values) if val <= max and val >= min]
def范围内(值、最小值、最大值):
返回[如果val=min,则在排序(值)中为val返回val]
调用该操作的次数足够多,因此非常倾向于使用O(log(N)),并且排序只会执行一次。

这似乎有效:

>>> import bisect
>>> def bin_slice(L, min, max):
...     i = bisect.bisect_left(L, min)
...     j = bisect.bisect(L, max)
...     return L[i:j]
... 
>>> bin_slice([1,2,3,4,5,6,7,8,9], 3, 6)
[3, 4, 5, 6]
>>> bin_slice([500,757,2412,10000,123123], 600, 5000)
[757, 2412]
复杂性类似于2log(N),也就是O(log(N))。还要注意的是,
bisect
可能会对
bisect
使用C实现,这比用纯python编写的任何东西都要快,因此纯python解决方案可能会更慢,即使比较少一点

通过将
lo
参数传递到
bisect
,可以稍微优化搜索
j

j = bisect.bisect(L, max, i)

我不理解你在“因为最小值和最大值可能不在列表中,甚至可能不重复,所以二进制搜索不起作用”中的推理。你能详细说明一下吗?它需要有内存的二进制搜索。“记住您拥有的最后一个值。如果您要返回‘未找到值’,请返回内存中的最后一个值”在下面的示例中,该算法旨在返回列表中最小值和最大值之间的所有值。做同样事情的一种效率较低的方法是:[x代表列表中的x,如果x>=min和x,这可能就是我要找的。我会看看是否还有其他问题出现,不管是哪种方式,该模块看起来对我正在处理的与此问题相关的其他事情很有用。