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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值