zoukankan      html  css  js  c++  java
  • 每日一“酷”之bisect

    作用:维护有序列表,而不必在每次想列表增加一个元素时调用sort排序

    bisect 模块实现了一个算法用于向列表中插入元素,同时仍保持列表有序。有些情况下,这比反复对一个了表序列更高效,另外也比构建一个大列表之后再显式对齐排序更为高效

    1、有序插入

    使用insort()按有序顺序像一个列表中插入元素

     1 import bisect
     2 import random
     3 random.seed(1)
     4 
     5 print 'New   Pos   Contents'
     6 print '---   ---   --------'
     7 l = []
     8 for i in range(1,15):
     9     r = random.randint(1,100)
    10     position = bisect.bisect(l, r)
    11     bisect.insort(l, r)
    12     print '%3d   %3d' % (r,position),l

    执行结果:
      

      输出的第一列显示了心随技术,第二列显示了这个数将插入到列表的那个位置,每一行余下的部分则是当前的有序列表

      对于此例所处理的数据量来说,如果直接构建列表然后完成一次排序,可能速度更快。不过对于长列表而言,使用类似这样的一个插入序列算法可以大大节省时间和内存

      注意:random.seed(1) 的是:伪随机数生成模块。如果不提供 seed,默认使用系统时间。使用相同的 seed,可以获得完全相同的随机数序列,常用于算法改进测试。

    2、处理重复

      上面的显示结果包括了一个重复值77。bisect模块提供了两种方法处理重复。新值可以插入到现有值得左边或右边。insort()函数实际上是insort_right()的别名,

      这个函数会在现有值之和插入新值。相应的函数insort_left() 则在现有值之前插入新值

      

    import bisect
    import random
    random.seed(1)
    
    print 'New   Pos   Contents'
    print '---   ---   --------'
    l = []
    for i in range(1,15):
        r = random.randint(1,100)
        position = bisect.bisect_left(l, r)
        bisect.insort_left(l, r)
        print '%3d   %3d' % (r,position),l

    处理结果:

      

      使用bisect_left()和insect_left()处理同样的数据时,结果会得到相同的有序序列,不过重复值插入的位置有所不同

      除了Python实现外,还有一个速度更快的C实现,如果有C版本,导入bisert时,这个实现会自动覆盖纯Python实现

  • 相关阅读:
    boost::asio在VS2008下的编译错误
    Java集合框架——接口
    ACM POJ 3981 字符串替换(简单题)
    ACM HDU 1042 N!(高精度计算阶乘)
    OneTwoThree (Uva)
    ACM POJ 3979 分数加减法(水题)
    ACM HDU 4004 The Frog's Games(2011ACM大连赛区第四题)
    Hexadecimal View (2011ACM亚洲大连赛区现场赛D题)
    ACM HDU 4002 Find the maximum(2011年大连赛区网络赛第二题)
    ACM HDU 4001 To Miss Our Children Time (2011ACM大连赛区网络赛)
  • 原文地址:https://www.cnblogs.com/victroy/p/4021358.html
Copyright © 2011-2022 走看看