数组占据随机访问的优点,却有须要连续内存的缺点。算法
链表具备可不连续存储的优点,但访问查找是线性的。数组
散列表和链表、跳表的混合使用,是为告终合数组和链表的优点,规避它们的不足。缓存
咱们能够得出数据结构和算法的重要性排行榜:连续空间 > 时间 > 碎片空间。数据结构
所以散列表和链表会一块儿来使用。数据结构和算法
LRU缓存淘汰算法优化
以前用链表实现,它的时间复杂度是O(n)。 利用散列表和链表能够优化到O(1)。指针
hnext指针是为了链接散列表中的冲突链表; prev和next指针是双向链表的前继和后继指针。cdn
这样在查询、插入、删除操做的时间复杂度都是O(1)。对象
Redis有序集合blog
对学生(id、name、score)对象数据集合进行一下操做:
这时就能够结合散列表、双向链表、跳表来实现。 使用双向链表对学生对象以score进行排序,结合跳表。在使用id做为key实现散列表。
iOS YYMemoryCache 利用散列表和双向链表实现内存缓存。 散列表的实现:直接使用系统提供CFMutableDictionaryRef