实现链表与哈希表相结合的快速表

设计可以变更的缓存结构:该结构在构造时确定大小,假设长度 len,且有两个功能:
int set(string key,int value):将记录(key,value)插入该结构
int get(string key):返回key对应的value
要求:

  1. set和get时间复杂度为O(1)
  2. 某个key的set/get操作一旦发生,认为这个key成为最常使用的(默认这一步也是O(1) )
  3. 当缓存大小超过k时,移除最不常用的记录。

思路:

第1点,set 和 get 的时间复杂度要为O(1),数组虽然可以实现 get O(1),但 set 则需要移动大量元素,无法满足,链表可以实现 set O(1),但 get 无法满足,但可以结合哈希表来进行辅助。同时可以看到关键字 key 的数据类型为字符串,所以需要选用字符串到无符号整型的哈希算法。

第2点,某个key的 set 和 get 使用后列为最常用,则仅在尾部 set,同时将 get 操作的节点移动到尾位置即可。但对于 O(1) 的移动,由于需要定位待移动节点的前继节点,但又不能采用从头节点往后依次查询的方法(复杂度 > O(1)),则只能采用双向链表

第3点,超过k时移除最不常用,则可借鉴队列的思想,尾部插入,头部删除即可,所以时刻有两个指针,一个指向头节点,一个指向尾节点。

静态链表作为一种特殊的数组结构,结合哈希表应该也可以实现,等以后有时间再试吧...

C++实现:https://download.csdn.net/download/jack__linux/12826378

1 结构

首先需要根据思路,需要构建两种结构:(1)链表结构 List;(2)哈希表 HashTable

对于链表,可以设计其节点结构如下:(1)关键字 key,用于存放字符串;(2)值 value;(3)pre 指针,指向该节点的前继;(4)next 指针,指向该节点的后继。 

图1 链表的节点结构

程序表示为:

typedef struct Node
{
    char *ke
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值