数据结构与算法(Python)

数据结构与算法(Python)


常见的内置数据结构和算法

数据结构/算法 语言内置 内置库
线性结构 list/tuple   array/collections.namedtuple
链式结构    collections.deque
字典结构  dict  collections.Counter/OrderdDict  
集合结构  set/frozenset  
排序算法  sorted  
 二分算法     bisect模块
堆算法    heapq模块
缓存算法    functools.lru_cache

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Collections模块

  • namedtuple() --可以创建包含名称的tuple;可以很方便地定义一种数据类型,它具备元组的不变性,又可以根据属性来引用
  • deque --类似于list的容器,可以快速的在队列头部和尾部添加、删除元素;
  • Counter() --dict的子类,计数器,主要用来计数;例如统计字符出现的个数
  • OrderdDict() -dict的子类,可以记住元素的添加顺序;
  • defaultDict() -dict的子类,可以调用提供默认值的函数;

Python dict底层结构 (哈希表)

  • 为了支持快速查找使用了哈希作为底层结构
  • 哈希的平均查找时间复杂度O(1)
  • Cpython解释器使用二次探查解决哈希冲突问题

Python list与tuple的区别

  • 都是线性结构,支持下标访问
  • list是可变对象,tuple保存对象的引用不可变
  • list不能作为字典的key,tupe可以(可变对象不可哈希)

什么是Lru_Cache? 

  • Least-Recently-Used 替换掉最近最少使用的对象

  • 缓存剔除策略,当缓存空间不够用的时候需要一种方式剔除key
  • 常见的有LRU,LFU等
  • LRU通过使用一个循环双端队列不断把最新的key放在表头实现

如何实现LruCache?

  • 字典用来缓存,循环双端列表用来记录访问顺序
  • 利用Python内置的dict +collections.OrderdDict实现
  • dict用来当做k/v键值对的缓存
  • OrderedDict用来实现更新最近访问的key  
  • """
    缓存剔除策略-LruCache
    """
    
    from collections import OrderedDict
    
    
    class LruCache(object):
        """
        当缓存空间不够用的时候,替换掉最近最少使用的对象
        """
        def __init__(self, capacity=8):
            self.od = OrderedDict()
            self.capacity = capacity
    
        def get(self, key):
            if key in self.od:
                val = self.od[key]
                self.od.move_to_end(key)  # 每次访问更新最新访问的key
                return val
            return -1
    
        def put(self, key, value):
            if key in self.od: # 更新k/v
                del self.od[key]
                self.od[key] = value # 更新key到表头
            else:  # insert
                self.od[key] = value
                if len(self.od) > self.capacity:  # 判断容量是否满了
                    self.od.popitem(last=False)
    
    
    def test():
    
        lru = LruCache()
        assert lru.get(1) == -1
        for idx, i in enumerate(range(8)):
            lru.put(idx, i)
    
        assert lru.get(2) == 2
        assert lru.get(7) == 7
        assert lru.get(0) == 0
    
        lru.put(9, 6)
        assert lru.get(9) == 6
    View Code

     

  

posted @ 2020-05-11 21:27  Ming|Zhao  阅读(216)  评论(0)    收藏  举报