• Python的bisect模块


    Python的列表(list)类型内部是一个线性表,在线性表中查找元素复杂度为O(N),即调用list.index()的复杂的是O(N)。当数据量较大时,应该使用二分查找优化,二分查找范围每次缩小一般,复杂度为log(N),数据量越大速度差距越明显。

    bisect模块就是基于二分实现的,二分查找要求列表是有序的,bisect实现了在一个有序列表中插入元素并保持列表为有序状态、或返回插入位置但并不进行实际的插入。
    bisect一共有6个函数:['bisect', 'bisect_left', 'bisect_right', 'insort', 'insort_left', 'insort_right'],使用这些函数前要确保操作的列表是有序的。

    insort
    排序很耗时,因此在得到一个有序序列之后,我们最好能够保持它的有序。insort(seq, item)把变量item插入到序列seq中,并能保持seq的升序顺序

    >>> data = [4, 2, 9, 7]
    >>> data.sort()
    >>> insort(data, 3)
    >>> data
    [2, 3, 4, 7, 9]
    

    bisect
    其目的在于查找该数值将会插入的位置并返回,而不会插入。

    >>> bisect(data, 1)
    0
    >>> data
    [2, 3, 4, 7, 9]
    

    bisect_left 和 bisect_right
    bisect_left 和 bisect_right 函数,用入处理将会插入重复数值的情况,返回将会插入的位置。
    bisect_left(seq, x) x存在时返回x左侧的位置;
    bisect_right(seq, x) x存在时返回x右侧的位置;

    >>> bisect_left(data, 4)
    2
    >>> bisect_right(data, 4)
    3
    >>> data
    [2, 3, 4, 7, 9]
    

    insort_left 和 insort_right
    insort_left 和 insort_right 会进行实际的插入。
    insort_left(seq, x) x存在时插入在左侧插入;
    insort_right(seq, x) x存在时在右侧插入;

    >>> data
    [2, 3, 4, 7, 9]
    >>> insort_left(data, 4)
    >>> data
    [2, 3, 4, 4, 7, 9]
    >>> data = [2, 3, 4, 7, 9]
    >>> insort_right(data, 4)
    >>> data
    [2, 3, 4, 4, 7, 9]
    
  • 相关阅读:
    poj3192
    poj3511
    cnblogs太好了,让我能在开发时使用微软雅黑!!
    用ftp实现大文件上传
    学习.net必看的书:Scott Mitchell ASP.NET 2.0(pdf)
    c#实现ftp功能
    猛然发现c学的好不精阿!!
    OFFICE 大全简介(转自网络)
    c# 实现文件浏览功能
    IntelliSense
  • 原文地址:https://www.cnblogs.com/ldy-miss/p/12061437.html
Copyright © 2020-2023  润新知