一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情。
前言
散列表由于它的高效率的查找时间,被应用在很多的算法上,也可以用来解决许多方面的问题,首先它会和链表进行搭配起来,实现多个高效的数据结构,今天我们就来了解一下其中的应用实现。
散列表的应用——LRU缓存淘汰算法
LRU缓存淘汰算法是一种主流的缓存算法实现。但是基于链表的缓存算法存在局限性,我们通过维护一个按照访问时间从最早到最晚排序的链表的数据结构,缓存具有一个固定的大小,当缓存的空间不足时,我们需要删除一个数据的时候,直接把链表的头结点删除即可。当需要缓存一个数据的时候,我们需要在缓存链表中查找这个数据,如果没找到的话,直接放到链表的结尾处,如果找到对应的缓存元素的话,我们就把它移动到链表的结尾处。因为我们查找数据的时候需要遍历整个链表,所以时间复杂度高达O(n),这对于一个缓存来说,时间效率太慢了。所以我们可以使用散列表进行优化,将时间复杂度降到O(1),具体是怎么实现呢?
首先我们按照原先的双向链表维护着数据,增加一个特殊的字段hnext,我们遍历整个链表的结点数据,使用散列函数将它们都插入到链表中,假如散列冲突了,使用拉链法,就是使用hnext字段记录自己的下一个结点。使用这种方式维护了两个数据结构关系。当我们查找数据的时候,就可以借助散列表的高效查找就可以迅速查找到对应的缓存数据了。然后就在双向链表关系上进行移动元素即可。删除也是如此。
总结
在数据结构中,我们可以结合多种数据结构来形成一个组合数据结构,提供一个高效的操作,避免单个结构下存在的缺点,但是与之而来的就是结构的复杂性提升。