zoukankan      html  css  js  c++  java
  • 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]
    
  • 相关阅读:
    file_put_contents实现内容追加
    Laravel5.5 实现session配置
    easywechat在laravel框架中的应用-代码参考
    Laravel框架模型层表单验证
    工厂方法模式及php实现
    简单工厂模式及php实现
    Actionscript,AS3,MXML,Flex,Flex Builder,Flash Builder,Flash,AIR,Flash Player之关系
    php之依赖注入和控制反转
    php pdo操作数据库
    odbc连接数据库
  • 原文地址:https://www.cnblogs.com/ldy-miss/p/12061437.html
Copyright © 2011-2022 走看看