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]
    
  • 相关阅读:
    Angularjs 设置全局变量的3种方法
    prevent to do sth 与 prevent sb (from) doing 用法
    软件测试技术对程序员的重要性
    Javascript中setTimeout()以及clearTimeout( )的使用
    Javascript异步编程的常用方法
    软件设计原则总结
    为sublime Text3 安装插件JS Format
    javascript中 if(变量)和if(变量==true)的区别
    Ping 命令
    ipconfig
  • 原文地址:https://www.cnblogs.com/ldy-miss/p/12061437.html
Copyright © 2011-2022 走看看