python bisect 二分查找 网易答题 牛牛选工作

python bisect使用,总结一下三条:

1. Python中的bisect用于操作排序的数组,比如你可以在向一个数组插入数据的同时进行排序。
2. 用来查找某值大于等于、小于等于、等于列表中元素位置下标。 解决牛牛找工作问题。
3. 实现查找,效率比较是:递归 < 二分查找 < bisect  ,另外 numpy.searchsorted搜索numpy.ndarray类型的元素是很快。
代码如下:
1.
import bisect
import random
random.seed(1)
ls= []
r = random.randint(1, 100)
position = bisect.bisect_left(ls, r)   # 其目的在于查找该数值将会插入的位置并返回,而不会插入。

bisect.insort(ls, r)  # 在ls相应位置插入值r,可以不先bisect,但是调用bisect的方法,前提是ls已经是有序的了,会改变ls内容

# --------------------------------------------------------------------------------------------------------------------------

2.在python中使用字典,元素是(难易程度,薪资),然后根据难易程度排序,修改第i个人薪资为排序后前i个人最大薪资值;
选取键中满足find_le(a, x)的下标的值,就是某人已知难易程度,得到获得的最大薪资值下标。根据下标就可以找到薪资了。完美的代替了java中的treemap
def index(a, x):
    'Locate the leftmost value exactly equal to x'
    i = bisect.bisect_left(a, x)
    if i != len(a) and a[i] == x:
        return i
    raise ValueError


def find_lt(a, x):
    'Find rightmost value less than x'
    i = bisect.bisect_left(a, x)
    if i:
        return a[i-1]
    raise ValueError


def find_le(a, x):
    'Find rightmost value less than or equal to x'
    i = bisect.bisect_right(a, x)
    if i:
        return a[i-1]
    raise ValueError


def find_gt(a, x):
    'Find leftmost value greater than x'
    i = bisect.bisect_right(a, x)
    if i != len(a):
        return a[i]
    raise ValueError


def find_ge(a, x):
    'Find leftmost item greater than or equal to x'
    i = bisect.bisect_left(a, x)
    if i != len(a):
        return a[i]

    raise ValueError

# -----------------------------------------------------------------

3. python 的列表(list)内部实现是一个数组,也就是一个线性表。在列表中查找元素可以使用 list.index() 方法,其时间复杂度为O(n)。对于大数据量,则可以用二分查找进行优化。
# 我们可以用 bisect 模块实现二分查找:
def binary_search_bisect(lst, x):
    from bisect import bisect_left
    i = bisect_left(lst, x)
    if i != len(lst) and lst[i] == x:
        return i
    return None
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23534759/article/details/79970737
个人分类: python
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

python bisect 二分查找 网易答题 牛牛选工作

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭