zoukankan      html  css  js  c++  java
  • 算法-deque双端队列

    Python的deque模块,它是collections库的一部分。deque实现了双端队列,意味着你可以从队列的两端加入和删除元素

    1、基本介绍

    # 实例化一个deque对象
    d = deque()
    deque对象中的方法有:
    append(x):把元素x添加到队列的右端
    appendleft(x):把元素x添加到队列的左端
    clear():清空队列中所有元素
    copy():创建队列的浅拷贝
    count(x):计算队列中等于x元素的个数
    extend(iterable):在队列右端通过添加元素扩展
    extendleft(iterable):在队列左端通过添加元素扩展
    index(x[, start[, stop]]):返回x元素在队列中的索引,放回第一个匹配,如果没有找到抛ValueError
    insert(i, x):在队列的i索引处,插入x元素
    pop():移除并返回deque右端的元素,如果没有元素抛IndexError
    popleft():移除并返回deque左端的元素,如果没有元素抛IndexError
    remove(value):删除第一个匹配value的元素,如果没有找到抛ValueError
    reverse():在原地反转队列中的元素
    rotate(n):把队列左端n个元素放到右端,如果为负值,右端到左端。如果n为1,等同d.appendleft(d.pop())

    maxlen(队列最大长度)
    deque还可以设置队列的长度,使用 deque(maxlen=N) 构造函数会新建一个固定大小的队列。当新的元素加入并且这个队列已满的时候,
    最老的元素会自动被移除掉。
    如果你不设置最大队列大小,那么就会得到一个无限大小队列。
    from collections import deque
    d1 = deque(maxlen=5)
    d2 = deque(range(10),4)
    Deque的缺点就是remove还有判断获取索引的时候,速度有些慢, 因为他需要执行多遍deque相关联的数据块,不像list那样,搞一遍就行。

    2、样例

    从右边向队列里面增加数据
    from collections import deque
    d1=deque(maxlen=5)
    d1.append(2)
    d1.append(3)
    d1.append(3)
    d1.append(1)
    d1.append(3)
    d1.append(4)
    
    C:Python27python.exe D:/code-program/lianxi-test/youxianduilie.py
    deque([3, 3, 1, 3, 4], maxlen=5)
    
    Process finished with exit code 0
    
    从左边向队列里面增加数据
    from collections import deque
    d = deque([1, 2, 3, 4, 5])
    d.appendleft(11)
    print d
    C:Python27python.exe D:/code-program/lianxi-test/youxianduilie.py
    deque([11, 1, 2, 3, 4, 5])
    
    Process finished with exit code 0
    
    队列的两端pop数据
    d1.pop()
    print d1
    
    C:Python27python.exe D:/code-program/lianxi-test/youxianduilie.py
    deque([3, 3, 1, 3], maxlen=5)
    
    Process finished with exit code 0
    
    d1.popleft()
    print d1
    C:Python27python.exe D:/code-program/lianxi-test/youxianduilie.py
    deque([3, 1, 3, 4], maxlen=5)
    
    扩展deque中的元素:
    from collections import deque
    d = deque([1, 2, 3, 4, 5])
    print(d)
    d.extendleft([0])
    d.extend([6, 7, 8])
    print(d)
    
    C:Python27python.exe D:/code-program/lianxi-test/youxianduilie.py
    deque([1, 2, 3, 4, 5])
    deque([0, 1, 2, 3, 4, 5, 6, 7, 8])
    
    Process finished with exit code 0
    

    3、双端队列的应用 

    使用 deque 数据结构可以容易地解决经典回文问题。回文是一个字符串,读取首尾相同的字符,例如,radar toot madam。
    我们想构造一个算法输入一个字符串,并检查它是否是一个回文。
    解决方案:
    将字符串添加到双端队列中
    直接删除并比较首尾字符串,如果可以持续匹配首尾字符,我们最终要么用完字符,要么留出大小为 1 的deque,取决于原始字符串的长度是偶数还是奇数。

    from collections import deque
    def check_huiwen(n):
        d=deque(list(n))
        while len(d)>1:
            right_value=d.pop()
            left_value=d.popleft()
            if right_value != left_value:
                return False
        return  True
    
    print check_huiwen("123454321")
    print check_huiwen("hello work")
    
    C:Python27python.exe D:/code-program/lianxi-test/youxianduilie.py
    True
    False
    

      

  • 相关阅读:
    【转】 springBoot(5)---单元测试,全局异常
    【转】 springBoot(4)---热部署,配置文件使用
    【转】 springBoot(3)---目录结构,文件上传
    【转】 springBoot(2)---快速创建项目,初解jackson
    【转】 springBoot(1)---springboot初步理解
    【转】 SpringBoot+MyBatis+MySQL读写分离
    简单请求 vs 非简单请求
    H5新增的API
    图片
    vue更新dom的diff算法
  • 原文地址:https://www.cnblogs.com/potato-chip/p/13391947.html
Copyright © 2011-2022 走看看