繁体   English   中英

如何使用bisect在需要计算的数组中进行搜索

[英]How to use bisect to search in a compute-when-need array

bisect.bisect_left((f(x) for x in range(pow(10, 6))), 0)

我试图使用bisect二进制搜索到满足f(x)> = 0的最小x 并且f(x)严格增加。 我使用二进制搜索的原因是因为计算f(x)消耗了大量资源。 所以我想尽可能少地计算它。

我在这里遇到的问题是bisect_left中的第一个参数需要是一个列表类型,这意味着我必须为每个x计算f(x)。

在这种情况下,有没有办法进行二分搜索?

我在这里遇到的问题是bisect_left中的第一个参数需要是一个列表类型

不,不。 它需要是一个序列 - 一个具有确定长度的类型,支持基于0的索引的访问。 制作一个序列:

import collections
class LazySequence(collections.Sequence):
    def __init__(self, f, n):
        """Construct a lazy sequence representing map(f, range(n))"""
        self.f = f
        self.n = n
    def __len__(self):
        return self.n
    def __getitem__(self, i):
        if not (0 <= i < self.n):
            raise IndexError
        return self.f(i)

然后你可以将其中一个传递给bisect

bisect.bisect_left(LazySequence(f, 10**6), 0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM